arm-linux内核start_kernel之前启动分析另外2篇博文链接地址如下:
http://blog.csdn.net/skyflying2012/article/details/41344377
http://blog.csdn.net/skyflying2012/article/details/48054417
bl __create_page_tables
kernel版本:3.4.55
看看kernel启动初期,开启MMU之前如何初始化页表。此处分析过程我都写在对应的代码处,方便查看。
#ifdef CONFIG_ARM_LPAE
/* LPAE requires an additional page for the PGD */
#define PG_DIR_SIZE 0x5000
#define PMD_ORDER 3
#else
#define PG_DIR_SIZE 0x4000
#define PMD_ORDER 2
#endif
.....
.macro pgtbl, rd, phys
add \rd, \phys, #TEXT_OFFSET - PG_DIR_SIZE
.endm
.....
__create_page_tables:
//据上篇博文分析,r8存储着sdram的物理起始地址(我的板子0x80000000)
//pgtbl宏获取0x80008000之下16K的地址空间作为页表空间
//arm页表一页是4 bytes,完成虚拟地址空间4GB中1MB的映射,
//一共需要4 x 4096 bytes的页表空间
//可以看出,单页完成的是虚拟地址和物理地址高12位的转换。
//低20位的地址(1M内的地址)偏移是一致的。
pgtbl r4, r8 @ page table address
/*
* Clear the swapper page table
*/
//按照16bytes一页将16K页表空间清空
mov r0, r4
mov r3, #0
add r6, r0, #PG_DIR_SIZE
1: str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
str r3, [r0], #4
teq r0, r6
bne 1b
//如果定义CONFIG_ARM_LPAE,在PGD与PMD之前还要再加一级页表,这里不详解这种情景
#ifdef CONFIG_ARM_LPAE
/*
* Build the PGD table (first level) to point to the PMD table. A PGD
* entry is 64-bit wide.
*/
mov r0, r4
add r3, r4, #0x1000 @ first PMD table address
orr r3, r3, #3 @ PGD block type
mov r6, #4 @ P