最近研究 OBM, OBM 里为了支持中断, 需要把中断入口放在 0 地址, 但是 pxa 平台 DDR 内存物理地址在 0x80000000, 怎么办呢? 使用虚拟地址!
简单研究了一下 OBM 物理地址到虚拟地址的转换过程。比较有意思。 这里简单介绍一下。
Pxa 平台有内置 SRAM (这里称为 A 地址空间),对应物理地址 0x5c013000, 以及 外置 DDR RAM(这里称为 B 地址空间), 对应地址 0x80000000. 于是, OBM 将A 地址映射到同样的虚拟地址:0x5c0130000, 而将 B 地址映射到 0x0虚拟地址。
|
物理地址 |
虚拟地址 |
A地址空间 |
0x5c013000 |
0x5c013000 |
B地址空间 |
0x80000000 |
0 |
一开始, OBM 代码存在于 A 地址, OBM 在地址映射后, 将自己拷贝到 B 物理地址, 然后打开 MMU, 再跳转到 B 虚拟地址。
然后就一直在虚拟地址中执行。。。
当 OBM 要运行下一个 IMAGE 时, 需要退出虚拟地址, 这时, 它会拷贝一段代码到 A 地址, 然后跳转到 A 地址执行拷贝过去的代码。 该代码会关闭 MMU 并跳转到下一个 IMAGE。
就像设计模式一样, 这里也应该是一个模式: 打开 MMU 时, 需要有一个重叠映射的地址空间。