打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
MMU问题集锦

1. 内核没开MMU之前有虚拟地址吗?没有MMU哪来的虚拟地址?

答:有,因为加载时地址和运行时地址不同导致的没打开MMU之前也会有虚实地址问题。

2. 加载时地址和运行时地址什么区别,为什么有这种区别?

答:加载时地址:把可执行文件放到物理内存的内存地址,例如把镜像放到0x80000000地址处,则加载时地址=0x80000000

运行时地址:镜像生成后的虚拟地址,由编译器和连接脚本决定。

内核镜像放到内存中时,放置的地址是任意的,所以要考虑到这种情况,在没打开mmu之前使用内存中的数据都要计算偏移

以下代码是ARMv8linux内核的head.S节选,可以很好的说明没开MMU之前的虚实地址转换问题:

ENTRY(lookup_processor_type)
    adr x1, __lookup_processor_type_data //x1=
当前PC的值 + 与标号__lookup_processor_type_data之间的偏移量,即x1存储的是相对于当前PC                             __lookup_processor_type_data地址值,这里的pc是物理地址。在开了mmu之后,所有的pc都是虚拟地址。

    ldp x2, x3, [x1] //
把下面__lookup_processor_type_data标号中“.”存到x2cpu_table存到x3x2x3里存储的都是虚拟地址

    sub x1, x1, x2          // get offset between VA and PA
,这里有歧义,x1是物理地址,x2是虚拟地址,所以这里是PA-VA,不是VA-PA
    add x3, x3, x1          // convert VA to PA
,这里x3VA,加上PA-VA得出x3PA
1:

    ldp w5, w6, [x3]            // load cpu_id_val and cpu_id_mask

    cbz w5, 2f              // end of list?
    and w6, w6, w0
    cmp w5, w6
    b.eq    3f  
    add x3, x3, #CPU_INFO_SZ
    b   1b  
2:
    mov x3, #0              // unknown processor
3:
    mov x0, x3
    ret 
ENDPROC(lookup_processor_type)

 
    .align  4
    .type   __lookup_processor_type_data, %object
__lookup_processor_type_data:
    .quad   .    //"."
代表当前虚拟地址,上面adr那条指令计算的x1是当前这条指令的物理地址,ldp那条指令中的x2是虚拟地址,所以sub计算出来的是PA-VA

    .quad   cpu_table

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
S3C2440的内存管理单元MMU--大小页地址转换
[精彩] arm linux kernel 从入口到start_kernel 的代码分析 - ChinaUnix.net
Memery Management in Linux Kernel
piaoxiang
内存管理单元MMU概述
[转]Android arm linux kernel启动流程(二)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服