整个进程的虚拟地址空间是否分成页面

时间:2009-12-05 10:19:03

标签: linux x86 virtual-memory

注意:我正在尝试研究虚拟内存分配的高级概述

整个进程的虚拟地址空间是否分成特定大小的页面:

  .text
  .bss
  .data

这是否还包括堆空间和堆栈 - 或者这总是不可分页?

3 个答案:

答案 0 :(得分:2)

通常,在分页操作系统上,整个地址空间的处理被分成页面。每个线性地址包含两个组件 - 最高有效位中的页码,以及最低有效位中页面内的偏移量。

例如,对于32位线性地址和4kB页面,高20位是页码,低12位是页面偏移。

答案 1 :(得分:2)

首先请注意,“页面”只是地址空间的区域。一个“不可分页”的区域(我假设它意味着它无法交换到磁盘)仍然在逻辑上划分为页面,但操作系统可能会在这些页面上实现不同的策略。

最常见的页面大小为4096字节。许多体系结构支持同时使用多个页面大小(例如4K页面以及1MB页面)。但是,操作系统通常只有一个页面大小,因为在大多数情况下,管理多个页面大小的成本远远高于它提供的好处。存在例外但我认为你不需要担心它们。

每个虚拟页面都附加了某些权限,例如它是否可读,可写,可执行(根据硬件支持而有所不同)。操作系统可以使用它来帮助实施安全性,缓存一致性(用于共享内存),以及将页面交换出物理内存。

操作系统无需了解.text.bss.data区域(但出于安全性和性能原因,大多数操作系统都知道这些区域)。

在第一次访问该页面之前,OS实际上可能不会为堆栈/堆页面分配内存。 OS可以提供​​系统调用以请求更多页面的堆/堆栈空间。某些操作系统提供共享内存或共享库功能,这会导致更多区域出现在地址空间中。取决于操作系统。

答案 2 :(得分:1)

.data是程序初始化的全局变量所在的位置。 .bss包含没有显式初始值设定项的全局变量(默认值为0)。堆和堆栈是与这些堆叠和堆栈彼此独立的存储区域。进程看到的所有内存都是以页面形式分割的虚拟内存。除了虚拟内存之外,进程看不到任何其他内容。