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

标签 linux x86 virtual-memory

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

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

  .text
  .bss
  .data

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

最佳答案

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

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

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

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

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

关于linux - 整个进程的虚拟地址空间是否分为页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1851794/

相关文章:

c - 虚拟内存如何保持其效率?

memory-management - 顺序写和随机写的区别

Linux shell : LOOP for create file in each folder

c - 是否可以在 Ubuntu 12.10(内核 3.5)中实现 readdir()?

linux - 使用 'sed' 或 'awk' 进行数据转换任务

c - 通过翻译复制内存的快速方法 - ARGB 到 BGR

c - 将数字字符串汇编成 int

c - 在汇编器中将值从一个数组传递到另一个数组

linux - 将数据集从空格分隔转换为制表符分隔

c - 为什么kem_cache->node可以分配地址或array_cache?