首页 > 代码库 > "arch/arm/kernel/head.S"里面一点片段的理解

"arch/arm/kernel/head.S"里面一点片段的理解

 

【linux-4.8.11】

 

__turn_mmu_on_loc:
359 .long .
360 .long __turn_mmu_on
361 .long __turn_mmu_on_end

 

* Create identity mapping to cater for __enable_mmu.
228 * This identity mapping will be removed by paging_init().
229 */
230 adr r0, __turn_mmu_on_loc                   ;获得__turn_mmu_on_loc的相对地址,这儿是 .,r0保存__turn_mmu_on_loc的物理地址
231 ldmia r0, {r3, r5, r6}                       ;取得r0, r0+4, r0+8为地址里的变量值,保存至r3, r5, r6中,

                                   ;即__turn_mmu_on_loc下的.的链接地址,__turn_mmu_on的链接地址,__turn_mmu_on_end的链接地址
232 sub r0, r0, r3 @ virt->phys offset                ;求得链接地址到物理地址之间的偏移差值(此处物理地址大于链接地址)

233 add r5, r5, r0 @ phys __turn_mmu_on             ;求得__turn_mmu_on_on的物理地址
234 add r6, r6, r0 @ phys __turn_mmu_on_end           ;求得__turn_mmu_on_end的物理址
235 mov r5, r5, lsr #SECTION_SHIFT                ;对两物理地址右移20位,取高12位,作为存入页表的高12位
236 mov r6, r6, lsr #SECTION_SHIFT
237
238 1: orr r3, r7, r5, lsl #SECTION_SHIFT @ flags + kernel base  ;r7存有mm_mmuflags,r5左移20位,或上mm_mmuflags,存入r3,即为应该要存入页表的值
239 str r3, [r4, r5, lsl #PMD_ORDER] @ identity mapping      ;存入页表,这里链接地址=物理地址,指定页表(页表基址r4)偏移r5(此为物理地址的高12位)左移2位(页表每一页为4字节)
240 cmp r5, r6                            ;比较是否到达__turn_mmu_on_end
241 addlo r5, r5, #1 @ next section                 ;r5加上1,即1M
242 blo 1b                              ;当r5<r6时,循环

 

这里对__turn_mmu_on_loc这段代码地址建立页表自己的一点点理解。

先记下来吧。

 

"arch/arm/kernel/head.S"里面一点片段的理解