Wince EBoot 建立一级页表的疑问????

lzbit 2011-09-02 10:42:52
Wince EBoot 建立一级页表的疑问, 第一个页表项为0x80000000虚拟地址对应的页表项, PTs为0x3001000。
转换原理 得到它的页表项位置为 (0x80000000>>18) + PTs = 0x2000+0x30010000 = 0x30012000
但下面的代码有点不理解,一开始就为什么要加0x2000呢
;==============这里为什么要加0x2000????===================
代码如下:

add r10, r10, #0x2000 ; (r10) = ptr to 1st PTE for "unmapped space"


g_oalAddressTable
DCD 0x80000000, 0x30000000, 64 ; 64 MB DRAM BANK 6

下面是部分代码:
; Compute physical address of the OEMAddressTable.
20 add r11, pc, #g_oalAddressTable - (. + 8)
ldr r10, =PTs ; (r10) = 1st level page table


; Setup 1st level page table (using section descriptor)
; Fill in first level page table entries to create "un-mapped" regions
; from the contents of the MemoryMap array.
;
; (r10) = 1st level page table
; (r11) = ptr to MemoryMap array

;==============这里为什么要加0x2000===================
add r10, r10, #0x2000 ; (r10) = ptr to 1st PTE for "unmapped space"
mov r0, #0x0E ; (r0) = PTE for 0: 1MB cachable bufferable
orr r0, r0, #0x400 ; set kernel r/w permission
25 mov r1, r11 ; (r1) = ptr to MemoryMap array


30 ldr r2, [r1], #4 ; (r2) = virtual address to map Bank at
ldr r3, [r1], #4 ; (r3) = physical address to map from
ldr r4, [r1], #4 ; (r4) = num MB to map

cmp r4, #0 ; End of table?
beq %f40

ldr r5, =0x1FF00000
and r2, r2, r5 ; VA needs 512MB, 1MB aligned.

ldr r5, =0xFFF00000
and r3, r3, r5 ; PA needs 4GB, 1MB aligned.

;==============这里虚拟地址已经右移了18===============
add r2, r10, r2, LSR #18
add r0, r0, r3 ; (r0) = PTE for next physical page
...全文
100 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzbit 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 northcan 的回复:]


ldr r10, =PTs ; (r10) = 1st level page table
此时r10是1st level page table的虚拟地址。

add r10, r10, #0x2000 ; (r10) = ptr to 1st PTE for "unmapped space"
r10现在是1st PTE虚拟地址对应的页表的存储地址。

因为
0x2000是0x……
[/Quote]

你注意一下我贴的代码 中有======符的说明,我的意思是为什么,下面已经 LSR #18 为什么前面还要要加0x2000
woshi_ziyu 2011-09-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 northcan 的回复:]


ldr r10, =PTs ; (r10) = 1st level page table
此时r10是1st level page table的虚拟地址。

add r10, r10, #0x2000 ; (r10) = ptr to 1st PTE for "unmapped space"
r10现在是1st PTE虚拟地址对应的页表的存储地址。

因为
0x2000是0x……
[/Quote]

+++++++++++++、、

学习了
northcan 2011-09-02
  • 打赏
  • 举报
回复

ldr r10, =PTs ; (r10) = 1st level page table
此时r10是1st level page table的虚拟地址。

add r10, r10, #0x2000 ; (r10) = ptr to 1st PTE for "unmapped space"
r10现在是1st PTE虚拟地址对应的页表的存储地址。

因为
0x2000是0x80000000>>18的结果
1级页表将4GB的地址空间分为4096个页表项
因为wince的一级页表是1MB大小
ARM地址映射时,虚拟地址分为高位+低位
高14位表示虚拟地址对应的页表针对页表首地址的偏移值(段索引)
低18位表示在一个页表项内的1MB地址空间中的偏移值(段内偏移)
(称1MB地址空间为一个段,这里是借用X86的概念,ARM没有段寄存器)

lzbit 2011-09-02
  • 打赏
  • 举报
回复
那位高人指点指点,谢谢!
paul_chao 2011-09-02
  • 打赏
  • 举报
回复
印象中沒記錯的話, 應是要建立 VA 0x80000000 ~ 0xBFFFFFFF 之間的 Static Mapping Area.
所以 PTs + 0x2000 ~ 02003 就是代表 0x80000000 ~ 0x800FFFFF 這 1 MB 的 MMU Descriptor.

(0x80000000 / 1MB) * 4 = 0x2000 (不錯, 兜出來了)

細節請參考 ARM920T 的 Data Sheet 即可.

Paul, Chao @ Techware
lzbit 2011-09-02
  • 打赏
  • 举报
回复
......有人回一下没

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