当前位置: 技术问答>linux和unix
C语言中各个段都在内存的什么地址范围?
来源: 互联网 发布时间:2016-10-30
本文导语: 常见的bss段,堆段,栈段,代码段,数据段等等, 一般运行的时候是不是都会在固定的一个地址范围内? 比如这个代码段在0x804XXXXX范围,栈段在0xbefXXXXX范围(我是随便添的), 大家知不知道? 或者哪里可以查...
常见的bss段,堆段,栈段,代码段,数据段等等, 一般运行的时候是不是都会在固定的一个地址范围内?
比如这个代码段在0x804XXXXX范围,栈段在0xbefXXXXX范围(我是随便添的),
大家知不知道? 或者哪里可以查到这些范围的定义? 然后这些值是不是各个系统都一样的,比如linux和windows?
比如这个代码段在0x804XXXXX范围,栈段在0xbefXXXXX范围(我是随便添的),
大家知不知道? 或者哪里可以查到这些范围的定义? 然后这些值是不是各个系统都一样的,比如linux和windows?
|
进程地址空间分布在不同平台亦不同。linux下高1GB空间是内核的,下面的3GB才是用户进程的。
楼主可以写一下代码测试一下。
ELF文件被系统加载到0x0804800这个地址,往上是只读段,比如.text等,再往上是数据段,再往上到堆段,大约从0xbffffxxxx开始往下是栈段。网上应该有这方面的图的,一看图就很清楚了。但具体的地址,可能不同系统版本也不同(linux 2.4内核与2.6内核有些地址就不太一样)。
权威的手册暂时还没有找到,这方面的资料比较难找了。
楼主可以写一下代码测试一下。
ELF文件被系统加载到0x0804800这个地址,往上是只读段,比如.text等,再往上是数据段,再往上到堆段,大约从0xbffffxxxx开始往下是栈段。网上应该有这方面的图的,一看图就很清楚了。但具体的地址,可能不同系统版本也不同(linux 2.4内核与2.6内核有些地址就不太一样)。
权威的手册暂时还没有找到,这方面的资料比较难找了。
|
你可以看一下,kernel对程序加载的那部分代码。do_exec