arm-linux内核start_kernel之前启动分析(2)- 页表的准备

本文详细分析了在Linux内核start_kernel之前,如何在ARM平台上初始化页表,包括平映射的原因、内核镜像加载地址的选择以及ATAGS的线性映射。讨论了开启MMU前后地址转换的重要性,并解释了不同映射的必要性。
摘要由CSDN通过智能技术生成

arm-linux内核start_kernel之前启动分析另外2篇博文链接地址如下:

http://blog.csdn.net/skyflying2012/article/details/41344377

http://blog.csdn.net/skyflying2012/article/details/48054417


今天接着第一篇继续分析,不过今天只分析stext中一条汇编,如下:

    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
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值