免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
11 [报告]
发表于 2013-08-23 10:21 |只看该作者
回复 10# niezhongbao
个人理解是,因为这个段偏移计算之后与线性地址相同,所以操作这个段偏移实际上就是在操作线性地址,
但是说逻辑地址等于线性地址这个理解不上去,
逻辑地址是CPU根据段寄存器中的段选择符和段偏移计算出来的,是运行过程中的地址。


1. 代码中的地址都是逻辑地址,也就是段内偏移
2. 线性地址=段基地址+段内偏移(逻辑地址)
3. Linux下段基地址为0


   

论坛徽章:
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
12 [报告]
发表于 2013-08-23 10:27 |只看该作者
回复 9# 瀚海书香

在程序运行前,会有一个装载的过程,每个进程的虚拟内存空间都是4G,装载地址在win下和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
13 [报告]
发表于 2013-08-23 10:42 |只看该作者
回复 12# 魔鬼的惊叹
在程序运行前,会有一个装载的过程,每个进程的虚拟内存空间都是4G,装载地址在win下和linux有所不同,装载后从装载地址开始运行,这个地址我觉得就是 虚拟地址,从这里开始所

有变量所用到的地址都是虚拟地址,所以我觉得打印的还是虚拟地址,毕竟打印的时候程序已经在运行了。


段机制是CPU的机制,如果编译器直接将所有的逻辑转换成线性地址,那CPU还要那些段寄存器干什么?

   

论坛徽章:
0
14 [报告]
发表于 2013-08-23 11:47 |只看该作者
本帖最后由 niezhongbao 于 2013-08-23 11:49 编辑

回复 11# 瀚海书香


1. 代码中的地址都是逻辑地址,也就是段内偏移
-------其他的我们俩个人的意见好像一致,
对于逻辑地址也就是段内偏移我感觉不是这么回事,
段内偏移只是逻辑地址的一部分,
我感觉逻辑地址应该是段选择符和段内偏移组成的。

论坛徽章:
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
15 [报告]
发表于 2013-08-23 13:04 |只看该作者
回复 14# niezhongbao
对于逻辑地址也就是段内偏移我感觉不是这么回事,
段内偏移只是逻辑地址的一部分,
我感觉逻辑地址应该是段选择符和段内偏移组成的。


是这样的。由于linux下,由于所有的段基地址都是0,所有在linux下 逻辑地址=段内偏移
   

论坛徽章:
0
16 [报告]
发表于 2013-08-23 13:40 |只看该作者
回复 15# 瀚海书香

你说的段基址是指哪个,Linux在什么位置设置的呀,
不是Segment Descriptor中的base吧,
这个是由逻辑地址得到的,计算线性地址用的。

   

论坛徽章:
1
白羊座
日期:2013-08-22 17:30:33
17 [报告]
发表于 2013-08-23 14:08 |只看该作者
本帖最后由 cjdao 于 2013-08-23 14:09 编辑

我的理解,应该分两个层面去看这些地址:
1.从硬件层面讲:
在程序执行的过程中,CPU需要从物理内存取指令时,pc寄存器上存放的值就是下一条指令的内存地址;在x86系列上,pc寄存器里的值就是一个逻辑地址,然后经过段式转换(即段基地址+段内偏移(逻辑地址))后会得到线性地址(虚拟地址),如果没有开启页式管理,则线性地址当成物理地址直接送上地址总线;否则线性地址经过页式转换成为物理地址再送上地址总线。
所以,从硬件层面讲,程序中的地址一律都是逻辑地址,哪怕段基地址为0!
2.从linux操作系统层面讲:
个人理解,linux对于地址只分成虚拟地址和物理地址两类:虚拟地址空间分成用户空间和内核空间;物理地址空间以page为最小单位进行管理,然后是zone,最后是node。程序中的地址是虚拟地址,虚拟地址转换成物理地址的过程就是页式转换。这种设计显然与x86上的设计不吻合的,而linux想要在x86上运行就必须符合x86对于地址转换的要求--程序中的地址是逻辑地址,需要经过段式转换后才能成为虚拟地址。linux将所有段基址设置为0,成功的解决了这个问题,使得从硬件上看程序中的地址是逻辑地址,而从操作系统层面上看程序中的地址是虚拟地址而觉察不到逻辑地址的存在。

所以,从硬件层面讲,程序中的地址一律都是逻辑地址,从操作系统层面看程序中的地址是虚拟地址!各位( @瀚海书香 @魔鬼的惊叹 @niezhongbao )不知我的理解对不对

另外,操作系统对于用户空间的管理,会将虚拟地址空间分成一些域(或者说段),不过这里这个段的概念跟硬件段的概念不是同一个概念来的。

论坛徽章:
0
18 [报告]
发表于 2013-08-23 15:27 |只看该作者
本帖最后由 niezhongbao 于 2013-08-23 15:32 编辑

回复 17# cjdao

cjdao 发表于 2013-08-23 14:08
pc寄存器里的值就是一个逻辑地址,然后经过段式转换(即段基地址+段内偏移(逻辑地址))后会得到线性地址(虚拟地址)


基本认同你的观点,说的特别细特别好,不过就是对PC寄存器里面的值我有一些想不通,
感觉是段内偏移,我感觉逻辑地址是分开存放的,分别在段内偏移和段寄存器(cs等)内的,
而且逻辑地址也可以表示为segment selector : offset,
我的理解是在linux中,逻辑地址是没有显示存在的。

论坛徽章:
0
19 [报告]
发表于 2013-08-23 16:23 |只看该作者
回复 17# cjdao
你说的是IP或者EIP寄存器吧,存放的是段内偏移,需要和CS寄存器一起使用。

   

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
20 [报告]
发表于 2013-08-24 00:56 |只看该作者
从左到右依次转换

intel-protected-mode-memory-management.jpg (48.42 KB, 下载次数: 50)

intel-protected-mode-memory-management.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP