当前位置: 技术问答>linux和unix
x86地址空间
来源: 互联网 发布时间:2016-08-20
本文导语: x86 架构中,内存被划分成 3 种类型的地址 物理地址没什么说得。 一直对逻辑地址和线性地址有点疑问。 就是搞不清楚咱们平时说得进程地址空间(4GB那个)对应哪个地址? 有资料说:每个段就是自己的地址空间...
x86 架构中,内存被划分成 3 种类型的地址
物理地址没什么说得。
一直对逻辑地址和线性地址有点疑问。
就是搞不清楚咱们平时说得进程地址空间(4GB那个)对应哪个地址?
有资料说:每个段就是自己的地址空间,那么正常在c程序里:
int a= 8;
然后对a取地址;
得到一地址,这个32位的地址(进程空间里的地址)是逻辑地址还是线性地址?
物理地址没什么说得。
一直对逻辑地址和线性地址有点疑问。
就是搞不清楚咱们平时说得进程地址空间(4GB那个)对应哪个地址?
有资料说:每个段就是自己的地址空间,那么正常在c程序里:
int a= 8;
然后对a取地址;
得到一地址,这个32位的地址(进程空间里的地址)是逻辑地址还是线性地址?
|
p是逻辑地址啊,要经过段式内存管理的转换才到进程用户空间的线性地址
|
你的P是逻辑地址(段选择+偏移量)中的偏移量,这个偏移量和操作系统有关的。
比如说windows xp 程序的加载地址是0x400000(4M处)
比如说windows xp 程序的加载地址是0x400000(4M处)
|
4M是编译的时候默认选定的吧, 在linux下程序加载的地址默认是从虚地址0x8048000开始的,但是可以改变。
在C程序中,要看int p;是全局变量还是函数的局部变量, 如果是局部变量则是分配在栈上, 分配的地址就更大了。
在C程序中,要看int p;是全局变量还是函数的局部变量, 如果是局部变量则是分配在栈上, 分配的地址就更大了。
|
逻辑地址和线性地址是一样的
在8086下叫逻辑地址
但在80386下,它是从8086 80286过来 就把以前的段式映射延续下来 最后80386又出现页式映射,即80386里逻辑地址和线性地址是一样,只不过在不同映射下叫法不同
在8086下叫逻辑地址
但在80386下,它是从8086 80286过来 就把以前的段式映射延续下来 最后80386又出现页式映射,即80386里逻辑地址和线性地址是一样,只不过在不同映射下叫法不同