当前位置: 首页 > ds >正文

虚拟内存笔记(一)

内存从分段到分页的演变

关键要点

  • 研究表明,操作系统虚拟内存管理从分段到分页的演变主要是为了提高内存效率和交换性能。
  • 分段最初用于逻辑分段,但存在碎片和效率问题;分页通过固定大小的页解决了这些问题。
  • 现代操作系统主要使用分页,分段作用减少,主要用于模式切换。

概述

虚拟内存管理是操作系统的重要功能,它允许程序使用超过物理内存的内存空间。分段和分页是两种主要的技术,分段将内存分为可变大小的段,而分页则将内存分为固定大小的页。研究表明,操作系统从分段转向分页是为了解决分段的局限性,如外部碎片和低效的内存交换。

历史背景

早期的操作系统使用分段来管理内存,每个段对应程序的逻辑部分,如代码或数据。这解决了地址隔离和不确定性问题,但由于段大小不固定,容易导致外部碎片,且内存交换需要整段操作,效率较低。

分页的引入

分页技术将内存分为固定大小的页(如4KB),通过页表映射虚拟地址到物理地址。这种方法减少了碎片,提高了内存交换效率,因为只需交换需要的页,而不是整段。

现代使用

在现代操作系统如Linux和Windows中,分页是主要内存管理方式。分段仍存在,但主要用于区分用户模式和内核模式,内存保护主要依赖分页。


详细报告:操作系统虚拟内存从分段到分页的演变

虚拟内存是操作系统提供的一种内存管理机制,它通过将部分磁盘空间作为虚拟内存扩展,允许程序使用超过物理内存的地址空间。分段和分页是两种核心技术,用于实现虚拟内存管理。本报告将详细探讨从分段到分页的演变过程,包括历史背景、技术细节和现代应用。

1. 早期的内存管理:分段技术

在早期的计算机系统中,程序直接访问物理内存,这导致地址隔离不足、内存效率低和程序地址不确定等问题。为了解决这些问题,操作系统引入了分段(Segmentation)技术。

  • 分段的定义:分段将程序划分为逻辑上的段,如代码段、数据段、堆栈段等,每个段可以有不同的属性和大小。虚拟地址由段选择器和偏移量组成,段选择器通过段表索引,段表包含基地址、限制和权限级别。
  • 优点
    • 提供了地址隔离,确保不同进程的内存空间互不干扰。
    • 解决了程序地址不确定性问题,通过段表映射虚拟地址到物理地址。
  • 缺点
    • 外部碎片:由于段大小可变,内存中可能出现许多小块空闲空间,无法有效利用。
    • 低效交换:内存交换需要整段操作,可能导致较大的磁盘I/O开销,尤其当段较大时。

例如,在32位操作系统中,虚拟地址空间通常为4GB,用户空间约2GB(最大3GB),内核空间为2GB (操作系统 虚拟内存 、分段、分页的理解)。

2. 分页技术的引入与优势

为了克服分段的局限性,操作系统引入了分页(Paging)技术。分页将虚拟内存和物理内存划分为固定大小的页,通常为4KB(如Linux中)。

  • 分页的定义:虚拟地址分为页号和偏移量,通过页表将虚拟页映射到物理页。物理内存也分为同样大小的帧,页表存储映射关系。
  • 优点
    • 减少碎片:通过固定大小的页,减少了外部碎片,内存利用率更高。
    • 高效交换:内存交换按页进行,利用程序的局部性原理,只需交换需要的页,而不是整段,减少磁盘I/O开销。
    • 内部碎片:虽然存在内部碎片(页内未使用的空间),但总体上比外部碎片更容易管理。
  • 例子:在32位系统,4GB虚拟地址空间对应1048576个4KB页,512MB物理内存对应131072个页 (操作系统 虚拟内存 、分段、分页的理解)。

分页的引入显著提高了内存管理的效率,尤其是在多进程环境中,通过按需分页和页面置换(如LRU算法),系统能够动态管理内存。

3. 分段与分页的结合:段页式内存管理

在某些系统中,操作系统结合了分段和分页,形成了段页式内存管理。这种方法首先将地址空间分为段,然后每个段再分为页。

  • 地址结构:包括段号、段内页号和偏移量。
  • 地址转换:需要三次内存访问:首先通过段表找到段基址,然后通过页表找到页帧,最后计算物理地址。
  • 例子:Multics操作系统采用了段页式管理,结合了分段的逻辑组织和分页的物理管理。

然而,这种方法增加了地址转换的复杂性,现代操作系统更多地依赖单纯的分页。

4. 现代操作系统的内存管理

在现代操作系统如Linux和Windows中,尽管硬件(如x86架构)支持分段和分页,但实际使用中分页是主要机制。

  • Linux的内存管理
    • 主要使用分页,页大小通常为4KB。
    • 分段存在,但配置为扁平模型,所有段基地址为0,段限制为最大值,使虚拟地址直接对应线性地址 (4.1 为什么要有虚拟内存? | 小林coding)。
    • 分段主要用于访问控制和模式切换,如用户模式和内核模式的区分。
    • 虚拟地址空间:32位系统用户空间3GB,内核空间1GB;64位系统用户和内核各128T。
  • Windows的内存管理
    • 类似地,主要依赖分页,分段用于模式切换和线程局部数据存储 (Do modern OS’s use paging and segmentation? - Stack Overflow)。

现代操作系统通常只定义四个段:内核代码段、内核数据段、用户代码段和用户数据段,所有用户进程共享相同的代码和数据段,仅在用户/内核模式切换时变化。

5. 从分段到分页的演变原因

从分段到分页的演变主要由以下原因驱动:

  • 碎片问题:分段的外部碎片问题在内存频繁分配和释放时加剧,而分页通过固定大小的页减少了碎片。
  • 交换效率:分段需要整段交换,效率低;分页按页交换,利用局部性原理,减少磁盘I/O。
  • 硬件支持:随着硬件的发展,如MMU(内存管理单元)的增强,分页的实现变得更加高效。

历史来看,1960年代的Atlas计算机引入了分页技术,Multics(1960-1970年代)采用了段页式管理,而Unix及其衍生系统(如Linux)更多依赖分页,尤其在x86架构上,通过配置分段为扁平模型,实际内存管理主要由分页完成。

6. 对比分析

以下表格总结了分段和分页的主要差异:

特性分段(Segmentation)分页(Paging)
单位大小可变大小,逻辑单位(如代码段、数据段)固定大小,通常4KB
碎片问题外部碎片,内存利用率低内部碎片,内存利用率较高
交换效率整段交换,效率低按页交换,效率高,利用局部性原理
地址转换段表+偏移量,较简单页表+偏移量,需多级页表支持大地址空间
现代使用主要用于模式切换和访问控制主要内存管理机制
7. 结论

虚拟内存管理从分段到分页的演变反映了操作系统对内存效率和性能的不断优化。分段解决了早期的地址隔离问题,但碎片和交换效率的限制促使分页技术的广泛采用。在现代操作系统中,分页成为主要机制,分段的作用减少,主要用于特定场景如模式切换。这一演变过程体现了技术进步对操作系统设计的影响。


关键引文

  • 操作系统 虚拟内存 、分段、分页的理解
  • 4.1 为什么要有虚拟内存? | 小林coding
  • Do modern OS’s use paging and segmentation? - Stack Overflow

分页与分段在碎片管理上的区别

关键要点

  • 分页和分段是不同的内存管理技术,分页使用固定大小的页,而分段使用大小可变的段。
  • 研究表明,分页通常没有外部碎片,但可能有内部碎片;分段则可能有外部碎片,内部碎片较少。
  • 证据倾向于认为,分页通过固定大小的页解决了外部碎片问题,但由于页的固定大小,可能会浪费部分内存空间,导致内部碎片。

