内核进程与线程基础:用户与内核空间剖析
1. 进程虚拟地址空间基础
虚拟内存的一个基本规则是,所有潜在可寻址的内存都在一个“盒子”里,即被沙箱化。我们将这个“盒子”视为进程映像或进程虚拟地址空间(VAS),无法“查看”盒子之外的内容。
用户 VAS 被划分为同质的内存区域,称为段或更专业地称为映射(因为它们是通过 mmap() 系统调用在内部构建的)。以下是每个 Linux 用户空间进程都会有的最小映射(段):
- 文本段 :存储机器代码,是处理器核心的指令指针(或等效寄存器)在进程的线程执行代码时所指向的位置,大小固定(模式:r - x)。注意,文本段并非从虚拟地址 0x0 开始,第一个虚拟页面(包含空地址 0x0)被称为“空陷阱”页面。
- 数据段 :位于文本映射的正上方,存储全局和静态数据变量(模式:rw -),实际上包含三个不同的数据段:
- 已初始化数据段 :存储预先初始化的全局/静态变量,大小固定。
- 未初始化数据段 :存储未初始化的全局/静态变量(在运行时自动初始化为 0,该区域有时称为 bss),大小固定。
- 堆段 :标准 C 库用于内存分配和释放的 API(如 malloc() 系列例程)从这里获取内存。但在现代 glibc 中,只有请求小于 MMAP_THRESHOLD 字节(默认 128 KB)的 mall
超级会员免费看
订阅专栏 解锁全文

1895

被折叠的 条评论
为什么被折叠?



