compressed/head.s __setup_mmu

转载地址:https://blog.csdn.net/coldsnow33/article/details/37904799
  1. __setup_mmu: sub r3, r4, #16384 @ Page directory size,r3 = 0x20004000

  2. bic r3, r3, #0xff @ Align the pointer

  3. bic r3, r3, #0x3f00

  4. @ 这里r4中存放着内核执行地址,将16K的一级页表放在这个内核执行地址下面的16K空间里,

  5. @ 上面通过 sub r3, r4, #16384 获得16K空间后,

  6. @ 又将页表的起始地址进行16K对齐放在r3中。即ttb的低14位清零。

  7.  
  8. /*

  9. * Initialise the page tables, turning on the cacheable and bufferable

  10. * bits for the RAM area only.

  11. */

  12. mov r0, r3 @ r0 = 0x20004000

  13. mov r9, r0, lsr #18 @ r9 = 0x2000

  14. mov r9, r9, lsl #18 @ start of RAM,r9 = 0x20000000,先>>18,后<<18,就是256K对齐

  15. add r10, r9, #0x10000000 @ a reasonable RAM size,r10 = 0x30000000,0x10000000==256M

  16. @ 上面这几行把一级页表的起始地址保存在r0中,并通过r0获得一个ram起始地址(256K对齐),

  17. @ 并从这个起始地址开始的256M ram空间对应的描述符的C和B位均置”1”,

  18. @ r9和r10中存放了这段内存的起始地址和结束地址。

  19.  
  20. mov r1, #0x12 @ XN|U + section mapping

  21. @ 一级描述符的bit[1:0]为10,表示这是一个section描述符。

  22. @ bit[4]为1,

  23. @ 此时bit[8:5]均为0,选择了D0域。

  24.  
  25. orr r1, r1, #3 << 10 @ AP=11,r1 = 0xC12

  26. @ 一级描述符的AP(access permission bits) bit[11:10]为11,

  27. @ 即all access types permitted in both modes

  28. @ bit[31:20]为physical address,为0

  29.  
  30. add r2, r3, #16384 @ r2 = 0x20008000

  31. @ 一级描述符表(页表)的结束地址存放在r2中。

  32.  
  33. 1: cmp r1, r9 @ if virt > start of RAM

  34. cmphs r10, r1 @ && end of RAM > virt

  35. bic r1, r1, #0x1c @ clear XN|U + C + B

  36. orrlo r1, r1, #0x10 @ Set XN|U for non-RAM

  37. orrhs r1, r1, r6 @ set RAM section settings

  38. str r1, [r0], #4 @ 1:1 mapping

  39. add r1, r1, #1048576@ == 0x100000 = 1M

  40. teq r0, r2 @ r0==r2时,不在jump 1处执行,此时r1=4G=0

  41. bne 1b

  42. /* case 1:

  43. 1: cmp r1, r9 @ if virt > start of RAM

  44. cmphs r10, r1 @ && end of RAM > virt

  45. bic r1, r1, #0x1c @ clear XN|U + C + B

  46. orrlo r1, r1, #0x10 @ Set XN|U for non-RAM

  47. */

  48. /* case 2:

  49. 1: cmp r1, r9 @ if virt > start of RAM

  50. bic r1, r1, #0x1c @ clear XN|U + C + B

  51. orrlo r1, r1, #0x10 @ Set XN|U for non-RAM

  52. */

  53. /* case 3:

  54. 1: cmp r1, r9 @ if virt > start of RAM

  55. cmphs r10, r1 @ && end of RAM > virt

  56. bic r1, r1, #0x1c @ clear XN|U + C + B

  57. orrhs r1, r1, r6 @ set RAM section settings

  58. */

  59. @ r1 &= ~0x1c

  60.  
  61. @ 1->r1 |= 0x10

  62. @ r10 end 0x300000000

  63. @ 2->r1 |= r6,r1 |= 0x0d,在256M范围内

  64. @ r9 start 0x20000000

  65. @ 3->r1 |= 0x10

  66. @ 上面这段就是对一级描述符表(页表)的初始化,

  67. @ 首先比较这个描述符所描述的地址是否在那个256M的空间中,如果在则这个描述符对应的内存区域是 cacheable ,bufferable。

  68. @ 如果不在则noncacheable, nonbufferable。

  69. @ 然后将描述符写入一个一级描述符表(页表)的入口,并将一级描述符表(页表)入口地址加4,而指向下一个1M section的基地址。

  70. @ 如果页表入口未初始化完,则继续初始化。

  71. @ 一级描述符结构如下:

  72. @ 31 20 19 12 11 10 9 8 5 4 3 2 1 0

  73. @ 物理地址的基址 0 AP 0 域 1 C B 1 0

  74. @ || 1:1映射

  75. @ ||

  76. @ 0 <=> 0~(1M-1)

  77. @ 1 <=> 1M~(2M-1)

  78. @ 2 <=> 2M~(3M-1)

  79. @ 4095 <=> (4G-1M)~(4G-1)

  80. @ 一级描述符表(页表)的高12位是每个setcion的基地址,可以描述4096个section。

  81. @ 一级页表大小为16K,每个页表项,即描述符占4字节,刚好可以容纳4096个描述符,

  82. @ 所以这里就映射了4096*1M = 4G的空间。

  83.  
  84. /*

  85.  
  86. * If ever we are running from Flash, then we surely want the cache

  87. * to be enabled also for our execution instance... We map 2MB of it

  88. * so there is no map overlap problem for up to 1 MB compressed kernel.

  89. * If the execution is in RAM then we would only be duplicating the above.

  90. */

  91. /*

  92. */

  93. orr r1, r6, #0x04 @ ensure B is set for this

  94. orr r1, r1, #3 << 10

  95. @ 这两行是设置AP和B

  96.  
  97. mov r2, pc

  98. mov r2, r2, lsr #20

  99. orr r1, r1, r2, lsl #20

  100. @ 将当前地址1M对齐,并与r1中的内容结合形成一个描述当前指令所在section的描述符。

  101.  
  102. add r0, r3, r2, lsl #2

  103. @ r3为刚建立的一级描述符表(页表)的起始地址0x20004000。

  104. @ 将当前地址(pc)的高12位左移两位(形成14位索引)与r3中的地址

  105. @ (低14位为0)相加形成一个4字节对齐的地址

  106. @ 这个地址也在16K的一级描述符表(页表)内,r0的[31:14]为0,所以该地址<2^14=16K。

  107. @ 当前地址对应着描述符(貌似这就是一个一级描述符)在一级描述符表(页表)中的位置,这个位置之前已经初始化过了。

  108. @ 对于从ram中运行这里只是又重新设置了一次,从flash中运行,会多映射2MB

  109. @ 一级页表中索引为r2左移2位。

  110. @ r0地址结构如下:

  111. @ 31 14 13 2 1 0

  112. @ 页表基址 页表index 0 0

  113. @ r0里存储的描述符格式如下:

  114. @ 31 20 19 12 11 10 9 8 5 4 3 2 1 0

  115. @ PC高12bit 0 AP 0 域 1 C B 1 0

  116.  
  117. str r1, [r0], #4

  118. add r1, r1, #1048576

  119. str r1, [r0]

  120. @ 这里将上面形成的描述符及其连续的下一个section描述

  121. @ 写入上面4字节对齐地址处

  122.  
  123. mov pc, lr

  124. ENDPROC(__setup_mmu)

mcrne	p15, 0, r3, c2, c0, 0	@ load page table pointer,r3 = 0x20004000

MMU的段页表的虚拟地址与物理地址的转换过程

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值