Src/Bootloader/Eboot/boot.bib的memeory部分如下:
MEMORY
; Name Start Size Type
; ------- -------- -------- ----
ARGS 80020800 00000800 RESERVED
RAM 80021000 0000B000 RAM
STACK 8002c000 0000A000 RESERVED
EBOOT 80038000 00040000 RAMIMAGE
BINFS 80080000 00021000 RESERVED
针对这个配置,我记得在CSDN上有一个帖子提过这样一个问题(http://topic.csdn.net/u/20100729/17/273faa20-c905-435b-a7d4-102bbac4ff40.html):
0x3000_0000~0x3002_8000内存是用来做什么的?
后来我在WINCE600/PLATFORM/DEVICEEMULATOR/SRC/BOOTLOADER/EBOOT/boot.bib看到的memory部分如下:
MEMORY
; Name Start Size Type
; ------- -------- -------- ----
PTS 80000000 00020000 RESERVED
ARGS 80020000 00000800 RESERVED
SLEEPSTATE 80020800 00000800 RESERVED
EBOOT 80021000 00040000 RAMIMAGE
STACK 80061000 00004000 RESERVED
RAM 80065000 00006000 RAM
可以看出0x3000_0000~0x3002_0000内存是用于PTS的,什么是PTS呢?PTS是page table space的缩写,也即这段内存空间是用于存放页表的。
我们接下来看看S3C2443的/Src/Bootloader/Eboot/startup.s下面的代码
; Define RAM space for the Page Tables:
;
PHYBASE EQU 0x30000000 ; physical start
PTs EQU 0x30010000 ; 1st level page table address (PHYBASE + 0x10000)
; save room for interrupt vectors.
可以看出bootloader的startup函数构造的页表是存放在SDRAM的0x30010000开始的地址处,接着我们看看starup.s下面的代码
; 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
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结合g_oalAddressTable表,我们知道bootloader的startup函数所构造的页表首先需要覆盖0x80000000~0x9FFFFFFF范围的虚拟内存地址空间。这块虚拟内存空间纵容量是512MB,则对应着512个一级页表(对于WINCE操作系统而言,bootloader的虚拟内存设计并不是很复杂,它不涉及较为复杂的二级页表,只使用已1MB为单位的一级页表。),那么所需物理存储空间为2KB(因为需要4个字节来保存一个页表项),在S3C2443中实际使用的SDRAM地址为0x30012000~0x300127FF。此外startup函数还要为0xA000000~0xBFFFFFFF范围的虚拟内存地址构造一级页表项,这块虚拟内存地址空间在WINCE中被称作uncachable静态虚拟内存空间,这一部分的一级页表项占用SDRAM的0x30012800~0x30012FFF。
但关于页表是如何构建的,我目前不是很理解,需要继续学习。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chinesedragon2010/archive/2010/08/08/5796534.aspx