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