2009-12-05 96 views
1

注:我试图研究虚拟内存分配的高度概括是整个过程的虚拟地址空间分割成页

是一种特殊的整个进程的虚拟地址空间分割成页,大小:

.text 
    .bss 
    .data 

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

+0

从技术上讲,这些是段而不是页面。分段的大小不限于4K – 2009-12-05 10:43:37

回答

2

首先注意“页面”只是地址空间的区域。一个“不可分页”的区域(我假定你的意思是它不能交换到磁盘)仍然在逻辑上被分成页面,但操作系统可能在这些页面上实现不同的策略。

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

每个虚拟页面都附有特定的权限,比如它是否可读,可写,可执行(因硬件支持而异)。操作系统可以使用它来帮助实施安全性,缓存一致性(用于共享内存)以及将页面交换出物理内存。

.text.bss.data区不一定是已知的OS(虽然大多数操作系统都了解他们,出于安全和性能方面的原因)。

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

1

.data是程序的初始化全局变量的位置。 .bss包含没有显式初始值设定项的全局变量(默认值为0)。堆和堆栈是彼此独立的存储区域。进程看到的所有内存都是虚拟内存分页。一个进程看不到任何东西比虚拟内存。

2

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

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