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. Scala学习之延迟绑定

    package com.swust.example object TraitDemo2 extends App{ //抽象类 abstract class Writer { def writeMess ...

  2. LINQ to Entity Framework 操作符(转)

    在开始了解LINQ to Entities之前,需要先对.NET Framework 3.5版本后对C#语言的几个扩展特性做一些阐释,这有助于我们更容易.更深刻的理解LINQ to Entities技 ...

  3. 一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217)

    一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217) 浏览效果: http://www.beyond630.com/jqu ...

  4. 对discuz的代码分析学习(二)首页文件

    如果当前地址栏存在查询字符,并且是一个数字,条件成立. 查询字符:www.baidu.com/index.php?aaa=bbb              aaa=bbb就是查询字符如果条件成立,则把 ...

  5. [Java]使用队列求解josephus问题

    约瑟夫斯问题(有时也称为约瑟夫斯置换),是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环. 有个囚犯站成一个圆圈,准备处决.首先从一个人开始,越过个人(因为第一个人已 ...

  6. ash, bash, ksh, csh, zsh

    /bin/bash (就是 Linux 预设的 shell, 是现在很多Linux的发行版中默认的shell,综合了其他shell的很多优点.)/bin/ksh (Kornshell 由 AT& ...

  7. Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分

    本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 在前一篇文章 Windows Azure 上Linux VM 中的交换空间第 1 部分中,我介绍了在默认情况下, ...

  8. DOM ISO - get current element's XPATH

    DOM ISO - get current element's XPATH DOM ISO - get current element's XPATH

  9. 通过浏览器直接打开Android应用程序

    需求 通过手机浏览器直接打开Android应用程序.假设本地已经安装了指定Android应用,就直接打开它:假设没有安装,则直接下载该应用的安装文件(也能够跳转到下载页面). 实现效果 假设手机上已经 ...

  10. Linux新手笔记 sudo

    centos 6.4 32bit 你是也像我一样,厌烦了在root用户和个人用户之间来回切换.或者干脆直接用root用户.可以这样设置,然后在命令前加sudo 即可使用自己到密码,临时用root身份执 ...