免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2485 | 回复: 0
打印 上一主题 下一主题

[内存管理] 关于__create_page_tables的一点疑问。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-11-21 15:48 |只看该作者 |倒序浏览
函数的流程如图所示:

我的疑问:我认为在内核映像的直接映射的时候,就已经把物理地址第1MB的内存映射了,那为什么还要再次对物理内存的第1MB进行影射呢?

代码如下:
1、内核映像所占区域映射
  1.         /*
  2.          * Now setup the pagetables for our kernel direct
  3.          * mapped region.
  4.          */
  5.         mov        r3, pc
  6.         mov        r3, r3, lsr #SECTION_SHIFT
  7.         orr        r3, r7, r3, lsl #SECTION_SHIFT
  8.         add        r0, r4,  #(KERNEL_START & 0xff000000) >> (SECTION_SHIFT - PMD_ORDER)
  9.         str        r3, [r0, #((KERNEL_START & 0x00f00000) >> SECTION_SHIFT) << PMD_ORDER]!
  10.         ldr        r6, =(KERNEL_END - 1)
  11.         add        r0, r0, #1 << PMD_ORDER
  12.         add        r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER)
  13. 1:        cmp        r0, r6
  14.         add        r3, r3, #1 << SECTION_SHIFT
  15.         strls        r3, [r0], #1 << PMD_ORDER
  16.         bls        1b
复制代码
2、物理地址空间第1MB映射到线性地址0xc0000000第1MB
  1.         /*
  2.          * Then map boot params address in r2 or the first 1MB (2MB with LPAE)
  3.          * of ram if boot params address is not specified.
  4.          */
  5.         mov        r0, r2, lsr #SECTION_SHIFT
  6.         movs        r0, r0, lsl #SECTION_SHIFT
  7.         moveq        r0, r8
  8.         sub        r3, r0, r8
  9.         add        r3, r3, #PAGE_OFFSET
  10.         add        r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER)
  11.         orr        r6, r7, r0
  12.         str        r6, [r3]
