Glibc内存管理-Linux的内存布局
分类:
文章
•
2023-11-03 16:47:28
32位模式下的经典布局:
![Glibc内存管理-Linux的内存布局 Glibc内存管理-Linux的内存布局](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzUyMC80MTlmZTFiNWRlOGJiNzQ5NzA3ZTY3YjFkNTY5ZWU5MC5wbmc=)
32位模式下的默认布局:
![Glibc内存管理-Linux的内存布局 Glibc内存管理-Linux的内存布局](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE4OC9iNjE0N2Y5ODQyOWFlYmE5ZTAyYjJiOWRjNjc2YzdjNC5wbmc=)
64位的内存布局:
![Glibc内存管理-Linux的内存布局 Glibc内存管理-Linux的内存布局](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzc3Ni82MGY5MGFiZWVhMTI1NDg1MzM1MGI5YzQ3MmRkNzU1OC5wbmc=)
主要段说明:
- Knernel space 指内核空间。
- BSS段主要存储未初始化的全局变量或者初始化为0的全局变量和静态变量的一块内存区域。(可读可写)
- BSS段属于静态内存分配。它的初始值也是由用户自己定义的连接定位文件所确定,用户应该将它定义在可读写的RAM区内,源程序中使用malloc分配的内存就是这一块,它不是根据data大小确定,主要由程序中同时分配内存最大值所确定,不过如果超出了范围,也就是分配失败,可以等空间释放之后再分配。
-
data段包含静态初始化的数据,所以有初值的全局变量和static变量在data区。(可读可写)
-
text段是程序代码段(只读)。
其它说明:
- bss 段与堆栈之间的空间是空闲的,空闲空间被分成两部分,一部分为 heap,一部分为 mmap 映射区域。
- Heap 和 mmap 区域都可以供用户*使用,但是它在刚开始的时候并没有映射到内存空间内,是不可访问的。
- 在向内核请求分配该空间之前,对这个空间的访问会导致segmentation fault。
- Stack区域是唯一不需要映射,用户却可以访问的内存区域。
- 进程的栈和 mmap 映射区域并不是从一个固定地址开始,并且每次启动时的值都不一样,这是程序在启动时随机改变这些值的设置。