当前位置: 技术问答>linux和unix
请教一个Linux内存分配的问题
来源: 互联网 发布时间:2015-07-23
本文导语: 我看的是2.4.0的版本,是浙大出的那本内核源代码情景分析 看到存储管理的有关内存分配的地方有点不懂 首先,Linux将4G的虚存空间(32位地址)分成“系统空间”(0xC0000000-0xFFFFFFFF))和“用户空间”(0x00000000-0xBFFFFF...
我看的是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小?
谢谢!
看到存储管理的有关内存分配的地方有点不懂
首先,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小?
谢谢!
|
差不多是这样的吧
但是代码和数据段由于Linux在处理上面的原因,并没有从0x00000000开始。想想你就会明白,0x00000000被用作NULL指针,怎么能有东西在那个地方?
具体从什么地方开始,你可以参考ELF文件的格式说明,好像是提到过这个问题
但是代码和数据段由于Linux在处理上面的原因,并没有从0x00000000开始。想想你就会明白,0x00000000被用作NULL指针,怎么能有东西在那个地方?
具体从什么地方开始,你可以参考ELF文件的格式说明,好像是提到过这个问题