免费注册 查看新帖 |

Chinaunix

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

c++指针是逻辑地址还是线性地址? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-02-24 09:57 |只看该作者 |倒序浏览
我们用&取得的变量的地址是逻辑地址码?如果是的话,那么这个地址是编译时刻就可以确定的还是链接的时候确定的?
据我所知对于全局变量和局部变量地址还是有些不一样的,对于全局变量和静态变量,编译和链接的时候就已经给他们放在了data段了,所以他们的地址我想在编译
的时候就可以知道,但是对于局部变量,并不放在段中,而是放在栈中的,但是栈本身是执行的时候动态增加减小的,所以个人感觉局部变量的地址无法在编译时刻决定。所以,如果说
局部变量也是逻辑地址的话,那它的逻辑地址的(段:偏移)中的段址和偏移又是什么(SS段地址?BP?SP?)。
此外,new出来的地址是放在堆中的,那如果说是逻辑地址的话,那他的段和偏移又是指的什么?
除此以为,我们知道,EXE在加载到内存执行的时候,实际上的放置的位置是动态变化的, 既然那么多编译时候无法确定的地址,但是事实上我们确实又可以取到地址,不知道这个背后是
怎么回事。

本人这方面的知识实在是混乱,可能无法阐述清楚,希望大家理解。

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
2 [报告]
发表于 2010-02-24 10:13 |只看该作者
程序可用的内存地址都是逻辑地址

论坛徽章:
0
3 [报告]
发表于 2010-02-24 10:31 |只看该作者
程序可用的内存地址都是逻辑地址
A.com 发表于 2010-02-24 10:13



     能不能针对某种类型的变量说下地址形成机制,从编译到连接再到EXE加载内存后情况,可能话题比较大

论坛徽章:
0
4 [报告]
发表于 2010-02-24 13:14 |只看该作者
是虚拟地址,只不过在Linux中虚拟地址和线性地址是相同的。

论坛徽章:
0
5 [报告]
发表于 2010-02-24 13:18 |只看该作者
要看你的程序是跑在什么环境下把。如果写的C++代码是操作系统,那么... 如果硬件是8086,那么...

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
6 [报告]
发表于 2010-02-24 13:19 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2010-02-24 13:24 |只看该作者
就主流的32位以上的 X86架构CPU上的主流操作系统而言,段机制都是被很大程度弱化的,
段基址一般是0,这时线性地址和逻辑地址也就等同了。

应用程序用的都是逻辑地址,CPU会在访问地址的内容时,才通过分段、分页机制来从物理位置中获取数据,这个机制是硬件自动完成的,软件能做的,就是事先在某些寄存器和某些内存中放好相应的数据,让硬件计算时自动引用。

应用程序中引用地址方式,可以是绝对地址,也可以是相对于某个位置的相对地址,也就是所谓的PIC,position independent code,位置无关代码,在应用程序载入内存的时候,有一个link的操作,根据装载的位置,重新计算一些符号的地址

对硬件转换感兴趣的,看intel的白皮书
对应用程序地址感兴趣的,看《linker and loader》,linuxforum.net以前有过翻译的

论坛徽章:
0
8 [报告]
发表于 2010-02-24 13:48 |只看该作者
就主流的32位以上的 X86架构CPU上的主流操作系统而言,段机制都是被很大程度弱化的,
段基址一般是0,这时 ...
drangon 发表于 2010-02-24 13:24



        “应用程序用的都是逻辑地址,。。。。。。。。。”这句话和   ”应用程序中引用地址方式,可以是绝对地址。。。。“ 怎么理解,这里的绝对地址是指的物理地址码?如果是当前在
某个操作系统中开发的话,感觉不可能吧,如果是开发操作系统的话,不知道是否可以

论坛徽章:
0
9 [报告]
发表于 2010-02-24 13:51 |只看该作者
要看你的程序是跑在什么环境下把。如果写的C++代码是操作系统,那么... 如果硬件是8086,那么...
pagx 发表于 2010-02-24 13:18



    假设我们是在windows或者linux平台下做开发,并且处理器是X86

论坛徽章:
0
10 [报告]
发表于 2010-02-24 19:28 |只看该作者
“应用程序用的都是逻辑地址,。。。。。。。。。”这句话和   ”应用程序中引用地址方式,可 ...
li574000 发表于 2010-02-24 13:48


绝对地址是指逻辑地址,是指0x88008800之类的地址,这个地址是在生成EXE的时候确定,因为生成EXE的时候,
可以指定每一个段会装载在什么地方,例如0x88008000,

相对地址是指地址中指放一个偏移值,例如0x00000800,通常用于动态链接库等,当动态链接库放到内存特定中位置时,
再根据具体的放置的位置,结合这个偏移值,计算出实际的地址,计算后的地址也是指逻辑地址。

凡是站在应用程序角度讨论地址时,都是指逻辑地址,只有在讨论操作系统的分段、分页、内存分配的时候,才会涉及其他地址
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP