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

本文详细解析了 Linux 内核版本 4.8.11 中 MMU(内存管理单元)的开启过程,通过具体汇编指令分析了如何为特定代码段创建身份映射,并介绍了从虚拟地址到物理地址的转换流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

【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这段代码地址建立页表自己的一点点理解。

先记下来吧。

 

转载于:https://www.cnblogs.com/ojssuo/p/6155139.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值