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

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

相关文章

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL