【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

简介: 【OSTEP】分页(Paging) | 页表中究竟有什么 | 页表存在哪 | 内存追踪

💭 写在前面

本系列博客为复习操作系统导论的笔记,内容主要参考自:

  • Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy PiecesA. Silberschatz, P. Galvin, and G. Gagne,
  • Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

0x00 分页介绍(Concept of Paging)

分页并不是将一个进程空间的地址空间分割成几个长度不同的逻辑段(代码,堆,段),而是 分割成固定大小的单元,每个单元称为一

Paging splits up address space into fixed-sized unit called a page.

  • Segmentation:逻辑段(代码、堆栈、堆等)的大小可变。

相应的,我们把物理内存看成是定长槽块的阵列,称为 页帧(page frame)。

With paging, physical memory is also split into some number of pages called a page frame.

每个进程都需要一个页表,用于将虚拟地址转换为物理地址。

Page table per process is needed to translate the virtual address to physical address.

关键问题:如何通过页来实现虚拟内存?

如何通过页来实现虚拟内存,从而避免分段的问题?基本技术是什么?如何让这些技术很好地运行?并尽可能地减少时间和空间的开销?

灵活性(Flexibility):有效支持地址空间的抽象性。

  • 不需要假设堆和栈是如何增长和使用的。

简单性(Simplicity):易于自由空间的管理,

  • 地址空间中的页和页框的大小是一样的。
  • 易于分配和保持空闲列表

0x01 一个简单的例子

64 字节的地址空间,有 16 字节的页(4页)。

128 字节的物理内存,有 16 字节的页帧(8个页帧)。

这里只是为了方便讲解举得例子而已,然而真实的地址空间肯定比这个大得多,通常 32 位有 4GB 的地址空间,甚至有 64 位!(这里插一嘴,64位的地址空间是真他马的大,如果说 32 位地址空间有网球场那么大,那么 64 位地址空间就是整个欧洲的面积那么大)

为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常位每个进程保存一个数据结构,称为 页表(address table),又称页面映像表。页表是一种数据结构,用于将虚拟地址映射到物理地址。 从而让我们知道每个页在物理内存中的位置,起到映射作用。

为了转换该过程生成的虚拟地址,我们将虚拟地址它分为两个部分:

  • 虚拟页面号 (VPN):virtual page number
  • 偏移量 (Offset): offset within the page

例如:64 位地址空间中的虚拟地址 21(0x15)

0x02 页表中究竟有什么?

页表可以变得非常大,一个典型的32位地址空间,带有 4KB 的页。这个虚拟地址分成 20 位的 VPN 和 12 位的偏移量。

一个 20 位的 VPN 意味着操作系统必须为每个进程管理 个地址转换(大约一百万)。

❓ 页表存在哪里?

Page tables for each process are stored in memory.   (每个进程的页表都存储在内存中)

  • 要找到所需PTE的位置,需要页表的起始位置(例如 PTBR - 页表基数寄存器)
  • 对于每一个内存引用,分页需要操作系统执行一次额外的内存引用 → 这太慢了!

我们知道了 —— 页表就是一种数据结构,用于将虚拟地址映射到物理地址。

  • 因此,任何数据结构都可以采用,最简单的形式就是线性页表(一个数组)。

操作系统通过 VPN 对数组进行索引,并查找页表条目(entry),常见的条目有:

  • Valid Bit: Indicating whether the particular translation is valid.
  • Protection Bit: Indicating whether the page could be read from, written to, or executed from.
  • Present Bit: Indicating whether this page is in physical memory or on disk (swapped out).
  • Dirty Bit: Indicating whether the page has been modified since it was brought into memory.
  • Reference Bit (Accessed Bit): Indicating that a page has been accessed.

有效位:用于指示特定的地址转换是否有效。

保护位:表明页是否可以读取、写入或执行。

存在位: 表示该页实在物理存储器上还是在磁盘上。

脏位:表明页面被带入内存后是否被修改过。

参考位(访问位) :用于追踪页是否被访问。

利用分页访问内存:

// Extract the VPN from the virtual address
VPN = (VirtualAddress & VPN_MASK) >> SHIFT
// Form the address of the page-table entry (PTE)
PTEAddr = PTBR + (VPN * sizeof(PTE))
// Fetch the PTE
PTE = AccessMemory(PTEAddr)
// Check if process can access the page
if (PTE.Valid == False)
  RaiseException(SEGMENTATION_FAULT)
else if (CanAccess(PTE.ProtectBits) == False)
  RaiseException(PROTECTION_FAULT)
else
  // Access is OK: form physical address and fetch it
  offset = VirtualAddress & OFFSET_MASK
  PhysAddr = (PTE.PFN << PFN_SHIFT) | offset
  Register = AccessMemory(PhysAddr)

0x03 内存追踪(A Memory Trace)

在结束之前,我们现在通过一个简单的内存访问示例,来演示使用分页时产生的所有内存访问。

需要我们感兴趣的代码片段如下:

💬 代码:array.c

int array[1000];
...
for (i = 0; i < 1000; i++)
    array[i] = 0;

我们用下列指令编译它:

prompt> gcc –o array array.c –Wall –o
prompt>./array

生成的汇编代码如下:

虚拟(和物理)内存追踪:

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2022.
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

Remzi H. Arpaci-Dusseau and Andrea C. Arpaci-Dusseau, Operating Systems: Three Easy Pieces

A. Silberschatz, P. Galvin, and G. Gagne,

Operating System Concepts, 9th Edition, John Wiley & Sons, Inc., 2014, ISBN 978-1-118-09375-7.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

相关文章
|
4月前
|
算法 程序员
深入理解操作系统内存管理:分页系统的优势与挑战
【4月更文挑战第7天】 在现代操作系统中,内存管理是一项至关重要的任务,它确保了计算机能够高效、安全地运行各种程序。分页系统作为内存管理的一种技术,通过将物理内存分割成固定大小的单元——页面,为每个运行的程序提供了一种独立且连续的内存地址空间。该技术不仅简化了内存分配,还允许更高效的内存使用和保护。本文探讨了分页系统的核心原理,优势以及面临的挑战,旨在为读者揭示其在操作系统设计中的重要性。
|
3月前
|
存储 机器学习/深度学习 Linux
程序员必知:关于Linux内存寻址与页表处理的一些细节
程序员必知:关于Linux内存寻址与页表处理的一些细节
27 0
|
4月前
|
缓存 算法 安全
深入理解操作系统内存管理:分页系统的优势与挑战
【5月更文挑战第31天】 在现代操作系统中,内存管理是核心功能之一。分页系统作为内存管理的一种流行技术,其设计哲学基于时间和空间的局部性原理,旨在提高内存利用率和系统性能。本文将探讨分页系统的关键优势及其面临的挑战,包括页面置换算法、内存碎片问题以及虚拟到物理地址转换的复杂性。通过对分页机制的深入分析,我们揭示了它在多任务处理环境中如何允许多个进程共享主存资源,并保证了操作系统的稳定性与高效性。
|
4月前
|
Linux Shell API
LabVIEW最大内存块属性不存在
LabVIEW最大内存块属性不存在
25 2
|
4月前
|
缓存 算法
深入理解操作系统内存管理:分页系统的优势与挑战
【5月更文挑战第28天】 在现代操作系统中,内存管理是一项至关重要的功能,它不仅确保了系统的稳定运行,还提升了资源的利用效率。本文将探讨分页系统这一核心概念,并分析其在内存管理中的优势和面临的挑战。通过剖析分页机制的工作原理及其对虚拟内存实现的重要性,我们进一步阐述了它在多任务处理和内存保护方面的作用。同时,文章也将讨论分页带来的性能开销、页面置换算法的设计以及它们如何影响系统的整体性能。
|
4月前
|
存储 缓存 算法
深入理解操作系统内存管理:分页系统的优势与挑战构建高效Android应用:探究Kotlin协程的优势与实践
【5月更文挑战第27天】 在现代计算机系统中,内存管理是操作系统的核心功能之一。分页系统作为一种内存管理技术,通过将物理内存划分为固定大小的单元——页面,为每个运行的程序提供独立的虚拟地址空间。这种机制不仅提高了内存的使用效率,还为多任务环境提供了必要的隔离性。然而,分页系统的实现也带来了一系列的挑战,包括页面置换算法的选择、内存抖动问题以及TLB(Translation Lookaside Buffer)的管理等。本文旨在探讨分页系统的原理、优势及其面临的挑战,并通过分析现有解决方案,提出可能的改进措施。
|
4月前
|
存储
【进程概念】虚拟内存与页表简述
【进程概念】虚拟内存与页表简述
|
4月前
|
安全 Linux Windows
深入理解操作系统内存管理:分页与分段的融合
【4月更文挑战第30天】 在现代操作系统中,内存管理是确保多任务环境稳定运行的关键。本文将深入探讨分页和分段两种内存管理技术,并分析它们如何相互融合以提供更为高效、安全的内存使用策略。通过对比这两种技术的优缺点,我们将探索现代操作系统中它们的综合应用,以及这种融合对操作系统设计和性能的影响。
|
4月前
|
存储
CPU的内存分页
CPU的内存分页是一种内存管理机制,旨在优化内存的使用效率和程序的运行效率。在现代计算机系统中,整个虚拟和物理内存空间被切割成固定大小的块,称为页(Page)和帧(Frame)。页用于虚拟地址空间,而帧用于物理内存空间。这些页和帧的大小通常是固定的,比如常见的4KB。 CPU通过内存管理单元(MMU)来实现虚拟地址到物理地址的转换。这个转换过程是通过页表来完成的,页表存储在内存中,并保存了页号与页帧号的映射关系。当CPU需要访问某个虚拟地址时,它会查阅页表,找到对应的物理地址,然后完成内存访问。 内存分页的主要好处有以下几点: 1. **减小换入换出的粒度**:内存分页允许操作系统以更小
31 0
|
4月前
|
缓存 算法 安全
深入理解操作系统内存管理:分页系统的优势与挑战
【2月更文挑战第30天】 在现代操作系统中,内存管理是核心功能之一,它负责将有限的物理内存资源分配给多个并发运行的进程。分页系统作为内存管理的一种流行技术,其通过虚拟到物理地址的映射提供了程序的逻辑地址空间,并允许更高效的内存分配和保护。本文旨在探讨分页系统的关键优势,包括其如何提升内存利用率、实现内存保护以及支持多任务处理。同时,我们也将分析分页机制带来的挑战,诸如页面置换算法的效率问题、页表管理和TLB(Translation Lookaside Buffer)的维护等。