要实现中断向量重映射,我们需至少将地址0开始的1MB地址映射到0x3000 0000开始的地址上.因为我们现在只使用段描述符.我们现在要实现的虚拟地址与物理地址的对应关系为
VA PA
0x0000 0000-0x000f ffff 0x3000 0000 -0x300f ffff
0x3000 0000-0x31ff ffff 0x3000 0000--0x31ff ffff
其它地址则都不可访问.
我们让可以访问的内存分为域0 不可访问的内存空间为其他(如域1),并在CP15 Reg3中设置的相应的域控制属性。
同样,我们设定TTB为0x3000 0000,可访问的段的属性为 0x01e 不可访问的段的属性为0x03e
这样我们的转换表初始化如下:
0x3000 0000 上的数据为 0x3000 001e 1
0x3000 0004 -0x3000 0BFC 0x0010 003e -0x2ff0 003e 767
0x3000 0C00 0x3000 0C7C 0x3000 001e-0x31f0 001e 32
0x3000 0C80-0x3000 3ffc 0x3200 003e-0xfff0 003e 3296个入口 总共4096个入口
假设中断向量地址为 0x0000 0014 则该对就的物理地下由以下方法算出:
虚拟地址展开为
31 |
30 |
|
|
|
|
|
|
|
|
|
20 |
19 |
|
|
|
|
|
|
12 |
11 |
10 |
9 |
8 |
|
|
5 |
4 |
3 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
它转换时先取得虚拟地的 31:20位,在此为:0x000
然后根据TTB+(0x000<<2)=0x3000 0000 取得转换入口的内存地址,
然后得到这个地址上的数据:0x3000 001e 因此这个段基址为 0x300
最后,段基址<<20位,再并上虚拟地址的19:0得出物理地址:0x3000 0014
于是得出物理地址:0x3000 0014