免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: fireaway7
打印 上一主题 下一主题

[其他] 逻辑地址、虚拟地址不解 [复制链接]

论坛徽章:
2
双鱼座
日期:2014-05-10 15:58:14未羊
日期:2014-05-18 11:36:43
11 [报告]
发表于 2014-05-10 13:16 |只看该作者
谢谢指点,之前确实很容易就把"内核和物理地址"、"用户和虚拟地址"对应起来了。而实际上是在内核进程、用户进程都会有虚拟地址物理地址转换,一个是简单的PAGE_OFFSET偏移,一个是分段、分页。这样理解的还有问题吗?


   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
12 [报告]
发表于 2014-05-10 13:36 |只看该作者
fireaway7 发表于 2014-05-10 13:16
谢谢指点,之前确实很容易就把"内核和物理地址"、"用户和虚拟地址"对应起来了。而实际上是在内核进程、用户 ...


可以这么理解,
不过内核只是在线性区的虚拟和物理偏移量才是PAGE_OFFSET - PHYS_OFFSET,而在非线性映射(如ioremap和vmalloc和kmap和dma_corherent等)的偏移量不是固定值(这种虚拟到物理的转换需要查页表),用户空间也是属于非线性映射


论坛徽章:
2
双鱼座
日期:2014-05-10 15:58:14未羊
日期:2014-05-18 11:36:43
13 [报告]
发表于 2014-05-10 14:33 |只看该作者
噢,高端内存管理时是非线性的吧?
前几天看到这篇文章:http://blog.csdn.net/zhengaw/article/details/4537070


   

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
14 [报告]
发表于 2014-05-10 14:34 |只看该作者
回复 13# fireaway7


    对,highmem是非线性的

论坛徽章:
0
15 [报告]
发表于 2014-06-01 14:49 |只看该作者
1.只有两种地址:物理地址,虚拟地址。(要么物理地址,要么非物理地址,也就是虚拟地址。逻辑地址是特殊的虚拟地址,它是内核的虚拟地址)
2.楼上问为啥内核的物理地址和虚拟地址要有page_offset偏移。那是因为内核在虚拟地址空间占高端地址,即3G-4G的地址。而在物理地址空间,也就是在物理内存中,它的地址又成了低端地址,即0-1G地址。所以从3-4G的虚拟地址向0-1G的物理地址转换时,就出现了一个3G的page_offset偏移。这个偏移就是这么来的。
3.需要注意下,只有内核的虚拟地址和物理地址是直接线性转换,即相差一个page_offset的偏移。用户程序的虚拟地址和物理地址之间转换不是线性转换,是通过页表转换的。用户程序的虚拟地址0-3G,物理地址是3-4G.这和内核的刚好互补。

论坛徽章:
2
双鱼座
日期:2014-05-10 15:58:14未羊
日期:2014-05-18 11:36:43
16 [报告]
发表于 2014-06-03 10:10 |只看该作者
你好,是下图表示的这样吗?

那麽在内核访问3-4G这段地址,怎么知道是从用户态映射过来的,还是内核本身在访问虚拟地址?
回复 15# sting99999


   

论坛徽章:
0
17 [报告]
发表于 2014-06-09 12:31 |只看该作者
回复 16# fireaway7


你的图我没有太看懂,我画了个图,你看看。


无论是内核还是用户态程序,它们所访问的都是虚拟地址,这个虚拟地址要经过mmu转换成物理地址,才能去命中内存。地址转换过程是硬件自动完成的,不需要人为去操作。也就是说程序员只关心虚拟地址。你问到内核访问3-4G空间,那么很明显,3-4G是内核的虚拟地址空间,那么硬件就直接减去page_offset这个值,就得到了内核的物理地址,然后去访问内存。用户程序的虚拟地址空间不会是3-4G的,而是0-3G的,所以你放心,不会引起紊乱。对于用户态程序,也就是当要访问0-3G虚拟地址空间的时候,就要通过用户进程的页表去转换。这些都是硬件完成的,不用人为干预。

论坛徽章:
0
18 [报告]
发表于 2014-06-09 13:50 |只看该作者
回复 17# sting99999

虚拟地址,线性地址,物理地址三个概念。
其中虚拟地址就是程序里面涉及到的所有的地址都是虚拟地址,然后通过段机制转成线性地址,Linux中的段机制使得虚拟地址和线性地址看起来是一样的了。
线性地址通过页机制转成物理地址。
从虚拟地址转成物理地址这几步全部都是由硬件完成的,无论内核还是用户空间的地址都是虚拟地址,程序运行时都是通过硬件转成物理地址的,也就是通过页表来转换的。
至于内核空间的部分地址是直接映射的,是内核里面方便计算物理地址等因素决定的,MMU不会管这些,MMU还是按照页表来转换的。


   

论坛徽章:
2
双鱼座
日期:2014-05-10 15:58:14未羊
日期:2014-05-18 11:36:43
19 [报告]
发表于 2014-06-11 09:12 |只看该作者
谢谢,之前10楼的小伙伴已经提示过我,不要把“虚拟地址”和用户对应起来、“物理地址”和内核对应起来,我又犯错了。回复 17# sting99999


   

论坛徽章:
2
双鱼座
日期:2014-05-10 15:58:14未羊
日期:2014-05-18 11:36:43
20 [报告]
发表于 2014-06-11 09:12 |只看该作者
谢谢指教,我明白了。回复 18# cu_philfrank


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP