【OS学习笔记】三十 保护模式九:段页式内存管理机制概述

上几篇文章学习了任务切换相关知识,如下:

  • 【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 总结

今天简单的学习段页式内存管理机制的概念。并简单了解页映射表机制的相关概念。

详细的内容还是要参考原书籍,这里只是做一个简单的总结。

学习探讨加个人:
qq:1126137994
微信:liu1126137994

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真人拳皇项目第六次Scrum总结——史经浩

今天,我们组开始了正式的编码阶段,前期plan的时候天马行空,现在是脚踏实地的coding了。在Scrum上,大家sync了一下各自的进展,如下: 今天 进度 问题及解决 明天 田飞 work item 37528:DirectX动画的de…

【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解

上一篇文章学习了:保护模式九:段页式内存管理机制概述 本篇文章接着学习以下内容: 页目录概念页表概念页目录、页表与页之间的关系虚拟地址(线性地址)到物理地址的具体变换过程。 1、页目录、页表和页的对应关系 第…

使用某个文件夹下的所有文件去替换另一个文件夹下及其子文件夹下存在的同名文件(Python实现)...

值此新年即将到来之际,在这献上今年最后一篇文章. 产生这个需求是在项目的一次图标替换上,当时给了我一堆新图标要替换原来的老图标,可是原来的老图标分布在某个文件夹下的各个子文件夹下面,而新图标全是在同一个目录下的. 手动替换的话,只能是搜索文件名后替换,但是文件很多太…

一款研发管理软件的对象标签介绍

如果你了解WIKI,WIKI中的所有信息链接以标签的方式网状关联。TOPO系统中实现了完整的TAG功能,区别于目前市面上的其他类似管理系统,TOPO系统中实现的标签功能更加彻底和全面,例如完全用户自定义TAG,系统中所有管理对象…

【OS学习笔记】三十四 保护模式十:中断和异常区别

上几篇文章学习了分页机制的一些原理: 【OS学习笔记】三十 保护模式九:段页式内存管理机制概述【OS学习笔记】三十一 保护模式九:页目录、页表和页三者的关系详解 今天继续学习保护模式下的关于中断与异常的概念。本文主要学习中断与异常的…

记录一次文件迁移

事情的经过是这样子的!数据库A表添加一条记录,**系统中B目录下就会多出5n个文件。随着系统运行3年多,B目录中的文件数已高达2M多,而这些文件恰恰又是用户高度频繁访问的。于是问题就来了,一方面是用户访问文件速度变慢…

【OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门

上一篇文章学习了中断与异常的概念:【OS学习笔记】三十四 保护模式十:中断和异常区别 本片文章接着学习以下内容: 中断描述符表中断门陷阱门 1 中断描述符表 我们前面讲了无数次,在实模式下,是由位于低地址的1M内存…

【OS学习笔记】三十六 保护模式十:通过中断发起任务切换----中断任务

上一篇文章学习了:OS学习笔记】三十五 保护模式十:中断描述符表、中断门和陷阱门 本篇文章接着上一篇文章学习中断任务。 我们在前面文章中一直在说通过中断发起任务切换,本文就是将之前没有说明白的内容:通过中断发起任务切换讲…

小议传统分层与新式分层,抑或与DDD分层

引言本文提到的分层只是软件架构上的分层。文中的传统分层指的是传统的三层结构:UI(界面表现层),BLL(业务逻辑层),DAL(数据访问层)。文中提出的观点也都是个人的一点认识,与任何组织…

WCF 第八章 安全 客户端认证

一个服务的客户端认证是通过向服务提供一系列信赖的声明。声明可以是任何形式,只要客户端和服务端理解这个格式并信赖它的来源就可以。 如果客户端和服务端共享一个秘密信息,比如一个用户名和密码,只要客户端通过一个合法认证发送数据&#x…

前端学习(205):animation动画库

动画库 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" conte…

【剑指offer - C++/Java】7、斐波那契数列

在线题目链接&#xff1a;斐波那契数列 文章目录1、题目描述2、题目分析3、代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1、题目描述 大家都知道斐波那契数列&#xff0c;现在要求输入一个整数n&a…

【剑指offer - C++/Java】8、跳台阶

在线题目链接&#xff1a;跳台阶 文章目录1、题目描述2、题目分析3、代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1、题目描述 一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青蛙跳…

【剑指offer - C++/Java】10、矩形覆盖

在线题目链接&#xff1a;矩形覆盖 文章目录1 题目描述2 题目分析3 代码3.1 递归方法3.11 Java代码3.12 C代码3.2 动态规划算法3.2 动态规划3.21 Java代码3.22 C代码3.3 循环方法3.31 Java代码3.32 C代码4、总结1 题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形…

【剑指offer - C++/Java】12、数值的整数次方

在线题目链接&#xff1a;数值的整数次方 文章目录1 题目描述2 题目分析2.1 方法1 循环2.11 Java代码2.12 C代码2.2 方法2 递归2.21 Java代码2.22 C代码3 总结1 题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 2 题目分析 2.1 方…

【剑指offer - C++/Java】14、链表中倒数第k的节点

在线题目链接&#xff1a;链表中倒数第k的节点 文章目录1 题目描述2 题目分析2.1 Java代码2.2 C代码3 总结1 题目描述 输入一个链表&#xff0c;输出该链表中倒数第k个结点。 2 题目分析 这道题比较简单。常规做法是先求出链表的总的节点个数n&#xff0c;然后再从头开始找第n-…

beta:scrum5

今天的工作 周一的工作 困难 王佳磊 收集数据&#xff0c;build了online的数据库, 38934 38939&#xff0c;收集更多数据&#xff0c;在新的API环境下&#xff0c;逐步发现并fix掉以前姓名到ID映射的bug. API的改动&#xff0c;ID的合并 肖巍&#xff0c;兰翠玲 等待测…

【软件开发底层知识修炼】十三 链接器-如何写出不依赖C库函数的代码

本文将综合以下4篇文章&#xff0c;学习如何写出不依赖libc库的程序&#xff1a; 【软件开发底层知识修炼】九 链接器-可重定位文件与可执行文件【软件开发底层知识修炼】十 链接器-main函数不是第一个被执行的函数【软件开发底层知识修炼】十一 链接器-链接脚本【软件开发底层…

前端学习(218):属性选择器

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/ html4/strict.dtd"> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"><title>属性选择器&…

【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用

前面几篇文章学习了链接器相关的内容。现在开始来学习GDB调试。我们的目的是通过这几篇文章将GDB调试完全学会。 文章目录1 为什么需要GDB2 GDB 的常规应用3 GDB调试程序实例4 总结1 为什么需要GDB 什么是GDB&#xff1f; GNU项目中的调试器&#xff08;gnu debuger&#xff0…