start_kernel 函数之前的汇编代码运行过程

本文详细介绍了Linux 2.6.14.1版本在arm架构下,`start_kernel`函数执行前的汇编代码过程,包括创建页表、设置内存映射以及初始化CPU相关配置,如MMU、缓存和数据段。
摘要由CSDN通过智能技术生成

linux-2.6.14.1/arch/arm/kernel/head.S

 

    .type  __create_page_tables, %function

__create_page_tables:

    ldr r5, [r8, #MACHINFO_PHYSRAM] @ physram

    /*

       #define S3C2410_CS6 (0x30000000) //arch-s3c2410/map.h

       #define S3C2410_SDRAM_PA    (S3C2410_CS6) 

       r5 为系统物理内存基地址

       r8 = machine info       (struct machine_desc的基地址)

       #define MACHINFO_PHYSRAM 4

    */

    pgtbl  r4, r5            @ page table address

    /*

       .macro pgtbl, rd, phys

       adr /rd, stext

       sub /rd, /rd, #0x4000

       .endm

    */

    //stext表示内核解压缩后在ram中的起始位置(即0x30008000

    //r4寄存器中保存着页表基址在物理内存中的起始地址(0x30004000

    //ram接在片选6上,其起始地址为0x30000000,即页表基址在片选6的第16K   位置处

 

    /*

     * Clear the 16K level 1 swapper page table

     */

    mov r0, r4

    mov r3, #0

    add r6, r0, #0x4000   //页表在物理内存中的未端地址,即0x30004000 + 16K

1:  str r3, [r0], #4

    str r3, [r0], #4

    str r3, [r0], #4

    str r3, [r0], #4

    teq r0, r6            //循环将0x30004000--0x30008000间的16K页表内容清零

    bne 1b

 

    ldr r7, [r10, #PROCINFO_MMUFLAGS]   @ mmuflags

    /*

        #define PROCINFO_MMUFLAGS   8

       r10 = procinfo    (struct proc_info_list的基地址)

    */

 

    /*

     * Create identity mapping for first MB of kernel to

     * cater for the MMU enable.  This identity mapping

     * will be removed by paging_init().  We use our current program

     * counter to determine corresponding section base address.

     */

    mov r6, pc, lsr #20          @ start of kernel section

    /*

       r6 = 0x300 = 768

    */

    orr r3, r7, r6, lsl #20      @ flags + kernel base

    str r3, [r4, r6, lsl #2]     @ identity mapping

    /*

       r4 + r6 * 4 = 0x30004000 + 0x300 * 4

       即表示页表的第r6(768)表项【r4是页表在物理内存中的基地址】

       r6 << 200x30008000即解压后的内核在物理内存中的首地址

       所以页表的第768项所映射的物理内存地址为0x30008000

    */

 

    /*

     * Now setup the pagetables for our kernel direct

     * mapped region.  We round TEXTADDR down to the

     * nearest megabyte boundary.  It is assumed that

     * the kernel fits within 4 contigous 1MB sections.

     */

    add r0, r4,  #(TEXTADDR &

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值