【解答】关于内核中没开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标号中“.”存到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之前的虚拟地址物理地址转换问题的更多相关文章
- Linux内核中流量控制
linux内核中提供了流量控制的相关处理功能,相关代码在net/sched目录下:而应用层上的控制是通过iproute2软件包中的tc来实现, tc和sched的关系就好象iptables和netfi ...
- [php-src]理解Php内核中的函数与INI
内容均以php-5.6.14为例. 一. 函数结构 内核中定义一个php函数使用 PHP_FUNCTION 宏 包装,扩展也不例外,该宏在 ./main/php.h:343 有着一系列类似以 PHP ...
- 转:内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages
在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcalloc.get_free_pages;当然,设备驱动程序也不例外;对于提供了MMU功能的处理 ...
- 关于内核中spinlock的一些个人理解 【转】
由于2.6内核可以抢占,应该在驱动程序中使用 preempt_disable() 和 preempt_enable(),从而保护代码段不被抢占(禁止 IRQ 同时也就隐式地禁止了抢占).preempt ...
- 内核中的多点触摸协议文档 Multi【转】
转自:http://www.arm9home.net/read.php?tid=24754 前段时间改写了一个GT801的内核驱动,仔细阅读 MT Event 上报的时候,发现这个驱动是针对 Andr ...
- 内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages【转】
转自:http://www.cnblogs.com/yfz0/p/5829443.html 在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcal ...
- 【转】内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages
转自:https://www.cnblogs.com/yfz0/p/5829443.html 在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kca ...
- TCP/IP协议栈在Linux内核中的运行时序分析
网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...
- [php-src]窥探Php内核中的变量
内容均以php-5.6.14为例. 在看各种组合数据类型之前,有必要先熟悉下 Zend/zend_types.h 里面的自定义数据类型. #ifndef ZEND_TYPES_H // 防止多次 in ...
随机推荐
- jquery选择器结果是数组时需要主要的一个问题
代码很简单,如下 <div id="div1"> <span>111</span> <span>222</span> & ...
- Let's Format Css Documents
每次想参考一些好看网站的时候,打开css文档都是一行的,琢磨了下就自己写了块短短的代码,各路Java大神别笑我呀.^_^ 复制粘贴控制台的输出就好了.(瞬间觉得跟上大神的脚步了←_←) package ...
- PHP合并数组+与array_merge的区别分析
主要区别是两个或者多个数组中如果出现相同键名,键名分为字符串或者数字,需要注意 1)键名为数字时,array_merge()不会覆盖掉原来的值,但+合并数组则会把最先出现的值作为最终结果返回,而把后面 ...
- zoj 2587 Unique Attack 最小割判定
题目链接 让你判断最小割是否唯一. 判断方法是, 先求一遍最大流, 然后从源点dfs一次, 搜索未饱和边的数目. 从汇点dfs一次, 同样也是搜索未饱和边的数目, 看总和是否等于n. 如果等于n那么唯 ...
- WireShark抓包时TCP数据包出现may be caused by ip checksum offload
最近用WireShark抓包时发现TCP数据包有报错:IP Checksum Offload,经过查阅资料终于找到了原因 总结下来就是wireshark抓到的数据包提示Checksum错误,是因为它截 ...
- 快排 quicksort 快速排序
首先看这个 http://www.cnblogs.com/morewindows/archive/2011/08/13/2137415.html 看完后就没有什么不理解的了... PS 注意 凡是在一 ...
- PCB板常用知识简介——沉金板VS镀金板
一.PCB板表面处理: 抗氧化,喷锡,无铅喷锡,沉金,沉锡,沉银,镀硬金,全板镀金,金手指,镍钯金 OSP: 成本较底,可焊性好,存储条件苛刻,时间短,环保工艺.焊接好 .平整 . 喷锡:喷锡板一般 ...
- rsyslog 直接读取日志,当日志截断后,不会继续发送
rsyslog web机器上日志被截断,那么就不会发送到rsyslog服务器 因为imfile记录了offset,然后你直接>导致offset还没到
- sql 分割字符串 存储过程
默认是用 , 分割,如有需要可以自己更改 我写的是 循环插入数据 存储过程,也可以自己改成 方法使用 存储过程: ),@jrid int) as begin declare @location int ...
- set up blog on github
http://www.ruanyifeng.com/blog/2012/08/blogging_with_jekyll.html