Linux内存管理
Linux内存空间布局#
- .text:一般最开始的segment是代码段,包含了ELF可执行程序的代码指令,内存属性为可读可执行(不可写)
- .data:数据段一般在代码段的后面,包含了ELF可执行程序的已经初始化的变量。
- .bss:未初始化数据段一般是最后一个段,包含了未初始化的全局变量和静态变量。(这里需要注意一点的是初始化为0的全局变量和静态变量也是会放在.bss段的)
- heap是堆内存,所有程序动态申请的内存都在此内存范围内,在程序编译时会设置默认堆内存的大小,如果在使用的时候不够用就会往高地址增长。
- mapping共享内存区域,包含了内存映射文件,动态链接库等,可以向低和高地址扩展。
- stack是栈内存,在程序编译时会设置栈内存的大小,但是实际分配物理内存的一开始只有一个页面大小,然后程序运行中栈内存往低地址增长,最大增长到默认的栈内存大小。
进程控制块task_struct#
操作系统为了管理多个进程会通过进程控制块PCB来保存进程的运行时信息。
Linux中的PCB就是task_struct,其中mm_struct为进程内存描述符(用于描述0-3G用户内存空间)
struct task_struct {
struct mm_struct *mm; //指向进程内存描述符
pid_t pid; //进程pid
......
}
进程内存描述符mm_struct#
- 进程内存描述符用来描述程序0-3G用户内存空间的内存信息
- vm_area_struct是用户内存块的线性内存描述符(相当于windows中的VAD),对应内核空间中有vm_struct表示内核空间内存块的线性内存描述符。
- 当用户进程内存块较少时,mmap指向内存块的线性内存描述符链表
- 当用户进程内存块较多时,mm_rb是对应内存块的线性内存描述符红黑树的根结点(相当于windows中的VAD红黑树)
struct mm_struct {
struct {
struct vm_area_struct *mmap; //指向一条线性内存描述符vm_area_struct的链表
struct rb_root mm_rb; //为线性内存描述符红黑树Root的根结点
......
} __randomize_layout;
......
}
/proc/pid/mmaps#
当查看某个进程的用户内存空间分布时执行cat /proc/pid/maps
,这条指令查看maps文件中的内容其实就是对应的mm_struct.mmap或者mm_struct.mm_rb中的数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现