wordpress 推荐返利,聊城seo培训,安一个网需要多少钱,开微信小程序要钱吗上几篇文章学习了任务切换相关知识#xff0c;如下#xff1a;
【OS学习笔记】二十六 保护模式八#xff1a;任务门—任务切换【OS学习笔记】二十七 保护模式八#xff1a;任务切换的方法之----jmp与call的区别以及任务的中断嵌套
今天继续学习保护模式下的分页机制。本篇…上几篇文章学习了任务切换相关知识如下
【OS学习笔记】二十六 保护模式八任务门—任务切换【OS学习笔记】二十七 保护模式八任务切换的方法之----jmp与call的区别以及任务的中断嵌套
今天继续学习保护模式下的分页机制。本篇文章先介绍段页式内存管理的基本概念。
1、回顾
分段机制我们已经再熟悉不过了前面我们学习过的所有内容都是在分段的机制下工作的。
对于一个多任务系统。如果任务比较多很有可能导致物理内存不够分配的情况。这个时候操作系统的作用就体现出来了。每个段的描述符都有一个TYPE字段。其中有一个A位每当访问一个段时该段的A位就记录该段最近是否被访问过。
当一个段很长时间不被访问操作系统就去将该段从内存中移出去移到磁盘。从而可以空出一块空闲的内存空间可以供其他程序的段来运行。当这个段页不怎么被访问了操作系统用同样的方法将其移出去再加载另一个需要被访问的段。
但是因为段的长度不确定在分配内存时可能会发生内存空间中的区域小于要加载的段或者空闲区域远远大于要加载的段。在前一种情况下需要另外寻找合适的空闲区域在后一种情况下分配会成功但是太过于浪费。
为了解决这个问题从80386开始引入了分页机制。
分页机制从总体上来讲使用长度固定的页来代替长度不一定的段借此来解决因为段长度不同而带来的内存空间的管理问题。
2、简单的分页模型
2.1 回顾分段模型
如下图是一个分段管理机制的模型图 如上图在分段机制下段地址和偏移地址经过段部件后得到的线性地址就是实际的物理地址。分段机制还是很好理解的。这里我们不再赘述。
2.2 分页机制概述
一旦采用分页式内存管理就应该把4GB内存分成大小相同的页。如下图 页的最小单位是4KB也就是4096字节用16进制表示就是0x1000。4GB的物理内存可以划分为1048576个页。很显然页的物理地址其低12位始终位0.
注意段管理机制是无法关闭的。段基址是Intel处理器最基本的管理机制即使开启分页功能分段机制依然存在。段部件依然工作。
在分页机制下程序依然是按照分段来组织的。问题在于如何将程序中比较大的段映射到大小相同的页面上呢
内存分配涉及到段的分配和页的分配。 段的分配就是在虚拟地址空间分配各个段页的分配就是在物理内存中个各个段分配相应数量的页面。如下图
如上图左边的是4GB的虚拟地址空间右边是真实的物理内存空间。
在分页模式下操作系统一般为每个任务创建一个独立的4GB的虚拟地址空间。因此操作系统首先将程序的段映射到相应的虚拟地址空间中在这个过程中也是需要在虚拟地址空间中寻找空闲空间的。然后为虚拟地址空间中的各个段分配相应数量的物理地址空间这是真实的执行代码的内存地址空间。
如上图段肯定是需要连续的但是一个段被分配到物理内存中不一定需要分配连续的页面。其实往往段在内存中对应的页面都是不连续的。
注意4GB的虚拟内存空间不可能保存任何数据和代码因为它是虚拟的它只是用来指示内存的使用情况。
2.3 页映射表概述
因为我们现在引入了虚拟内存所以之前分段机制下段部件输出的地址本身是实际物理地址现在有了虚拟内存我门的程序中的代码和数据首先是需要映射到虚拟内存的所以现在段部件输出的地址就是虚拟地址。也就是说从段部件输出的线性地址此时是虚拟地址。
为了根据虚拟地址线性地址找到真实的物理地址。操作系统必须维护一张表把线性地址虚拟地址转换成物理地址这是一个反过程为什么是反过程下面有讲解。
如下图
因为有1048576个页所以页转换表也是需要有1048576项。这是个一维表格。每个表项占4字节内容为页的物理地址。
这个表格的用法是这样的
因为页的大小是4KB故线性地址的低12位可用于访问页内偏移高20位可用于指定一个物理页。因此把线性地址的高20位当成索引乘以4作为表内偏移量从表中取出一个双字那就是该线性地址所对应的页的物理地址。线性地址的低12位是页内偏移量用页物理地址加上页内偏移量就是最终的物理内存地址。
现在的问题在于页映射表中对应的页的物理地址是怎么来的。这其实是一个反过程。当程序加载时操作系统会位程序虚拟一个虚拟地址空间出来然后将程序的段分配到这个虚拟地址空间中。当腰执行某一个段时将该段拆分成一个或多个页在物理内存中寻找相应的空闲页然后将段分配给找到的页再将这个页的地址与刚刚那个段的地址回写到页映射表。那么下次再访问该段时就知道它所对应的页的物理地址了。
这就是先找到空闲页然后将对应的映射关系回写到页映射表这就是一个反过程。
我们知道一般现在是多任务系统对于多任务每一个任务都有一个4GB的虚拟地址空间并且每一个任务都有一个页映射表。如下图 从上图我们很容易理解一件事假设一个程序被多次加载到内存中执行那么相当于一个程序有多个执行实体。这多个执行实体对应的虚拟地址空间是一模一样的。那么它们相同的段最终产生的线性地址将是一模一样的。因为它们每一个任务都有一个页映射表所以它们对应的物理地址是不一样的。
3 总结
今天简单的学习段页式内存管理机制的概念。并简单了解页映射表机制的相关概念。
详细的内容还是要参考原书籍这里只是做一个简单的总结。
学习探讨加个人 qq1126137994 微信liu1126137994