<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • x
    x

    linux內核啟動解析(五)

    發布時間:2012-4-1 09:59    發布者:李寬
    關鍵詞: linux
    freshtree

    1.5 __enable_mmu()

           在建好一頁表之后,后面有幾句這樣的代碼:

           ldr   r13, __switch_data        @ address to jump to after

                                              @ mmu has been enabled

           adr   lr, __enable_mmu          @ return (PIC) address

           add  pc, r10, #PROCINFO_INITFUNC

           最后一句是跳轉到處理器初始化函數執行。我們的處理器是armv6,所以處理器初始化函數可在arch/arm/mm/pro_v6.S中找到:

    ENTRY(cpu_v6_proc_init)

           mov pc, lr

           OK,到這里就知道,目的就是跳轉到__enable_mmu()函數執行。至于r13,另有他用,在__enable_mmu()函數的最后可以看到。

           建立好一級頁表后,這時我們就可以打開MMU,就可以放心大膽地使用虛擬地址了。使能MMU的代碼如下:

    __enable_mmu:

    #ifdef CONFIG_ALIGNMENT_TRAP

           orr   r0, r0, #CR_A

    #else

           bic   r0, r0, #CR_A

    #endif

    #ifdef CONFIG_CPU_DCACHE_DISABLE

           bic   r0, r0, #CR_C

    #endif

    #ifdef CONFIG_CPU_BPREDICT_DISABLE

           bic   r0, r0, #CR_Z

    #endif

    #ifdef CONFIG_CPU_ICACHE_DISABLE

           bic   r0, r0, #CR_I

    #endif

           mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \

                        domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \

                        domain_val(DOMAIN_TABLE, DOMAIN_MANAGER) | \

                        domain_val(DOMAIN_IO, DOMAIN_CLIENT))

           mcr p15, 0, r5, c3, c0, 0             @ load domain access register

           mcr p15, 0, r4, c2, c0, 0             @ load page table pointer

           b     __turn_mmu_on

    ENDPROC(__enable_mmu)



    __turn_mmu_on:

           mov r0, r0

           mcr p15, 0, r0, c1, c0, 0             @ write control reg

           mrc p15, 0, r3, c0, c0, 0             @ read id reg

           mov r3, r3

           mov r3, r3

           mov pc, r13

    ENDPROC(__turn_mmu_on)

          

           這段代碼很簡單,就是把一級頁表的基地址放到CP15的c2中,然后打開MMU。執行到最后,把r13賦值給pc,就是跳轉到__swtich_data處執行。
    1.6 __mmap_switched()

           我們可以在arch/arm/kernel/head-common.S找到__switch_data的定義:

    __switch_data:

           .long       __mmap_switched

           .long       __data_loc                    @ r4

           .long       __data_start                  @ r5

           .long       __bss_start                   @ r6

           .long       _end                            @ r7

           .long       processor_id                 @ r4

           .long       __machine_arch_type           @ r5

           .long       __atags_pointer                    @ r6

           .long       cr_alignment                 @ r7

           .long       init_thread_union + THREAD_START_SP @ sp



           可見標號__switch_data的值就等同于__mmap_switched()函數的指針地址。__mmap_switch()函數定義如下:

    __mmap_switched:

           adr   r3, __switch_data + 4



           ldmia       r3!, {r4, r5, r6, r7}

           cmp r4, r5                           @ Copy data segment if needed

    1:     cmpne     r5, r6

           ldrne       fp, [r4], #4

           strne       fp, [r5], #4

           bne  1b



           mov fp, #0                           @ Clear BSS (and zero fp)

    1:     cmp r6, r7

           strcc       fp, [r6],#4

           bcc  1b



           ldmia       r3, {r4, r5, r6, r7, sp}

           str   r9, [r4]                  @ Save processor ID

           str   r1, [r5]                  @ Save machine type

           str   r2, [r6]                  @ Save atags pointer

           bic   r4, r0, #CR_A               @ Clear 'A' bit

           stmia       r7, {r0, r4}                   @ Save control register values

           b     start_kernel

    ENDPROC(__mmap_switched)

           這段代碼很簡單,就是拷貝數據到數據段;清BSS;然后保存處理器ID,機器類型和atag指針到內存的相應位置(因為接下來既要跳到c語言環境執行了,必須要把之前有意義的寄存器加以保存);跳轉到start_kernel()函數,進入操作系統環境。
    本文地址:http://www.portaltwn.com/thread-88594-1-1.html     【打印本頁】

    本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
    您需要登錄后才可以發表評論 登錄 | 立即注冊

    廠商推薦

    • Microchip視頻專區
    • EtherCAT®和Microchip LAN925x從站控制器介紹培訓教程
    • MPLAB®模擬設計器——在線電源解決方案,加速設計
    • 讓您的模擬設計靈感,化為觸手可及的現實
    • 深度體驗Microchip自動輔助駕駛應用方案——2025巡展開啟報名!
    • 貿澤電子(Mouser)專區

    相關視頻

    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