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