国产毛片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://m.qingdxww.cn/thread-88593-1-1.html     【打印本頁】

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

廠商推薦

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

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产午夜一区二区在线观看 | 在线观看麻豆精品国产不卡 | 韩国免费人成在线观看网站 | 一级做性色a爰片久久毛片 一级做性色a爱片久久片 | 在线播放色 | 日韩欧免费一区二区三区 | 九九精品视频在线 | 成人免费在线视频 | 久久精品亚瑟全部免费观看 | 在线观看亚洲网站 | 在线观看麻豆精品国产不卡 | 久久精品影院永久网址 | www.亚洲免费 | 一级毛片黄色片 | 色综合网址 | 四虎影视国产精品亚洲精品hd | 丁香六月欧美 | 天堂在线最新版资源www | 国产精品国产三级国产在线观看 | 99re国产视频 | 成人黄色免费 | 亚洲社区在线观看 | 色综合久久久高清综合久久久 | 成年网站未满十八禁毛片免费 | 日韩免费高清专区 | 国产一区二区成人 | 老鸭窝欧美一级一区二区 | 亚洲福利一区二区三区 | 果冻天美a∨传媒 | 九色视屏 | 在线免费观看a视频 | 久久婷婷丁香 | 亚洲精品在线第一页 | 在线中文字幕一区 | 久久青草国产手机看片福利盒子 | 四虎影视国产在线观看精品 | 一级特黄a视频 | 中文在线不卡 | 国产香蕉在线视频 | www.日本高清视频.com | 亚洲日本中文字幕区 |