真实面经题目 · 原创解析
Linux 的内存布局是什么?
这题考进程虚拟地址空间,回答要按区域、增长方向、权限和虚拟内存映射机制说明。
真实面经题目 · 原创解析
这题考进程虚拟地址空间,回答要按区域、增长方向、权限和虚拟内存映射机制说明。
Linux 进程看到的是独立的虚拟地址空间,通常从低到高包含代码段 text、只读数据、已初始化 data、未初始化 bss、堆、mmap 映射区、线程栈,以及高地址的内核映射区域。堆通常向高地址增长,栈通常向低地址增长;malloc 小块可能来自 brk 扩展堆,大块或共享库映射常来自 mmap。虚拟地址通过页表映射到物理页,配合权限位、缺页异常、按需加载和写时复制实现隔离与高效管理。
每个进程拥有自己的虚拟地址空间,进程中的指针是虚拟地址,不是直接的物理地址。页表负责把虚拟页映射到物理页,并记录读写执行权限。
text 段保存机器指令,通常只读可执行;rodata 保存字符串常量等只读数据;data 保存已初始化全局变量和静态变量;bss 保存未初始化或零初始化的全局与静态变量。
堆用于动态分配,通常通过 brk 或 mmap 扩展,生命周期由程序控制;栈用于函数调用、局部变量和返回地址,每个线程有自己的栈,通常向低地址增长。
mmap 区用于共享库、文件映射、匿名映射和大块内存分配。它让文件内容或匿名页直接映射进进程空间,支持共享内存、按需加载和零拷贝相关能力。
高地址区域通常映射内核空间,用户态不能随意访问。虚拟内存提供进程隔离、权限保护、地址空间布局随机化、按需分页和写时复制。
堆由程序动态申请释放,适合跨函数生命周期对象;栈由函数调用自动管理,分配快但空间有限且随调用返回失效。
不一定。小块通常通过 brk 扩展堆,大块内存或特殊场景可能通过 mmap 单独映射。
为了进程隔离、权限保护、按需加载、共享映射、写时复制和让程序看到连续地址空间。
不一定。按需分页、mmap 文件读取、写时复制都可能触发正常缺页;非法访问才会导致段错误等异常。