国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

linux內核啟動解析(四)

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

1.4 __create_page_tables()

       __create_page_tables()函數同樣也是位于arch/arm/kernel/head.S中,代碼如下:

__create_page_tables:

       pgtbl       r4                         @ page table address



       /*

        * Clear the 16K level 1 swapper page table

        */

       mov r0, r4

       mov r3, #0

       add  r6, r0, #0x4000

1:     str   r3, [r0], #4

       str   r3, [r0], #4

       str   r3, [r0], #4

       str   r3, [r0], #4

       teq   r0, r6

       bne  1b



       ldr   r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags



       /*

        * 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

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

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



       /*

        * Now setup the pagetables for our kernel direct

        * mapped region.

        */

       add  r0, r4,  #(KERNEL_START & 0xff000000) >> 18

       str   r3, [r0, #(KERNEL_START & 0x00f00000) >> 18]!

       ldr   r6, =(KERNEL_END - 1)

       add  r0, r0, #4

       add  r6, r4, r6, lsr #18

1:     cmp r0, r6

       add  r3, r3, #1 << 20

       strls r3, [r0], #4

       bls   1b



#ifdef CONFIG_XIP_KERNEL

       /*

        * Map some ram to cover our .data and .bss areas.

        */

       orr   r3, r7, #(KERNEL_RAM_PADDR & 0xff000000)

       .if    (KERNEL_RAM_PADDR & 0x00f00000)

       orr   r3, r3, #(KERNEL_RAM_PADDR & 0x00f00000)

       .endif

       add  r0, r4,  #(KERNEL_RAM_VADDR & 0xff000000) >> 18

       str   r3, [r0, #(KERNEL_RAM_VADDR & 0x00f00000) >> 18]!

       ldr   r6, =(_end - 1)

       add  r0, r0, #4

       add  r6, r4, r6, lsr #18

1:     cmp r0, r6

       add  r3, r3, #1 << 20

       strls r3, [r0], #4

       bls   1b

#endif



       /*

        * Then map first 1MB of ram in case it contains our boot params.

        */

       add  r0, r4, #PAGE_OFFSET >> 18

       orr   r6, r7, #(PHYS_OFFSET & 0xff000000)

       .if    (PHYS_OFFSET & 0x00f00000)

       orr   r6, r6, #(PHYS_OFFSET & 0x00f00000)

       .endif

       str   r6, [r0]



#ifdef CONFIG_DEBUG_LL

       ldr   r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags

       /*

        * Map in IO space for serial debugging.

        * This allows debug messages to be output

        * via a serial console before paging_init.

        */

       ldr   r3, [r8, #MACHINFO_PGOFFIO]

       add  r0, r4, r3

       rsb   r3, r3, #0x4000                    @ PTRS_PER_PGD*sizeof(long)

       cmp r3, #0x0800                  @ limit to 512MB

       movhi     r3, #0x0800

       add  r6, r0, r3

       ldr   r3, [r8, #MACHINFO_PHYSIO]

       orr   r3, r3, r7

1:     str   r3, [r0], #4

       add  r3, r3, #1 << 20

       teq   r0, r6

       bne  1b

#if defined(CONFIG_ARCH_NETWINDER) || defined(CONFIG_ARCH_CATS)

       /*

        * If we're using the NetWinder or CATS, we also need to map

        * in the 16550-type serial port for the debug messages

        */

       add  r0, r4, #0xff000000 >> 18

       orr   r3, r7, #0x7c000000

       str   r3, [r0]

#endif

#ifdef CONFIG_ARCH_RPC



       add  r0, r4, #0x02000000 >> 18

       orr   r3, r7, #0x02000000

       str   r3, [r0]

       add  r0, r4, #0xd8000000 >> 18

       str   r3, [r0]

#endif

#endif

       mov pc, lr

ENDPROC(__create_page_tables)

這段代碼是用來建立一級頁表的。這個初始頁表是給接下來要運行的kernel代碼用的。因為內核代碼用的都是虛擬地址,在使用之前我們必須要建立MMU。這里的MMU只需要建立的頁表能識別內核代碼這部分的虛擬地址就夠了,也就是從KERNEL_START到KERNEL_END部分。

#define KERNEL_RAM_VADDR   (PAGE_OFFSET + TEXT_OFFSET)

#define KERNEL_RAM_PADDR   (PHYS_OFFSET + TEXT_OFFSET)



#if (KERNEL_RAM_VADDR & 0xffff) != 0x8000

#error KERNEL_RAM_VADDR must start at 0xXXXX8000

#endif



       .globl      swapper_pg_dir

       .equ swapper_pg_dir, KERNEL_RAM_VADDR - 0x4000



       .macro    pgtbl, rd

       ldr   \rd, =(KERNEL_RAM_PADDR - 0x4000)

       .endm



#ifdef CONFIG_XIP_KERNEL

#define KERNEL_START      XIP_VIRT_ADDR(CONFIG_XIP_PHYS_ADDR)

#define KERNEL_END  _edata_loc

#else

#define KERNEL_START      KERNEL_RAM_VADDR

#define KERNEL_END  _end

#endif

從上述代碼我們可以看出,KERNEL_START就是c0008000,KERNEL_END等于_end。_end我們可以從vmlinux.lds.S中找到蹤跡。

另外需要強調的是,這里建立的MMU 頁表是一級頁表的,是以1M為單位的;二級頁表(4K)不是在這里建立的。Arm一級頁表的轉換關系如下:

  從上圖可以看出,一級頁表描述符的內容是物理地址段(物理地址前12位)和一些MMU管理位合成的;一級頁表描述符的地址是由頁表地址基地址(31-14位)和虛擬地址前12位(31-20)合成的,它的最后兩位都是零,滿足32位地址對齊的方式。

建立一級頁表的過程就是將每一個一級頁表描述符(1M為單位)填入到每一個一級頁表描述符的地址。
本文地址:http://www.qingdxww.cn/thread-88593-1-1.html     【打印本頁】

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

廠商推薦

  • Microchip視頻專區
  • 想要避免發生災難,就用MPLAB SiC電源仿真器!
  • 你仿真過嗎?使用免費的MPLAB Mindi模擬仿真器降低設計風險
  • 更佳設計的解決方案——Microchip模擬開發生態系統
  • 我們是Microchip
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成年片黄大全 | 久久99久久精品视频 | 亚洲青草视频 | 91在线导航| 视频在线一区二区三区 | 国产 欧美 日韩在线 | 精品视频在线观看 | 亚洲国产成人精品一区91 | 日韩精品中文字幕一区二区三区 | 男女做视频网站免费观看 | 蜜柚在线观看免费高清 | 亚洲影院在线播放 | 欧美黑寡妇高清一级在线观看 | 国产一级毛片午夜福 | 久久久久久久久久免观看 | 亚洲男人的天堂久久无 | 白丝袜护士水好多好紧白丝 | 精品国偷自产在线 | 亚洲六月丁香色婷婷综合久久 | 国产女人水多毛片18 | 微拍秒拍99福利精品小视频 | 日韩精品在线播放 | 久久久一区二区三区不卡 | 200款禁用软件免费下载安卓 | 国产精品国产三级国产爱网 | 国产高清在线看免费视频观 | 卡通动漫亚洲综合 | 侠盗高飞在线观看免费完整版 | 国产精品不卡视频 | 国产1区2区在线观看 | 亚洲欧美在线观看一区二区 | 在线观看国产精美视频 | 精品99视频 | 国产伦久视频免费观看 视频 | 四虎在线精品观看免费 | 欧美一级日韩在线观看 | 日本精品久久久久久久 | 中文 日本 免费 高清 | 黄色片久久久 | 亚洲六月丁香色婷婷综合久久 | 蜜桃臀久久伊人福利 |