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

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

  .text
  .bss
  .data

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

有帮助吗?

解决方案

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

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

每个虚拟页面都附加有一定的权限,例如它是否可读、可写、可执行(取决于硬件支持)。操作系统可以使用它来帮助增强安全性、缓存一致性(对于共享内存)以及将页面交换出物理内存。

.text, .bss.data 操作系统不需要知道区域(尽管出于安全和性能原因,大多数操作系统确实知道它们)。

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

其他提示

典型地,分页操作系统上的进程整个地址空间被分成页。每个线性地址包含两个组件 - 在最显著比特的页号,并且在至少显著位的页面内的偏移量

例如,具有32位的线性地址和4KB页,上20位是一个页号和低12位是页偏移。

.data是程序的初始化的全局变量所在。 .bss包含没有显式的初始化(为0的初始值)的全局变量。堆和栈是从这些,并且彼此分开的存储器区域。通过工艺看到的所有内存中的页面拆分所有虚拟内存。的方法,并没有看到任何比虚拟存储器别的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top