分页与分段的区别

分页将内存划分为固定大小的页,进程的地址空间也被划分为相同大小的页。这样,任何空闲的页都可以分配给任何进程,因此通常没有外部碎片。然而,如果一个进程不需要整个页,页中未使用的部分就会浪费,这就产生了内部碎片。

分段则将内存划分为大小可变的段,每个段对应程序的逻辑单元(如函数或数据结构)。由于段的大小不固定,当段被分配和释放时,内存中可能会留下不连续的空闲空间,这些空间可能太小,无法分配给新的段,这就产生了外部碎片。但由于段可以精确地分配所需的大小,内部碎片通常较少。

为什么分页解决了外部碎片

分页通过使用固定大小的页消除了外部碎片,因为内存总是以页为单位分配,任何空闲页都可以被利用,不会产生无法使用的碎片空间。这与分段不同,分段由于段的大小可变,可能会导致内存中分散的小块空闲空间。

内部碎片的问题

虽然分页解决了外部碎片,但由于页的固定大小,如果一个进程的内存需求小于一个页的大小,页中未使用的部分就会浪费,这被称为内部碎片。这种浪费是分页固有的,无法完全避免。


调查报告:分页与分段的碎片问题详解

引言

内存管理是操作系统中的核心功能,分页和分段是两种主要的非连续内存分配技术。用户可能误认为分页相当于较大的分段,但实际上它们在设计和实现上存在显著差异,尤其是在内存碎片方面。本报告将详细探讨分页和分段的碎片问题,解释为什么分页解决了外部碎片,同时分析内部碎片的影响。

分页与分段的定义
  • 分页:将物理内存和虚拟内存划分为固定大小的页(例如4KB)。进程的地址空间被划分为页,操作系统通过页表将虚拟页映射到物理页框(frame)。这种方法允许非连续内存分配,适合现代操作系统。
  • 分段:将程序的地址空间划分为大小可变的段,每个段对应程序的逻辑单元(如代码段、数据段)。段的分配需要连续的内存块,操作系统维护段表来管理段的起始地址和长度。

从GeeksforGeeks: Difference Between Paging and Segmentation和Testbook: Difference between Paging and Segmentation的资料来看,分页和分段的主要区别在于粒度和灵活性。

碎片的类型

内存碎片分为两种:

  • 外部碎片:指内存中分散的小块空闲空间,这些空间的总和可能足够分配,但由于不连续,无法满足新的分配请求。
  • 内部碎片:指分配的内存块大于进程实际需求,导致块内部分空间被浪费。

根据Baeldung: Internal Fragmentation vs. External Fragmentation in Paging,外部碎片发生在内存分配不连续时,而内部碎片发生在分配的固定大小块未被完全使用时。

分页的碎片分析

在分页中,由于页和页框的大小固定(例如4KB),内存分配总是以整页为单位。以下是详细分析:

  • 外部碎片:由于所有页的大小相同,任何空闲页都可以被分配给任何进程,不会产生无法使用的碎片空间。因此,研究表明分页通常没有外部碎片。例如,Stack Overflow: How is there internal fragmentation in paging and no external fragmentation?明确指出:“分页没有外部碎片,因为页和页框都是固定大小的,内存总是以页为单位分配。”
  • 内部碎片:如果一个进程的内存需求小于一个页的大小(例如需要2KB,但分配了4KB的页),则剩余的2KB会被浪费,这就是内部碎片。资料显示,这种浪费是分页固有的,无法完全避免。例如,Guru99: Paging in Operating System提到:“分页可能导致内部碎片,因为页的固定大小可能大于进程的实际需求。”
分段的碎片分析

在分段中,段的大小根据程序的逻辑单元动态确定,分配需要连续的内存块:

  • 外部碎片:由于段的大小可变,当段被分配和释放后,内存中可能会留下不连续的空闲空间,这些空间可能太小,无法满足新的段分配需求,从而产生外部碎片。例如,Testbook: Difference between Paging and Segmentation指出:“分段可能导致外部碎片,因为段的大小不固定。”
  • 内部碎片:由于段可以精确地分配所需的大小(例如一个段正好需要10KB,就分配10KB的连续内存),通常没有内部碎片或内部碎片较少。但如果内存分配器对段大小进行了向上取整,可能会产生少量的内部碎片。
为什么用户可能误认为分页相当于较大的分段

用户可能误认为分页是较大的分段,因为两者都涉及将内存划分为块,但本质上不同:

  • 分页的块(页)大小固定,旨在消除外部碎片;分段的块(段)大小可变,旨在反映程序的逻辑结构。
  • 从Afteracademy: What are Paging and Segmentation?的资料来看,分页更注重物理内存的利用效率,而分段更注重程序的逻辑组织。
现代操作系统的实践

在现代操作系统(如Linux和Windows)中,分页是主要内存管理技术,分段的使用逐渐减少。例如,在64位架构中,分段通常被配置为覆盖整个地址空间,实际内存管理完全依赖分页。这从Enterprisestorageforum: Paging vs Segmentation的描述中可以看出:“分页是透明的,不需要程序员干预,且在现代操作系统中通常没有外部碎片问题。”

争议与复杂性

虽然理论上分页没有外部碎片,但在支持多页大小的系统(如x86-64支持4KB、2MB、1GB页)中,如果内存被分配为大页(如2MB),而需要小页(如4KB)时,可能出现类似外部碎片的情况。但这种情况下,通常通过内存管理策略(如huge pages池)来处理,实际影响较小。例如,Quora: Why does paging not have external fragmentation提到:“在支持多种页大小的系统中,可能存在类似外部碎片的问题,但标准分页模型中没有外部碎片。”

总结与建议

证据倾向于认为,分页通过固定大小的页解决了外部碎片问题,但引入了内部碎片。分段则可能有外部碎片,内部碎片较少。对于用户关心的“分页不是相当于比较大的分段吗”,应明确两者在设计上的根本差异,分页更适合现代操作系统的需求。

以下是分页和分段碎片的对比表:

特性分页分段
块大小固定(例如4KB)可变(根据逻辑单元)
外部碎片通常没有可能有
内部碎片有(页未完全使用)通常较少(精确分配)
适用场景现代操作系统,高效内存利用早期系统,逻辑组织清晰
关键引用
  • GeeksforGeeks: Difference Between Paging and Segmentation
  • Testbook: Difference between Paging and Segmentation
  • Baeldung: Internal Fragmentation vs. External Fragmentation in Paging
  • Stack Overflow: How is there internal fragmentation in paging and no external fragmentation?
  • Guru99: Paging in Operating System
  • Afteracademy: What are Paging and Segmentation?
  • Enterprisestorageforum: Paging vs Segmentation
  • Quora: Why does paging not have external fragmentation

关键要点

  • 研究表明,分页中的内部碎片可以通过选择合适的页大小、支持多种页大小和进程内高效内存分配来减轻,但无法完全消除。
  • 证据倾向于认为,较小的页大小可以减少内部碎片,但会增加管理开销;较大的页适合大内存分配,可能减少相对浪费。
  • 关于最佳解决方案存在争议,取决于系统设计和应用需求。

直接回答

什么是内部碎片

在分页系统中,内部碎片是指当操作系统以固定大小的页分配内存给进程时,如果进程未使用整个页,剩余部分会被浪费。例如,一个4KB的页分配给一个只需要3KB的进程,剩余1KB就是内部碎片。

如何减轻内部碎片
  • 选择合适的页大小:系统设计者可以选择较小的页大小来减少浪费,但这会增加管理页的开销。较大的页适合需要大内存的进程,可能减少相对浪费。
  • 支持多种页大小:一些系统允许使用大页(如2MB或1GB页)来处理大内存分配,这样可以减少页的数量,潜在地降低内部碎片。
  • 进程内高效内存分配:进程可以使用内存池或slab分配等技术,在已分配的页内更高效地管理内存,减少浪费。
局限性

尽管这些方法可以减轻内部碎片,但由于分页本质上使用固定大小的页,内部碎片无法完全消除。这是分页系统与无外部碎片的优点相伴的权衡。


调查报告:分页中内部碎片问题的详细分析与解决方案

引言

内存管理是操作系统中的核心功能,分页是一种广泛使用的技术,通过将内存划分为固定大小的页来实现虚拟内存管理。然而,分页会导致内部碎片,即分配的页未被完全使用时,剩余空间被浪费。本报告将详细探讨分页中内部碎片的成因,并分析可能的解决方案,旨在为系统设计者和开发者提供指导。

内部碎片的定义与成因

内部碎片发生在分页系统中,因为操作系统总是以固定大小的页(例如4KB)分配内存给进程。如果进程的内存需求小于一个页的大小,页中未使用的部分就会被浪费。例如,如果一个进程需要3KB内存,而页大小为4KB,则会浪费1KB。

根据Internal Fragmentation vs. External Fragmentation in Paging | Baeldung on Computer Science,内部碎片是由于“内存分配规则导致的,内存以固定大小的块提供,即使进程只需要部分空间,整个块也会被分配”。

从How is there internal fragmentation in paging and no external fragmentation? - Stack Overflow的讨论来看,内部碎片的例子是:如果页大小为1024KB,进程分配1025KB,则需要两个页,第二个页只用1KB,浪费1023KB。

解决方案分析
1. 选择合适的页大小

页大小的选择对内部碎片有直接影响。较小的页大小可以减少内部碎片,因为浪费的空间比例较低。例如,如果页大小为4KB,分配3KB的进程浪费1KB(25%浪费);如果页大小为64KB,分配3KB的进程浪费61KB(95%浪费)。因此,较小的页大小更适合小内存需求的应用。

然而,较小的页会增加页表的大小和TLB(Translation Lookaside Buffer)压力,从而降低性能。根据operating system - If I Increase page size then internal fragmentation will increase. How? - Stack Overflow,“较小的页确保分配更接近实际需求,减少内部碎片”。

但从operating systems - How does increasing the page size affect the number of page faults? - Computer Science Stack Exchange,较大的页可以减少页故障次数,因为每次故障加载更多内存,但会增加内部碎片。

因此,页大小的选择需要权衡内部碎片和性能开销,通常由系统设计者根据典型工作负载决定。

2. 支持多种页大小

一些现代操作系统支持多种页大小,例如x86-64架构支持4KB、2MB和1GB页。通过使用大页(huge pages),可以减少页的数量,从而潜在地降低内部碎片,尤其对于大内存分配。

根据Washington - CSE451 Homework 4 Solutions的第9.20节,“使用多种页大小允许分配刚好足够大的页来处理所需内存,从而降低内部碎片的程度”。例如,对于一个需要5MB的进程,可以使用多个2MB页和4KB页的组合,而不是全部使用4KB页,这样可以减少最后一个页的浪费。

在Linux中,Transparent Huge Pages(THP)可以自动将频繁使用的4KB页提升为2MB页,这虽然主要为了减少TLB压力,但也可能在某些情况下减少内部碎片。

然而,使用大页可能增加内部碎片的风险,例如为1MB的分配分配2MB页会浪费1MB。因此,这种方法更适合大内存分配,且分配大小接近页大小的倍数。

3. 进程内高效内存分配

操作系统分配整页给进程后,进程内部的内存分配器(如malloc)可以管理这些页,以减少内部碎片。例如,使用内存池(memory pools)或slab分配器可以将小内存分配集中管理,减少浪费。

根据Fragmentation (computing) - Wikipedia,“设计变化如使用内存池可以在动态内存分配中减少内部碎片,通过将开销分散到更多对象上”。

从memory management - Understanding how internal fragmentation occurs in systems using only paging with huge page size - Computer Science Stack Exchange的讨论来看,“内部碎片总是存在,因为操作系统以页大小的倍数分配内存,消费者可能不需要整个页,浪费部分就是内部碎片”,但通过进程内的分配策略可以减轻。

例如,slab分配器可以为常见的小对象预分配固定大小的块,减少碎片。Buddy系统虽然主要用于管理空闲内存块,但也可以间接帮助减少进程内的浪费。

4. 其他考虑

一些系统可能提供动态调整页大小或允许应用程序请求特定页大小的机制,但这在大多数操作系统中不常见。根据Paging and Fragmentation: What They Are and How to Optimize Them - LinkedIn,页大小的选择还需考虑硬件特性(如缓存大小、内存总线)和访问模式。

此外,内部碎片通常被视为分页系统的权衡,因为它消除了外部碎片,并简化了内存管理。根据Difference between Internal and External fragmentation | GeeksforGeeks,“分页没有外部碎片,但内部碎片是不可避免的”。

争议与复杂性

关于最佳解决方案存在争议。例如,使用大页是否总是减少内部碎片?从operating system - How does the page size affected on internal fragmentation? - Stack Overflow的讨论来看,“如果页大小增加,平均浪费的字节数会增加”,因为每个分配需要向上取整到页大小。

此外,某些嵌入式系统或实时系统可能使用自定义内存分配器来进一步减少碎片,但这不适用于通用操作系统。

总结与建议

证据倾向于认为,分页中的内部碎片可以通过以下方法减轻:

  • 选择较小的页大小以减少浪费,但需权衡性能开销。
  • 支持多种页大小,尤其是大页,适合大内存分配。
  • 进程内使用高效内存分配策略,如内存池或slab分配。

然而,由于分页本质上使用固定大小的页,内部碎片无法完全消除。这是系统设计中的权衡,开发者应根据应用需求选择合适的策略。

以下是分页和分段碎片的对比表:

特性分页分段
块大小固定(例如4KB)可变(根据逻辑单元)
外部碎片通常没有可能有
内部碎片有(页未完全使用)通常较少(精确分配)
适用场景现代操作系统,高效内存利用早期系统,逻辑组织清晰
关键引用
  • Difference between Internal and External fragmentation | GeeksforGeeks
  • Internal Fragmentation vs. External Fragmentation in Paging | Baeldung on Computer Science
  • How is there internal fragmentation in paging and no external fragmentation? - Stack Overflow
  • operating system - If I Increase page size then internal fragmentation will increase. How? - Stack Overflow
  • operating systems - How does increasing the page size affect the number of page faults? - Computer Science Stack Exchange
  • Washington - CSE451 Homework 4 Solutions
  • Fragmentation (computing) - Wikipedia
  • memory management - Understanding how internal fragmentation occurs in systems using only paging with huge page size - Computer Science Stack Exchange
  • operating system - How does the page size affected on internal fragmentation? - Stack Overflow
  • Paging and Fragmentation: What They Are and How to Optimize Them - LinkedIn

直接回答

关键点:

  • 代码展示了虚拟内存系统中分页和TLB(转换旁视缓冲器)的地址翻译过程。
  • 它处理TLB命中和缺失,检查访问权限,并管理页面表条目(PTE)。
  • 研究表明,这反映了现代操作系统中高效的内存管理方式。

代码功能概述
这段伪代码描述了如何将虚拟地址转换为物理地址。它首先尝试使用TLB快速查找,如果失败(TLB缺失),则通过页面表查找并更新TLB。过程包括检查访问权限,如果不允许访问,会引发保护故障或分段故障。

TLB命中与缺失

  • TLB命中:如果TLB中有翻译,直接计算物理地址并访问内存。
  • TLB缺失:如果TLB没有翻译,代码会访问页面表,获取物理帧号(PFN),并将结果插入TLB,然后重试指令。

权限与故障处理

  • 代码检查保护位,确保访问权限。如果无效,会引发保护故障或分段故障(如页面不存在)。

与分页的关系
这与分页机制相关,分页将内存分为固定大小的页面,通过页面表映射虚拟地址到物理地址,TLB用于加速此过程。相比分段,分页减少了碎片,简化了管理。


虚拟内存地址翻译过程分析

详细报告

引言

虚拟内存是现代操作系统中的核心技术,允许程序使用比物理内存更大的地址空间。通过分页和TLB(转换旁视缓冲器),系统高效地管理内存访问。本报告详细分析了用户提供的伪代码,解释其在虚拟内存地址翻译中的作用,并将其置于从分段到分页的演变背景下。

代码分析
    VPN = (VirtualAddress & VPN_MASK) >> SHIFT(Success, TlbEntry) = TLB_Lookup(VPN)if (Success == True)    // TLB Hitif (CanAccess(TlbEntry.ProtectBits) == True)Offset   = VirtualAddress & OFFSET_MASKPhysAddr = (TlbEntry.PFN << SHIFT) | OffsetAccessMemory(PhysAddr)elseRaiseException(PROTECTION_FAULT)else    // TLB MissPTEAddr = PTBR + (VPN * sizeof(PTE))PTE = AccessMemory(PTEAddr)if (PTE.Valid == False)RaiseException(SEGMENTATION_FAULT)else if (CanAccess(PTE.ProtectBits) == False)RaiseException(PROTECTION_FAULT)elseTLB_Insert(VPN, PTE.PFN, PTE.ProtectBits)RetryInstruction()
  1. 提取虚拟页面号(VPN):

    • 代码行 VPN = (VirtualAddress & VPN_MASK) >> SHIFT 通过掩码和移位操作从虚拟地址中提取VPN。这是分页系统中的关键步骤,将虚拟地址分为页面号和页面内偏移量。
  2. TLB查找:

    • (Success, TlbEntry) = TLB_Lookup(VPN) 尝试在TLB中查找VPN的翻译。TLB是缓存,存储最近使用的虚拟到物理地址映射,以加速访问。
  3. 处理TLB命中:

    • 如果TLB命中(Success == True),代码检查保护位 CanAccess(TlbEntry.ProtectBits)
    • 如果允许访问,提取偏移量 Offset = VirtualAddress & OFFSET_MASK,计算物理地址 PhysAddr = (TlbEntry.PFN << SHIFT) | Offset,然后访问内存 AccessMemory(PhysAddr)
    • 如果不允许访问,引发保护故障 RaiseException(PROTECTION_FAULT)
  4. 处理TLB缺失:

    • 如果TLB缺失(Success == False),代码计算页面表条目(PTE)地址 PTEAddr = PTBR + (VPN * sizeof(PTE)),其中PTBR是页面表基址寄存器。
    • 访问内存获取PTE PTE = AccessMemory(PTEAddr)
    • 检查PTE有效性:如果无效(PTE.Valid == False),引发分段故障 RaiseException(SEGMENTATION_FAULT)
    • 如果有效但访问不允许(CanAccess(PTE.ProtectBits) == False),引发保护故障。
    • 如果有效且允许访问,将翻译插入TLB TLB_Insert(VPN, PTE.PFN, PTE.ProtectBits),然后重试指令 RetryInstruction()
与虚拟内存的联系

这段代码体现了分页机制的核心特点:

  • 分页:内存被划分为固定大小的页面(例如4KB),虚拟地址通过页面表映射到物理帧。
  • TLB:TLB缓存最近的翻译,减少页面表访问的开销,提高性能。
  • 权限检查:通过保护位确保内存访问的安全性,防止非法访问。
从分段到分页的过渡

早期的操作系统(如Multics)使用分段,内存分为大小可变的段,适合逻辑组织,但存在外部碎片和管理复杂性。分页的引入解决了这些问题:

  • 分页使用固定大小的页面,消除了外部碎片,简化了内存分配。
  • 硬件支持(如MMU)优化了分页性能,TLB进一步加速了地址翻译。
  • 现代系统(如Linux)主要依赖分页,分段作用被最小化(如x86-64中分段配置为覆盖整个地址空间)。

这段代码反映了分页的主导地位,特别是在TLB和页面表的交互中,体现了效率和简单性的追求。

技术细节与性能
  • TLB性能:TLB通常有64-128个条目,高关联性(如4路组关联),命中时间约10ns。缺失时需要页面表遍历,增加内存访问开销。
  • 页面表大小:对于20位VPN,页面表大小约为4MB(2^20 * 4字节),多级页面表(如两级分页)进一步优化空间效率。
  • 倒排页面表:对于大型地址空间,可使用哈希表映射,但需要处理冲突,TLB仍用于缓存最近翻译。
组件功能描述示例性能
TLB缓存VPN到PFN的映射,加速翻译命中率高,约10ns
页面表存储所有虚拟到物理映射,PTE含PFN等信息大小视VPN位数
PTBR页面表基址寄存器,指向页面表起始地址硬件寄存器
保护位检查访问权限,防止非法访问引发故障如PROTECTION_FAULT
上下文与来源

代码可能来源于操作系统课程讲义,如CSCI3431的TLB相关内容,反映了标准教学材料中的地址翻译示例。相关资源如USC CS356虚拟内存幻灯片提供了类似解释,强调TLB和分页的作用。

结论

这段伪代码详细展示了分页和TLB在虚拟内存管理中的作用,体现了从分段到分页的演变趋势。分页通过固定页面和高效的TLB支持,解决了分段的碎片和复杂性问题,成为现代操作系统的核心机制。


关键引文
  • USC CS356虚拟内存教学幻灯片
  • UT Austin CS372虚拟内存讲义
  • CSCI3431操作系统课程TLB讲义
http://www.xdnf.cn/news/3414.html

相关文章:

  • AVPro Video加载视频文件并播放,可指定视频文件的位置、路径等参数
  • 运用ESS(弹性伸缩)技术实现服务能力的纵向扩展
  • foxmail时不时发送不了邮件问题定位解决过程
  • 苍穹外卖11
  • Windows查看和修改IP,IP互相ping通
  • 使用模块中的`XPath`语法提取非结构化数据
  • Learning vtkjs之ImageMarchingCubes
  • 100 个 NumPy 练习
  • centos安装nginx
  • 新手小白如何查找科研论文?
  • 2025深圳杯东三省数学建模竞赛选题建议+初步分析
  • 26个脑影像工具包合集分享:从预处理到SCI成图
  • 为什么定位关闭了还显示IP属地?
  • 软考中级-软件设计师 数据库(手写笔记)
  • TS类型体操练习
  • Rancher 2.6.3企业级容器管理平台部署实践
  • ESP32-C3 Secure Boot 使用多个签名 Key
  • FEKO许可管理
  • YOLO11改进-模块-引入跨模态注意力机制CMA 提高多尺度 遮挡
  • 6轴、智能、低功耗惯性测量单元BMI270及其OIS接口
  • 开源 RAG 框架对比:LangChain、Haystack、DSPy 技术选型指南
  • 常用矩阵求导
  • Java父类、子类实例初始化顺序详解
  • 92.一个简单的输入与显示示例 Maui例子 C#例子
  • 论文速读 - 通过提示工程创建全面的合成数据集以支持医疗领域模型训练
  • 【Scrapy】简单项目实战--爬取dangdang图书信息
  • 柯希霍夫积分法偏移成像中数据分布不均匀的处理方法
  • Windows和 macOS 上安装 `nvm` 和 Node.js 16.16.0 的详细教程。
  • 深度解析| 信创浪潮下,传统AD域如何破局?
  • HCIP-security常见名词