当前位置: 技术问答>linux和unix
linux0.11内核线性地址问题,请教!!
来源: 互联网 发布时间:2016-08-22
本文导语: 我们知道在保护模式下寻址要经过逻辑地址->线性地址->物理地址的变换。 在linux0.11内核中每个任务占4GB线性地址空间的64M,并依次排列,64M空间内又分为代码空间跟数据空间和堆栈 那么问题来了。...
我们知道在保护模式下寻址要经过逻辑地址->线性地址->物理地址的变换。
在linux0.11内核中每个任务占4GB线性地址空间的64M,并依次排列,64M空间内又分为代码空间跟数据空间和堆栈
那么问题来了。。
当我们用C语言写下如下语句时:
(int*)addr=&a;//a是一全局变量
此处的addr是一32位的指针,这个地址是不是可以看成是相对于数据段的偏移量?那么段选择符跑哪去了?
另外这个地址的线性地址是不是可以简单的计算为 64M*n+(代码段的大小)+addr //n为其任务号
???
在linux0.11内核中每个任务占4GB线性地址空间的64M,并依次排列,64M空间内又分为代码空间跟数据空间和堆栈
那么问题来了。。
当我们用C语言写下如下语句时:
(int*)addr=&a;//a是一全局变量
此处的addr是一32位的指针,这个地址是不是可以看成是相对于数据段的偏移量?那么段选择符跑哪去了?
另外这个地址的线性地址是不是可以简单的计算为 64M*n+(代码段的大小)+addr //n为其任务号
???
|
当你考虑一个程序的变量地址的时候,总是以进程的4G空间地址为标准的。你有没有发觉你编译一个程序的时候,栈,文本段,数据段都是按4G空间地址分布的。另外,linux中所有段基址均为0,也就是没有段的概念。直接用objdump去看就知道了。