免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5233 | 回复: 23
打印 上一主题 下一主题

[内存管理] [X86]关于 逻辑地址 线性地址 物理地址 的讨论 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-21 10:00 |只看该作者 |倒序浏览
本帖最后由 niezhongbao 于 2013-08-27 16:48 编辑

是否可以这样理解,求高手指正:

printf("%p\n", p);打印出来的地址是一个段偏移地址么?我们程序操作的都是一个段偏移地址,
因为GDT表中的base都是0,所以这个偏移与线性地址相同,
所以linux管理的线性地址实际上是管理段偏移地址,
CPU每次寻址都要经过 以下这个过程么?
段选择符:段偏移--(查GDT表)-->线性地址--(查进程中pgd)-->物理地址



论坛徽章:
1
水瓶座
日期:2013-09-28 21:40:25
2 [报告]
发表于 2013-08-21 11:12 |只看该作者
跟我的理解一样,base设为0后段式,就相当于只有页式管理。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
3 [报告]
发表于 2013-08-21 13:08 |只看该作者
回复 1# niezhongbao
printf("%p\n", p);打印出来的地址是一个段偏移地址么?我们程序操作的都是一个段偏移地址,
因为GDT表中的base都是0,所以这个偏移与线性地址相同,
所以linux管理的线性地址实际上是管理段偏移地址,
CPU每次寻址都要经过 以下这个过程么?
段选择符:段偏移--(查GDT表)-->线性地址--(查进程中pgd)-->物理地址


理解基本正确

printf打印的值确切说应该叫逻辑地址。
由于linux下的段基地址都是0,所有线性地址=逻辑地址+0
然后根据页表,查找到线性地址对应的物理地址。

论坛徽章:
0
4 [报告]
发表于 2013-08-21 13:54 |只看该作者
回复 3# 瀚海书香

我的理解是:
一个逻辑地址由两部分组成,段标示符(即segment selector)和段内偏移组成的,
segment selector是保存在段寄存器里面的(cs, ds, gs等),
逻辑地址的表示是  segment selector : offset, 根据segment selector去查找GDT,
GDT中找到的base是0, 加上offset就是线性地址,所以感觉应该是这个offset与线性地址相等,
有的说linux的线性地址等于逻辑地址,
但是从这个关系逆向推理的话就让人糊涂了,或者这里理解的不对?


   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
5 [报告]
发表于 2013-08-21 14:38 |只看该作者
回复 4# niezhongbao

GDT中找到的base是0, 加上offset就是线性地址,所以感觉应该是这个offset与线性地址相等,
有的说linux的线性地址等于逻辑地址,
但是从这个关系逆向推理的话就让人糊涂了,或者这里理解的不对?

   
因为base=0,所有linux下线性地址就等于逻辑地址啊

论坛徽章:
0
6 [报告]
发表于 2013-08-21 14:48 |只看该作者
本帖最后由 niezhongbao 于 2013-08-21 14:50 编辑

回复 5# 瀚海书香

但是线性地址=base + offset,offset只是逻辑地址组成的一部分那,如果base 为0,应该是offset = 线性地址才对呀。


   

论坛徽章:
0
7 [报告]
发表于 2013-08-21 20:46 |只看该作者
逻辑地址的偏移量的值与相应的线性地址的值总是一致的

论坛徽章:
4
丑牛
日期:2014-01-11 15:11:12亥猪
日期:2014-12-15 22:19:092015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-03-13 19:45:11
8 [报告]
发表于 2013-08-22 20:25 |只看该作者
回复 3# 瀚海书香
我的理解和你稍有不同,我认为打印的是虚拟地址。

在编译链接时才回你用到逻辑地址,在重定位的过程中,逻辑地址会转化为相应的虚拟地址,这个转变可能由编译器完成或者装载器完成。

说的不对的地方还望多多指正。

   

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
9 [报告]
发表于 2013-08-23 07:39 |只看该作者
回复 8# 魔鬼的惊叹
我的理解和你稍有不同,我认为打印的是虚拟地址。

在编译链接时才回你用到逻辑地址,在重定位的过程中,逻辑地址会转化为相应的虚拟地址,这个转变可能由编译器完成或者装载器完成。


编译程序出来后,里面用到的地址应该是逻辑地址,有段的概念(比如代码段、数据段等等),这个应该没有异议吧。
机器语言指令中出现的内存地址,都是逻辑地址,需要转换成线性地址,再经过MMU(CPU中的内存管理单元)转换成物理地址才能够被访问到。所以说这里打印的应该是逻辑地址。

其实只要记住你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,Cpu不进行自动地址转换)。

虚拟地址(线性地址)=段地址+段内偏移(逻辑地址),由于linux的段地址为0,所以“虚拟地址(线性地址)=逻辑地址”

   

论坛徽章:
0
10 [报告]
发表于 2013-08-23 08:36 |只看该作者
本帖最后由 niezhongbao 于 2013-08-23 09:21 编辑

回复 9# 瀚海书香
回复 8# 魔鬼的惊叹

个人理解是,因为这个段偏移计算之后与线性地址相同,所以操作这个段偏移实际上就是在操作线性地址,
但是说逻辑地址等于线性地址这个理解不上去,
逻辑地址是CPU根据段寄存器中的段选择符和段偏移计算出来的,是运行过程中的地址。

要不然这个图应该怎么理解,ULK3 中的。


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP