页式内存管理
CPU的页式内存管理单元,负责把一个线性地址,最终翻译为一个物理地址。从管理和效率的角度出发,线性地址被分为以固定长度为单位的组,称为页(page),例如一个32位的机器,线性地址最大可为4G,可以用4KB为一个页来划分,这页,整个线性地址就被划分为一个totall_page[2^20]的大数组,共有2的20个次方个页。这个大数组我们称之为页目录。目录中的每一个目录项,就是一个地址——对应的页的地址。
另一类“页”,我们称之为物理页,或者是页框、页桢的。是分页单元把所有的物理内存也划分为固定长度的管理单位,它的长度一般与内存页是一一对应的。
这里注意到,这个total_page数组有2^20个成员,每个成员是一个地址(32位机,一个地址也就是4字节),那么要单单要表示这么一个数组,就要占去4MB的内存空间。为了节省空间,引入了一个二级管理模式的机器来组织分页单元。如图所示:
(1) 分页单元中,页目录是唯一的,它的地址放在CPU的cr3寄存器中,是进行地址转换的开始点。
(2) 每一个活动的进程,因为都有其独立的对应的虚似内存(页目录也是唯一的),那么它也对应了一个独立的页目录地址。运行一个进程,需要将它的页目录地址放到cr3寄存器中,将别个的保存下来。
(3) 每一个32位的线性地址被划分为三部份,面目录索引(10位):页表索引(10位):偏移(12位)
可依据以下步骤进行转换:
- 从cr3中取出进程的页目录地址(操作系统负责在调度进程的时候,把这个地址装入对应寄存器);
- 根据线性地址前十位,在数组中,找到对应的索引项,因为引入了二级管理模式,页目录中的项,不再是页的地址,而是一个页表的地址。(又引入了一个数组),页的地址被放到页表中去了。
- 根据线性地址的中间十位,在页表(也是数组)中找到页的起始地址;
- 将页的起始地址与线性地址中最后12位相加,得到最终我们想要的物理地址;
这个转换过程,应该说还是非常简单地。全部由硬件完成,虽然多了一道手续,但是节约了大量的内存,还是值得的。
二级模式空间的节约是从两个方面实现的:
A. 如果一级页表中的一个页表条目为空,那么那所指的二级页表就根本不会存在。这表现出一种巨大的潜在节约,因为对于一个典型的程序,4GB虚拟地址空间的大部份都会是未分配的;
B. 只有一级页表才需要总是在主存中。虚拟存储器系统可以在需要时创建,并页面调入或调出二级页表,这就减少了主存的压力。只有最经常使用的二级页表才需要缓存在主存中。不过Linux并没有完全享受这种福利,它的页表目录和与已分配页面相关的页表都是常驻内存的。
值得一提的是,虽然页目录和页表中的项,都是4个字节(32位),但是它们都只用高20位,低12位屏蔽为0。把页表的低12屏蔽为0是很好理解的,因为这样它刚好和一个页面大小对应起来,大家都成整数增加。计算起来就方便多了。但是,为什么同时也要把页目录低12位屏蔽掉呢?因为按同样的道理,只要屏蔽其低10位就可以了。不过我想,因为12>10,这样可以让页目录和页表使用相同的数据结构,比较方便。
Linux的页式内存管理
前面说了i386的二级页管理架构,不过有些CPU,还有三级,甚至四级架构,Linux为了在更高层次提供抽像,为每个CPU提供统一的界面。提供了一个四层页管理架构,来兼容这些二级、三级、四级管理架构的CPU。这四级分别为:
- 页全局目录PGD(对应刚才的页目录)
- 页上级目录PUD(新引进的)
- 页中间目录PMD(新引进的)
- 页表PT(对应刚才的页表)。
整个转换依据硬件转换原理,只是多了二次数组的索引罢了,如下图:
那么对于使用二级管理架构32位的硬件,现在又是四级转换了,它们怎么能够协调地工作起来呢?
从硬件的角度,32位地址被分成了三部份——也就是说,不管理软件怎么做,最终落实到硬件,也只认识这三个部分。
从软件的角度,由于多引入了两部份,,也就是说,共有五部份。要让二层架构的硬件认识五部份也很容易,在地址划分的时候,将页上级目录和页中间目录的长度设置为0就可以了。这样,操作系统见到的是五部份,硬件还是按它死板的三部份划分,也不会出错。
这样,虽说是多此一举,但是考虑到64位地址,使用四层转换架构的CPU,我们就不再把中间两个设为0了,这样,软件与硬件再次和谐——抽像就是强大呀!
现在来理解Linux针对硬件的花招,因为硬件根本看不到所谓PUD,PMD。所以本质上要求PGD索引,直接就对应了PT的地址。而不是再到PUD和PMD中去查数组(虽然它们两个在线性地址中,长度为0,2^0 =1,也就是说,它们都是有一个数组元素的数组)。那么,内核如何合理安排地址呢?
从软件的角度上来讲,因为它的项只有一个,(32位),刚好可以存放与PGD中长度一样的地址指针。那么所谓先到PUD,到到PMD中做映射转换,就变成了保持原值不变,直接转手就可以了。这样就实现了“逻辑上指向一个PUD,再指向一个PMD,但在物理上是直接指向相应的PT的这个抽像,因为硬件根本不知道有PUD、PMD这个东西”。
分享到:
相关推荐
页式存储管理是一种广泛采用的内存管理策略,它将连续的逻辑地址空间划分为固定大小的页,并在物理内存中分配不连续的块来存储这些页。这种技术有其独特的优点和挑战,下面我们将详细探讨页式存储管理的相关知识点。...
动态页式存储管理是操作系统内存管理中的一个重要概念,主要用于虚拟内存的实现。它与静态页式存储管理的主要区别在于,动态页式系统在进程运行时根据需要动态地为进程分配和回收页面,而不是在进程开始执行时一次性...
【页式内存管理基础】 页式内存管理是操作系统中一种高效、灵活的内存分配机制,尤其在多任务操作系统如Windows中至关重要。它通过虚拟地址和物理地址之间的映射,使得每个进程可以拥有独立的、连续的虚拟地址空间...
这些文件在运行或分析内存管理和CPU调度模拟时可能作为输入或输出,帮助我们理解系统的实际运行情况。 总的来说,CPU调度模拟和内存分配管理是操作系统中复杂且关键的两个方面,它们直接影响到系统的性能和可靠性。...
请求调页式内存管理系统是一种现代计算机系统中广泛采用的内存管理技术,它的核心目标是有效地利用有限的物理内存资源,同时提供对虚拟地址空间的高效访问。在这样的系统中,程序的逻辑地址空间被分割成固定大小的页...
在这个“操作系统课程设计 c#版(cpu,内存,磁盘)”中,我们将探讨如何使用C#编程语言来模拟操作系统的几个关键组件:CPU调度、内存管理、磁盘管理和I/O管理。以下是对这些主题的详细说明: 1. **CPU管理**: - ...
操作系统实验三的主题是“请求页式存储管理”,这是操作系统中内存管理的重要部分,尤其是在现代多任务环境下。在本实验中,我们将深入理解并实践如何实现这种内存管理策略。请求页式存储管理是传统页式存储管理的...
在多任务和多用户的环境下,操作系统采用各种内存管理技术来确保高效、安全地使用内存资源。其中,段页式存储管理是一种常见的虚拟内存机制,它结合了段式和页式存储管理的优点。在本文中,我们将深入探讨段页式存储...
Window s 中段页式内存管理硬件实现剖析 Windows 操作系统在 80x86CPU 中的内存管理单元(MMU)的硬件工作原理,实现了内存单元的段页式寻址、保护检查和虚拟内存的实现过程,並克服了内存碎片问题。MMU 由段单元...
操作系统中的页式存储管理是一种内存管理技术,它将连续的逻辑地址空间划分为固定大小的块,称为“页”,并将这些页分散存储在物理内存的不连续区域,形成离散分配的方式。这种技术的主要目标是提高内存利用率和解决...
总的来说,X86 CPU的地址形成机制是其复杂性的一个体现,特别是段式管理和A20 Gate的控制,它们在实模式和保护模式下扮演着至关重要的角色,直接影响着系统对内存的访问和管理。理解这些机制对于系统开发者和硬件...
在 Linux 操作系统中,内存管理子系统主要由 CPU 的寻址方式、段式内存管理和页式内存管理两部分组成。 1. 寻址方式 在 Linux 操作系统中,CPU 的寻址方式可以分为物理地址、逻辑地址和线性地址三种。 物理地址是...
本文主要探讨的是段式和页式管理这两种常见的内存管理方式,以及它们之间的区别。 1. 连续分配存储管理 连续分配是指为一个用户程序分配一段连续的内存空间。这种管理方式分为单一连续存储管理和分区式存储管理。 ...
JavaScript运行在浏览器环境中,其执行效率和内存管理受到浏览器沙箱机制的限制。每个浏览器对JavaScript的实现可能存在差异,因此在进行CPU和内存监控时,需要考虑兼容性问题。 2. **性能API**: 浏览器提供了`...
页式、段式和段页式管理是常见的内存管理策略,其中页式管理通过页表进行地址转换,段式管理按逻辑单元分配内存,段页式结合了两者的优点。 4. **文件管理**:文件系统管理文件的创建、删除、读写和检索,以及存储...
页式存储管理是一种常见的内存管理技术,它将程序的逻辑地址空间划分为固定大小的块,称为“页”。本实验旨在帮助我们深入理解页式存储管理和虚拟内存的工作原理,特别是页面淘汰算法和地址转换过程。 首先,我们来...
在操作系统领域,页式存储管理是一种重要的内存管理方式,它被广泛应用于现代计算机系统中。页式管理的主要目标是有效地分配和使用主存资源,同时解决进程与内存之间的地址映射问题,使得程序可以在不连续的内存空间...
其中,页式存储管理是一种常见的内存管理方式。 页式存储管理将物理内存划分为固定大小的块,称为“页”。同样,程序在磁盘上的虚拟地址空间也被分割成相同大小的逻辑块,称为“页框”或“页”。这样,一个进程的...
页式存储管理是一种常见的内存管理方式,它将内存分割成固定大小的块,称为“页”,并将程序的逻辑地址空间也划分为相同大小的页。地址转换是页式存储管理中的关键环节,它负责将程序中的逻辑地址转换为实际物理地址...