请教一个Linux内存分配的问题

jerrykeating 2004-09-02 03:56:52
我看的是2.4.0的版本,是浙大出的那本内核源代码情景分析
看到存储管理的有关内存分配的地方有点不懂
首先,Linux将4G的虚存空间(32位地址)分成“系统空间”(0xC0000000-0xFFFFFFFF))和“用户空间”(0x00000000-0xBFFFFFFF),其中系统空间是从物理地址的0开始分配的。
而且在系统空间中可以通过__pa(x)(将虚拟地址转换为物理地址)和__va(x)(将物理地址转换为虚拟地址)进行地址转换
#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET //PAGE_OFFSET=0xC00000000
也就是虚拟地址的0xC0000000对应的物理地址是0

但是,剩下的用户空间的分配我有点搞不明白了
书中有个地方说“在内核对用户虚存空间的使用中,堆栈在用户区的顶部,从上向下延伸,而进程的代码和数据都是自底向上分配空间”
是不是说堆栈段是从用户区顶部0xBFFFFFFF开始向虚存地址减少的方向分配,而数据段和代码段是从虚拟地址的0x00000000开始向着地址增大的方向分配的?
还有,在vm_area_struct中vm_start是不是一定是比vm_end小?

谢谢!

...全文
52 点赞 收藏 3
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jerrykeating 2004-09-05
非常感谢!
回复
沙沙的吹 2004-09-04
差不多是这样的吧
但是代码和数据段由于Linux在处理上面的原因,并没有从0x00000000开始。想想你就会明白,0x00000000被用作NULL指针,怎么能有东西在那个地方?
具体从什么地方开始,你可以参考ELF文件的格式说明,好像是提到过这个问题
回复
rzsheng 2004-09-04
Mark
回复
相关推荐
发帖
Linux_Kernel
创建于2007-08-27

4156

社区成员

Linux/Unix社区 内核源代码研究区
申请成为版主
帖子事件
创建了帖子
2004-09-02 03:56
社区公告
暂无公告