MMU功能
- 权限管理
- 地址映射
权限管理
芯片在一个时间段只能有一个程序在跑,假设程序不同时间端分别运行程序A,程序B以及内核空间。
当A程序要去访问B程序或者内核空间时就会奔溃,这就是权限管理
地址映射
同时运行Hello1程序和Hello2程序,两个程序同时存在内存里面。设置Hello1程序中a=2,在Hello2中a=3,分别打印其地址和值,结果是两个a的地址相同,但其值是不一样的。同一个地址不可能存储两个不同的值。显然打印出来的地址称为虚拟地址,而实际存储着这两个数据的地址称为物理地址。运行时CPU肯定得通过虚拟地址转换成物理地址来获取物理地址上面的值,而这个从虚拟地址获取物理地址的过程,要经由MMU来完成。
存储管理器管的是跟硬件相关的行地址列地址之类相关的东西。
对于CPU核,不管是虚拟地址还是物理地址,如果用MMU,这个地址就可以理解成虚拟地址,不用则可以理解成物理地址。
写程序时的链接地址没有虚拟地址和物理地址的区别
虚拟地址(VA)怎么转换成物理地址(PA)
VA=f(PA) (某个函数)
在ARM里面,将虚拟地址转换成物理地址的方法是表格,从术语上来说是页表
映射的种类:段、大页、小页、极小页
段映射:表格里面每一个表项,对应的大小是1M,4G/1M=4096个表格项,第0个表格项映射0~1M的物理地址
实验目的:建立映射VA=>PA,看能否通过虚拟地址来访问物理地址,即通过访问XXXX来访问0x56000050
段映射单位是1M,0xA0000050(即上面的XXXX)/1M=0xA00=2560,我们要到2560这个表项里面把物理地址存进去,0XA0000050<=>0x56000050,通过取整可得0xA0000000对应的0x56000000
建立映射的过程
- 建立表格(建立虚拟地址到物理地址的映射)
- 把表格地址告诉MMU
- 启动MMU
head.S的内容如下所示:
.text
.global _start
_start:
ldr sp, =4096 @ 设置栈指针,以下都是C函数,调用前需要设好栈
bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启
bl memsetup @ 设置存储控制器以使用SDRAM
bl copy_2th_to_sdram @ 将第二部分代码复制到SDRAM
bl create_page_table