最新帖子 精华区 社区服务 会员列表 统计排行
主题 : Tiny4412裸机程序之mmu
admin 离线
级别: 管理员
UID: 1
精华: 1
发帖: 999
金币: 526 个
银元: 488 个
铜钱: 7878 个
技术分: 601 个
在线时间: 742(时)
注册时间: 2010-04-21
最后登录: 2018-09-21
楼主  发表于: 2015-11-03   

Tiny4412裸机程序之mmu

管理提醒: 本帖被 admin 从 阶段1讨论区 移动到本区(2016-11-20)
内存管理单元MMU,负责虚拟地址到物理地址的转换,并提供硬件进制的内存访问权限检查,操作系统通过MMU可以实现各个用户进程自己独立的地址空间,
通过内存权限的检查可以保证每个进程使用的内存不被其他进程破坏。具体操作系统怎么运用MMU的就比较复杂了,我们只看看最原始的裸机程序怎么配置寄存器
操作MMU建立虚拟地址到物理地址映射,了解其原理。
ARM提供4种映射长度:段(1M),大页(64K),小页(4K),极小页(1k)
按1M的长度映射就是说一段1M的虚拟地址映射一段1M的物理地址,这1M的地址访问权限是一样的,明显如果按1k,4k映射,内存访问权限将控制的更精细,当然也更复杂。
我们看看1M的精度怎么映射,假设要映射虚拟地址范围(0x0~0x4000000)到物理地址范围(0xB0000000~0xB4000000), 每0x100000的地址长度是1M,那么范围就是64M.
这个映射是以1M对齐的,就是要已(0x0~0x100000)这样映射,而不能(0x1~0x100001),可以看出虚拟地址和物理地址低20位变化是一样的,这样我们只需要一个4byte的内存空间
存放每1M的虚拟地址右移20后与物理地址右移20位建立映射,总共4*64byte。代码大致如下:
unsigned long va = 0x0;
unsigned long pa = 0xB0000000;
while(va<0x4000000){
    ttb[va >> 20] = pa | 2;
     va += 0x100000;
     pa += 0x100000;
}
这样给定一个虚拟地址0x3000400,右移20作为ttb的index就可以找到其后12位对应的物理地址0xB3000000+0x400就是物理地址,当然这样运算是mmu自己做的,我们只需要把ttb的
内存地址附给mmu的寄存器。上面的过程叫建立页表,页表建完后,启动MMU,我们操作的就是虚拟地址了。启动MMU是操作cp15协处理器,下面代码会有说明,了解下。
下面的例子我们用虚拟地址来点led.
描述
快速回复

如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
认证码:

验证问题:
printf("%d", 73)
按"Ctrl+Enter"直接提交