本文主要是介绍arm-linux内核start_kernel之前启动分析(2)- 页表的准备,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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, physadd \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, r4mov r3, #0add r6, r0, #PG_DIR_SIZE
1: str r3, [r0], #4str r3, [r0], #4str r3, [r0], #4str r3, [r0], #4teq r0, r6bne 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, r4add r3, r4, #0x1000 @ first PMD table addressorr r3, r3, #3 @ PGD block typemov r6, #4 @ P
这篇关于arm-linux内核start_kernel之前启动分析(2)- 页表的准备的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!