保护模式总结(四)——分页机制

2024-06-19 03:38

本文主要是介绍保护模式总结(四)——分页机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

       这是总结的最后一篇,来讲讲分页机制。为什么会有分页机制?如果没有分页机制,内存管理会出现“碎片化”的现象,另外,在虚拟存储中,将没有统一调度的内存大小。为了解决这些因为段长度不同而带来的各种内存管理问题,于是有了分页机制。

        页的最小单位是4K。引入分页机制之后,段部件获得的地址就不再是物理地址了,而是线性地址,也就是虚拟地址

                                                    

       于是线性地址和物理地址便存在一种一一映射的关系。那么映射关系如何记录呢?考虑建一张映射表。那么虚拟内存的每个页与其对应的物理内存页,都要记录在映射表里。一般来说,每个任务都可以拥有4GB的虚拟内存空间,而且每个任务都有自己的页映射表。那么我们可以计算一下,一个表4K字节,那么会有1M个表项,每个表项4字节,那么一张映射表大小是4M字节。是不是很大?是的,Intel的大叔们是不会允许这样的浪费存在的,于是现实情况是,多级的分页结构。

       两级的分页结构有页目录表页表。页目录表和每张页表的大小和页的大小一样,都是4KB。

       先看图:

                   

       页目录项中包含指定页表的物理基地址,页表项中包含着页的物理基地址。所以当我们给出一个虚拟地址的时候,页部件会把它分成三部分,首先通过CR3找到页目录,然后再通过第一部分:页面索引,找到相应页目录项,由此找到相应页表,再通过第二部分页表索引找到页表项,再由其找到物理页面,再由页内偏移地址找到具体的物理地址。那么一开始的CR3是什么呢?


       CR3给出了页目录表的基地址。CR0的31位PG(page),置1则打开分页机制。

       值得说明的是,地址转换是通过固件,也就是所谓的页部件自动计算的。所以我们不论在操作系统还是应用程序中,在开启了分页机制以后,所用到的都是虚拟地址,具体是什么物理地址,我们不用再去管,我们只用把页目录和页表设置好,页部件就会根据设置自动计算出物理地址。


————————————————分隔符————————————————————————————————————————


       讲完了分页机制顺带再补充点内容,关于中断和异常

中断没什么好说的,异常其实就是实模式中的内部中断。异常以严重性可分三种:

      1.故障Fault:通常可纠正

      2.陷阱Traps:截获了陷阱条件立即发生,通常用于调试

      3.终止Aborts:最严重的错误,程序和任务不能重新启动

      中断到了保护模式中,没了中断向量表,变成了类似GDT的IDT(中断描述符表 Interrupt Descriptor Table),同样还有中断描述符寄存器IDTR用于寻址IDT。

中断处理过程如图:


值得注意的是,中断过程若发生特权级的改变,要注意栈的处理。



——————————————————————再次分隔——————————————————————————————————————————

       看完这本《从实模式到保护模式》,感觉就是从处理器的角度去认识操作系统。有了这些硬件的基础,相信会对日后对操作系统的学习会有不少帮助!共勉!


这篇关于保护模式总结(四)——分页机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073902

相关文章

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

一文教你使用Python实现本地分页

《一文教你使用Python实现本地分页》这篇文章主要为大家详细介绍了Python如何实现本地分页的算法,主要针对二级数据结构,文中的示例代码简洁易懂,有需要的小伙伴可以了解下... 在项目开发的过程中,遇到分页的第一页就展示大量的数据,导致前端列表加载展示的速度慢,所以需要在本地加入分页处理,把所有数据先放

Redis存储的列表分页和检索的实现方法

《Redis存储的列表分页和检索的实现方法》在Redis中,列表(List)是一种有序的数据结构,通常用于存储一系列元素,由于列表是有序的,可以通过索引来访问元素,因此可以很方便地实现分页和检索功能,... 目录一、Redis 列表的基本操作二、分页实现三、检索实现3.1 方法 1:客户端过滤3.2 方法

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

Kubernetes常用命令大全近期总结

《Kubernetes常用命令大全近期总结》Kubernetes是用于大规模部署和管理这些容器的开源软件-在希腊语中,这个词还有“舵手”或“飞行员”的意思,使用Kubernetes(有时被称为“... 目录前言Kubernetes 的工作原理为什么要使用 Kubernetes?Kubernetes常用命令总

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制