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标号中“.”存到x2。cpu_table存到x3,x2,x3里存储的都是虚拟地址



    sub x1, x1, x2          // get offset between VA and PA。这里有歧义,x1是物理地址,x2是虚拟地址。所以这里是PA-VA,不是VA-PA

    add x3, x3, x1          // convert VA to PA。这里x3是VA,加上PA-VA得出x3的PA

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

【解答】关于内核中没开MMU之前的虚拟地址物理地址转换问题的更多相关文章

  1. Linux内核中流量控制

    linux内核中提供了流量控制的相关处理功能,相关代码在net/sched目录下:而应用层上的控制是通过iproute2软件包中的tc来实现, tc和sched的关系就好象iptables和netfi ...

  2. [php-src]理解Php内核中的函数与INI

    内容均以php-5.6.14为例. 一. 函数结构 内核中定义一个php函数使用 PHP_FUNCTION 宏 包装,扩展也不例外,该宏在 ./main/php.h:343 有着一系列类似以 PHP ...

  3. 转:内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages

    在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcalloc.get_free_pages;当然,设备驱动程序也不例外;对于提供了MMU功能的处理 ...

  4. 关于内核中spinlock的一些个人理解 【转】

    由于2.6内核可以抢占,应该在驱动程序中使用 preempt_disable() 和 preempt_enable(),从而保护代码段不被抢占(禁止 IRQ 同时也就隐式地禁止了抢占).preempt ...

  5. 内核中的多点触摸协议文档 Multi【转】

    转自:http://www.arm9home.net/read.php?tid=24754 前段时间改写了一个GT801的内核驱动,仔细阅读 MT Event 上报的时候,发现这个驱动是针对 Andr ...

  6. 内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages【转】

    转自:http://www.cnblogs.com/yfz0/p/5829443.html 在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcal ...

  7. 【转】内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages

    转自:https://www.cnblogs.com/yfz0/p/5829443.html 在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kca ...

  8. TCP/IP协议栈在Linux内核中的运行时序分析

    网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...

  9. [php-src]窥探Php内核中的变量

    内容均以php-5.6.14为例. 在看各种组合数据类型之前,有必要先熟悉下 Zend/zend_types.h 里面的自定义数据类型. #ifndef ZEND_TYPES_H // 防止多次 in ...

随机推荐

  1. sqlserver存储过程及易错点

    create PROCEDURE [dbo].[xiao_adduser] @username NVARCHAR(), @password NVARCHAR(), @adddate DATETIME ...

  2. POSIX扩展正则表达式函数

    1.ereg()函数和eregi()函数 函数语法: bool ereg/eregi ( string pattern, string string [, array regs] ) 函数功能: 在字 ...

  3. NAND FLASH特性说明

    1.NAND FLASH 的特殊性. 1)存在坏块.由于NAND生产工艺的原因,出厂芯片中会随机出现坏块.坏块在出厂时已经被初始化,并在特殊区域中标记为不可用,在使用过程中如果出现坏块,也需要进行标记 ...

  4. Bluetooth 2.1+EDR是什么

    目前应用最为广泛的是 Bluetooth 2.0+EDR标准,该标准在2004年已经推出,支持Bluetooth 2.0+EDR标准的产品也于2006年大量出现.虽然Bluetooth 2.0+EDR ...

  5. oracle在一个字符串中查找某个字符出现过几次

    SELECT LENGTH(REGEXP_REPLACE(REPLACE('123,45,6,5', ',', '@'),  '[^@]+',  '')) COUNT FROM DUAL; 返回结果为 ...

  6. Min Stack (LeetCode) tweak it to avoid Memory Limit Exceeded

    class MinStack { public: void push(int x) { if(values.empty()) { values.push_back(x); min_indices.pu ...

  7. svn在linux下的使用(svn命令行)ubuntu 删除 新增 添加 提交 状态查询 恢复

    合并步骤:(1)先切换到分支:(2)svn merge trunk . (3)svn sw trunk (4)svn merge --reintegrate branch . svn merge ht ...

  8. Android中自己定义组件和它的属性

    好长时间没有更新博客了.本来想积累点有深度的东西发,但一直没有找到非常好的点.所以.写一些基础的东西.就当积累吧. Android开发中难免会用到自己定义的组件.以下以ImageButton为例来介绍 ...

  9. frame.origin.x 的意思和作用?

    frame.origin.x 的意思和作用? scrollView.frame 一个view的frame 包含它的矩形形状(size)的长和宽. 和它在父视图中的坐标原点(origin)x和y坐标 f ...

  10. c++栈管理库TCMalloc、jeMalloc

    示例:http://blog.csdn.net/chosen0ne/article/details/9338591