注意:我正在尝试研究虚拟内存分配的高级概述
整个进程的虚拟地址空间是否分为特定大小的页面:
.text
.bss
.data
这是否还包括堆空间和堆栈 - 或者这始终是不可分页的?
最佳答案
首先请注意,“页面”只是地址空间的区域。 “不可分页”的区域(我假设您的意思是它不能交换到磁盘)仍然在逻辑上分为多个页面,但操作系统可能在这些页面上实现不同的策略。
最常见的页面大小是 4096 字节。许多架构支持同时使用多种页面大小(例如 4K 页面和 1MB 页面)。然而,操作系统通常只使用一种页面大小,因为在大多数情况下,管理多种页面大小的成本远高于其提供的好处。异常(exception)情况是存在的,但我认为您不需要担心它们。
每个虚拟页面都附加了一定的权限,例如它是否可读、可写、可执行(取决于硬件支持)。操作系统可以使用它来帮助增强安全性、缓存一致性(对于共享内存)以及将页面交换出物理内存。
操作系统不需要知道.text
、.bss
和.data
区域(尽管大多数操作系统确实知道它们,出于安全和性能原因)。
在第一次访问该页面之前,操作系统可能不会实际为堆栈/堆页面分配内存。操作系统可以提供系统调用来请求更多的堆/堆栈空间页面。某些操作系统提供共享内存或共享库功能,这会导致地址空间中出现更多区域。取决于操作系统。
关于linux - 整个进程的虚拟地址空间是否分为页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1851794/