复制代码
整个函数代码如下:
  1. __create_page_tables:
  2.         pgtbl        r4, r8                                @ page table address

  3.         /*
  4.          * Clear the swapper page table
  5.          */
  6.         mov        r0, r4
  7.         mov        r3, #0
  8.         add        r6, r0, #PG_DIR_SIZE
  9. 1:        str        r3, [r0], #4
  10.         str        r3, [r0], #4
  11.         str        r3, [r0], #4
  12.         str        r3, [r0], #4
  13.         teq        r0, r6
  14.         bne        1b

  15. #ifdef CONFIG_ARM_LPAE
  16.         /*
  17.          * Build the PGD table (first level) to point to the PMD table. A PGD
  18.          * entry is 64-bit wide.
  19.          */
  20.         mov        r0, r4
  21.         add        r3, r4, #0x1000                        @ first PMD table address
  22.         orr        r3, r3, #3                        @ PGD block type
  23.         mov        r6, #4                                @ PTRS_PER_PGD
  24.         mov        r7, #1 << (55 - 32)                @ L_PGD_SWAPPER
  25. 1:        str        r3, [r0], #4                        @ set bottom PGD entry bits
  26.         str        r7, [r0], #4                        @ set top PGD entry bits
  27.         add        r3, r3, #0x1000                        @ next PMD table
  28.         subs        r6, r6, #1
  29.         bne        1b

  30.         add        r4, r4, #0x1000                        @ point to the PMD tables
  31. #endif

  32.         ldr        r7, [r10, #PROCINFO_MM_MMUFLAGS] @ mm_mmuflags

  33.         /*
  34.          * Create identity mapping to cater for __enable_mmu.
  35.          * This identity mapping will be removed by paging_init().
  36.          */
  37.         adr        r0, __turn_mmu_on_loc
  38.         ldmia        r0, {r3, r5, r6}
  39.         sub        r0, r0, r3                        @ virt->phys offset
  40.         add        r5, r5, r0                        @ phys __turn_mmu_on
  41.         add        r6, r6, r0                        @ phys __turn_mmu_on_end
  42.         mov        r5, r5, lsr #SECTION_SHIFT
  43.         mov        r6, r6, lsr #SECTION_SHIFT

  44. 1:        orr        r3, r7, r5, lsl #SECTION_SHIFT        @ flags + kernel base
  45.         str        r3, [r4, r5, lsl #PMD_ORDER]        @ identity mapping
  46.         cmp        r5, r6
  47.         addlo        r5, r5, #1                        @ next section
  48.         blo        1b

  49.         /*
  50.          * Now setup the pagetables for our kernel direct
  51.          * mapped region.
  52.          */
  53.         mov        r3, pc
  54.         mov        r3, r3, lsr #SECTION_SHIFT
  55.         orr        r3, r7, r3, lsl #SECTION_SHIFT
  56.         add        r0, r4,  #(KERNEL_START & 0xff000000) >> (SECTION_SHIFT - PMD_ORDER)
  57.         str        r3, [r0, #((KERNEL_START & 0x00f00000) >> SECTION_SHIFT) << PMD_ORDER]!
  58.         ldr        r6, =(KERNEL_END - 1)
  59.         add        r0, r0, #1 << PMD_ORDER
  60.         add        r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER)
  61. 1:        cmp        r0, r6
  62.         add        r3, r3, #1 << SECTION_SHIFT
  63.         strls        r3, [r0], #1 << PMD_ORDER
  64.         bls        1b

  65. #ifdef CONFIG_XIP_KERNEL
  66.         /*
  67.          * Map some ram to cover our .data and .bss areas.
  68.          */
  69.         add        r3, r8, #TEXT_OFFSET
  70.         orr        r3, r3, r7
  71.         add        r0, r4,  #(KERNEL_RAM_VADDR & 0xff000000) >> (SECTION_SHIFT - PMD_ORDER)
  72.         str        r3, [r0, #(KERNEL_RAM_VADDR & 0x00f00000) >> (SECTION_SHIFT - PMD_ORDER)]!
  73.         ldr        r6, =(_end - 1)
  74.         add        r0, r0, #4
  75.         add        r6, r4, r6, lsr #(SECTION_SHIFT - PMD_ORDER)
  76. 1:        cmp        r0, r6
  77.         add        r3, r3, #1 << 20
  78.         strls        r3, [r0], #4
  79.         bls        1b
  80. #endif

  81.         /*
  82.          * Then map boot params address in r2 or the first 1MB (2MB with LPAE)
  83.          * of ram if boot params address is not specified.
  84.          */
  85.         mov        r0, r2, lsr #SECTION_SHIFT
  86.         movs        r0, r0, lsl #SECTION_SHIFT
  87.         moveq        r0, r8
  88.         sub        r3, r0, r8
  89.         add        r3, r3, #PAGE_OFFSET
  90.         add        r3, r4, r3, lsr #(SECTION_SHIFT - PMD_ORDER)
  91.         orr        r6, r7, r0
  92.         str        r6, [r3]

  93. #ifdef CONFIG_DEBUG_LL
  94. #if !defined(CONFIG_DEBUG_ICEDCC) && !defined(CONFIG_DEBUG_SEMIHOSTING)
  95.         /*
  96.          * Map in IO space for serial debugging.
  97.          * This allows debug messages to be output
  98.          * via a serial console before paging_init.
  99.          */
  100.         addruart r7, r3, r0

  101.         mov        r3, r3, lsr #SECTION_SHIFT
  102.         mov        r3, r3, lsl #PMD_ORDER

  103.         add        r0, r4, r3
  104.         mov        r3, r7, lsr #SECTION_SHIFT
  105.         ldr        r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags
  106.         orr        r3, r7, r3, lsl #SECTION_SHIFT
  107. #ifdef CONFIG_ARM_LPAE
  108.         mov        r7, #1 << (54 - 32)                @ XN
  109. #else
  110.         orr        r3, r3, #PMD_SECT_XN
  111. #endif
  112.         str        r3, [r0], #4
  113. #ifdef CONFIG_ARM_LPAE
  114.         str        r7, [r0], #4
  115. #endif

  116. #else /* CONFIG_DEBUG_ICEDCC || CONFIG_DEBUG_SEMIHOSTING */
  117.         /* we don't need any serial debugging mappings */
  118.         ldr        r7, [r10, #PROCINFO_IO_MMUFLAGS] @ io_mmuflags
  119. #endif

  120. #if defined(CONFIG_ARCH_NETWINDER) || defined(CONFIG_ARCH_CATS)
  121.         /*
  122.          * If we're using the NetWinder or CATS, we also need to map
  123.          * in the 16550-type serial port for the debug messages
  124.          */
  125.         add        r0, r4, #0xff000000 >> (SECTION_SHIFT - PMD_ORDER)
  126.         orr        r3, r7, #0x7c000000
  127.         str        r3, [r0]
  128. #endif
  129. #ifdef CONFIG_ARCH_RPC
  130.         /*
  131.          * Map in screen at 0x02000000 & SCREEN2_BASE
  132.          * Similar reasons here - for debug.  This is
  133.          * only for Acorn RiscPC architectures.
  134.          */
  135.         add        r0, r4, #0x02000000 >> (SECTION_SHIFT - PMD_ORDER)
  136.         orr        r3, r7, #0x02000000
  137.         str        r3, [r0]
  138.         add        r0, r4, #0xd8000000 >> (SECTION_SHIFT - PMD_ORDER)
  139.         str        r3, [r0]
  140. #endif
  141. #endif
  142. #ifdef CONFIG_ARM_LPAE
  143.         sub        r4, r4, #0x1000                @ point to the PGD table
  144. #endif
  145.         mov        pc, lr
  146. ENDPROC(__create_page_tables)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP