整个进程的虚拟地址空间是分成多个页面的
注意:我试图研究虚拟内存分配的高级概述
整个进程的虚拟地址空间是否分割成特定大小的页面:
.text
.bss
.data
这是否也包括堆空间和堆栈 - 或者这总是不可分页?
首先请注意,“页面”只是地址空间的区域。 一个“不可分页”的区域(我假定你的意思是它不能交换到磁盘)仍然在逻辑上被分成页面,但操作系统可能在这些页面上实现不同的策略。
最常见的页面大小是4096字节。 许多体系结构支持同时使用多个页面大小(例如4K页面和1MB页面)。 但是,操作系统通常只有一个页面大小,因为在大多数情况下,管理多个页面大小的成本远远高于其提供的好处。 例外存在,但我认为你不需要担心它们。
每个虚拟页面都有一定的权限,比如它是否可读,可写,可执行(因硬件支持而异)。 操作系统可以使用它来帮助实施安全性,缓存一致性(用于共享内存)以及将页面交换出物理内存。
操作系统不需要知道.text
, .bss
和.data
区域(尽管大多数操作系统都出于安全和性能原因了解它们)。
在第一次访问该页面之前,OS可能实际上不会为堆栈/堆页面分配内存。 操作系统可能会提供系统调用来请求更多的堆/堆栈空间页面。 某些操作系统提供共享内存或共享库功能,导致地址空间中出现更多区域。 取决于操作系统。
通常,在分页的操作系统上,处理整个地址空间被分成页面。 每个线性地址包含两个分量 - 最高有效位的页码和最低有效位的页内偏移量。
例如,对于32位线性地址和4kB页,高20位是页码,低12位是页偏移。
.data
是程序初始化的全局变量所在的位置。 .bss
包含没有显式初始值设定项的全局变量(默认值为0)。 堆和堆栈是彼此独立的存储区域。 进程看到的所有内存都是虚拟内存分页。 一个进程看不到任何东西比虚拟内存。
上一篇: Is an entire process’s virtual address space split into pages