敢说熟悉Linux的进,我们来聊聊~~

nightlyaxe 发布于 2013/04/16 12:05
阅读 1K+
收藏 0

先上图:

=================内存地址:4G

内核空间 
===================内存地址:0XBFFFFFFF 3G大小

环境变量

命令行参数

环境变量指针

0X00000000(4个NULL字节做分界线)

指向命令行参数3的指针
指向命令行参数2的指针
指向命令行参数1的指针

程序名称

参数数目(程序刚开始启动时 ESP指向这儿)

栈区(向下生长)

很大一段空间

堆区(向上生长)

bss区

text区

===================内存地址:0X8048000(不是0X80480000!感谢下面的@fuhaiping提醒,经过查证后发现是我搞错了,正确地址是0X8048000,中文翻译版真是害人不浅!!!网上很多转载的也是些错的!)  

很大一段空间

===================内存地址:

图完,我有几个疑问,请教一下。谢谢!

内存地址0到0X8048000做什么用的??0X8048000这个数字怎么来的??

是否还有其他一些固定的数字在这里??

用户空间和内核空间3:1是怎么出来的??4:1不行?2:2不行?

堆区 和 栈区之间的一大段就这么空着??

堆区和栈区是否有大小限制??否则就撞在一起了。。虽然是不可能的。

共享库和data区位于何处?

这是目前我所知道的空间布局,能否再补全一下,使之更为全面详细?

能给一个方法使我能完整清晰地看到用户3G空间在运行程序时的布局吗??求证是这样布局的。内核空间就不指望了。

额。我问题太多了,见谅啊,请各位达人回答能耐心细节一点,再次感谢!

另:标题太招了,请老大们原谅~请先回答问题再喷哈。

加载中
0
我不叫大脸猫
我不叫大脸猫
应该说是熟悉linux下c编程的进来吧
0
剑尖血凝紫
剑尖血凝紫

应该还有一个data段,保存数据的

共享库就保存在堆栈之间的区域里

其他的。。。。

0
TrulyBelieve
TrulyBelieve

你这个图应该是虚拟地址空间,

0X80480000应该是所有应用程序的入口地址,所有应用程序执行代码都被布局到0X80480000开始的地址,此时是虚拟地址空间,具体物理内存空间地址肯定不一样。

玩过嵌入时linux,它的启动是,把内核拷贝到物理内存的低地址,然后把这段地址映射为高虚拟空间地址(0XBFFFFFFF),所以内核空间就只有1G,剩下3G都认为是用户空间。

0
大卷卷
大卷卷
这个要是讲的很详细也有点点麻烦,涉及到 Linux 程序链接和加载的问题(主要还是内核加载应用程序的问题)。不多说了,给个链接你看看,http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory , 这个应该讲的稍微详细一点,另外,不是 0x80480000,而是 0x8048000, 也就是说 0x00000000 到 0x8048000 只有三个页面,这三个页面一般没有被映射什么东西,不过你也可以写个程序在操作系统加载应用程序的过程后并且应用程序还未执行之前将 0x00000000到0x8048000里面映射一些东西,但是也有点复杂。以前跟着一个师兄做过 Linux 程序录制和重放的工具(录制系统调用,利用 Linux 的 VDSO机制),当时对这个弄得很清楚,不过现在有点忘记了。
nightlyaxe
nightlyaxe
多谢提醒和指点,我查看资料后发现是我弄错了,已更正。现在发现中文翻译版的书上也写错了!但是英文版是正确的!搞翻译的什么眼神啊~~
0
纳兰清风
纳兰清风
堆区和栈区部分确实空闲的空间较大,栈区共函数调用使用,堆区供用户管理内存,碰到一块数据就被覆盖了,就是俗称的缓冲区溢出……
返回顶部
顶部