挖坑网/填坑网 DebugDump Forum

别人挖坑默默填上,自己挖坑含泪填上。天下没有填不了的坑,只有不会填坑的人。来吧,加入我们,挖坑行,填坑你更行! 站长QQ: 516333132 点击这里给我发消息

您尚未登录。

#1 2018-06-05 18:09:29

xinxiaoci
会员
注册时间: 2018-04-18
累计发帖: 68

MMU 的概念及原理

《单片机小白转嵌入式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 变换后的虚拟地址。

离线

快速回复

填写内容后点击按钮提交

页脚