《单片机小白转嵌入式Linux学习记录,基于S3C2440----目录》
地址映射 MMU
当N个应用APP运行时
1. 它们同时保存在SDRAM 中
2. 它们的地址各不行同
链接地址 = 程序运行时所处的地址
所以在编写某个APP时要需要单独的指定他的链接地址,对于一两个应用,我们还可以手动去指定链接地址,但是对于一个开放的操作系统,有成百上千的应用,由不同的开发者编写,我们是不可能预测和重定位所有的APP位置,所以要引入虚拟地址,让所有的APP都位于相同的虚拟地址来执行。
MMU负责虚拟地址与物理地址之间的转换
CPU -> MMU -> 地址总线 -> SDRAM/GPIO
MMU 的作用:
1. 让不同的APP以相同的链接地址进行编译和运行
2. 让大于SDRAM容量的APP可以运行,根据APP运行的局部性分段执行
3. 权限管理,APP1 只能访问APP1 对应的地址,保证应用程序不越界,及整个系统给的正常运行。
MMU 的使用:
1. 在内存中创建页表
2. 把页表基址告诉MMU
3. 设置CP15 启动 MMU
以一级也表为例
一级页表的中的每个条目对应 1M 的内存空间,这个条目称之为描述符(段描述符、粗页表描述符、细页表描述符)。
一级页表描述详见 s3c2410 P560
段描述符为例:
base address AP Domain C B
base address: 对应物理地址
AP 和 Domain: 对应权限管理
C 和 B : 对应CACHE 和 write buffer
权限管理:
a. 完全不允许访问
b. 允许系统模式访问,不允许用户模式访问
c. 用户模式下根据描述符的AP值决定怎么访问
域 的概念:
CP15 -> C3 32bit 每两位控制一个域 共 0-15 16个域
表示4中权限:
00 无访问权限 如果想让一段内存无法访问,将页表描述符中domain 设置为对应的域号 0-15 然后将对应的域设置为00
01 客户模式 使用页表描述符中的 AP + S + R 来确定权限,具体见韦老师书本7.1.3 最后一个表格。
10 保留
11 管理模式 可以访问,不进行 AP S R 权限检查
注:AP来自描述符 S R 来自 CP15 -> C1
进程切换时需要切换到对应的虚拟地址,由于系统有众多APP进程,所以这个切换开销非常大,由硬件来实现 CP15 -> C13
CPU -> 虚拟地址(VA) -> CP15 : C13 -> 变换后的虚拟地址(MVA) -> MMU -> 得到物理地址(PA)
我们常说的虚拟地址一般都是指CP15:C13进程变换后的虚拟地址 MVA
CP15:C13 的变换关系:
if(VA<32M)
MVA = VA|(PID<<25) ;
else
MVA = VA ;
解决了频繁构造页表的问题。
假如有两个进程 APP1 APP2 链接地址都是 0x80b4 (链接地址即运行时地址 0x80b4 是虚拟地址VA),PID 分别为 1 和 2;运行地址一般都小于32M。
1. 当CPU运行APP1时,发出VA 0x80b4
MVA = VA|(1<<25) 对应的页表指向 APP1所在的实际物理地址。
2. 当CPU运行APP2时,发出VA 0x80b4
MVA = VA|(2<<25) 对应的页表指向 APP2所在的实际物理地址。
这样进程1 切换到进程2 只需要切换PID即可,不需要重新创建页表,从而提升切换效率。
MMU、CACHE等看到的都是MVA(变换后的虚拟地址),而不是编译链接地址(或运行时地址) VA(链接虚拟地址),我们提到的虚拟地址默认都是MVA 变换后的虚拟地址。
离线