机器上电,CPU进入实模式,从物理地址0xFFFFFFFF0处开始执行初始化代码,设置基本系统功能操作必要的数据结构信息,例如处理中断和异常的IDT表。接下来,如果继续在保护模式工作,需要加载操作系统模块;如果要进入实模式,那么需要进行模式切换。

1.进入保护模式时的初始化操作

处理器能够进入到保护模式之前,需要操作系统加载和初始化软件必须在内存中设置好保护模式下使用的数据结构的基本信息。这些数据结构包括
1)保护模式中断描述符表IDT
2)GDT
3)任务状态段TSS
4)LDT
5)如果使用分页机制,起码要设置一个页目录和一个页表
6)处理器切换到保护模式下运行的代码段

能够切换到保护模式运行之前,需要设置以下系统寄存器
1)GDTR
2)中断描述符表基地址寄存器
3)控制寄存器CR1~CR3

初始化这些数据结构、代码模块和系统寄存器之后,通过设置CR0寄存器的保护模式标志位PE,处理器就可以切换到保护模式运行了。

1.1保护模式系统结构表

为了实现无分页的平坦内存模型,必须设置至少一个代码段和数据段到GDT。在GDT可以使用之前,必须要使用LGDT指令将GDT表的基地址和长度加载到GDTR之中。

多段模型需要操作系统的其他段,以及用于每个应用程序的段和LDT表段。

1.2保护模式异常和中断初始化

初始化代码必须设置一个保护模式IDT,其中至少包含有处理器可能产生的每个异常向量对应的门描述符。

在可以使用IDT之前,必须使用LIDT指令将IDT表基地址和长度加载到IDTR寄存器之中。

1.3分页机制初始化

分页寄存器由控制寄存器CR0中的PG标志设置,在设置PG标志之前,必须先初始化以下数据结构和寄存器:
1)软件必须在物理内存中建立至少一个页目录和一个页表
2)把页目录表的物理基地址加载到CR3寄存器中
3)处理器处在保护模式下

为了保持兼容性,设置PG标志时候必须遵从以下规则:
1)设置PG标志的指令应该立即跟随一条JMP指令
2)设置PG标志和JMP之间的代码必须来自对等映射(跳转之前的线性地址与开启分页之后的物理地址相同)的一个页面上。

1.4多任务初始化

如果需要使用多任务机制或者允许改变特权级,那么软件初始化代码需要设置一个TSS及相应的TSS段描述符(因为特权级0、1、2的各栈段指针都需要从TSS中取得)。

在处理器切换到保护模式以后,可以用LTR指令把TSS段描述符的选择符加载到任务寄存器TR中。在保护模式中,软件进行第一次任务切换之前必须首先加载在TSS段的选择符,因为任务切换会把当前任务状态复制到该TSS中。

在LTR指令执行之后,随后对任务寄存器的操作由任务切换进行。

2.模式切换

2.1切换到保护模式

切换到保护膜是之前,必须首先加载一些起码的系统数据结构和代码模块。切换操作的步骤:
1)使用cli指令禁止终端
2)执行LGDT命令,加载GDT
3)设置CR0(PE位)
4)mov cr0 之后立刻跟一个远程JMP或者远程call指令
5)选择性执行LLDT
6)执行LTR指令,用初始保护模式任务的段选择符或者可写内存区域的段描述符加载任务寄存器TR
7)进入保护模式后,段寄存器仍人含有在实地址模式时候的内容,需要进一步处理
8) LIDT
9)开中断 sti

2.2切换回来实模式

1)禁止终端
2)如果开启分页机制,那么需要执行:
把程序的控制转移到对等映射的线性地址处
确保GDT和LDT在对等映射的页面上
清楚CR0中的PG标志
设置CR3寄存器为0x00,用于刷新TLB缓冲
3)把程序的控制转移到长度为64KB(0xFFFF)的可读段中。这部操作使用实模式要求的段长度加载CS寄存器
4)使用含有一下设置值的描述符选择符来加载SS、DS、ES、FS、GS
段长=64kb
颗粒 G=0
向上扩展 E=0
可写 w=1
存在 p=1
5)执行LIDT指令来指向在1MB实模式地址范围内的实地址模式中断表
6)清楚cr0中的PE位
7)执行一个远跳转指令跳转到一个实模式程序中。这个操作会刷新指令队列,并且为CS寄存器加载何时的基地址和访问权限值
8)加载实地址模式程序代码会使用的SS、DS、ES、FS、GS

9)执行STI指令开启可屏蔽硬件中断,并且执行必要的硬件操作开启NMI中断

这里,我们特别留意其中的第4步和第8步,尤其是第4步中,设置SS等寄存器的目的是为了保证SS等寄存器的不可见部分,到了实模式之下,仍然有正确的属性值。

参考:《linux内核0.12完全剖析》

保护模式及其编程——实模式与保护模式的切换相关推荐

  1. ASM:《X86汇编语言-从实模式到保护模式》第14章:保护模式下的特权保护和任务概述...

    ★PART1:32位保护模式下任务的隔离和特权级保护  这一章是全书的重点之一,这一张必须要理解特权级(包括CPL,RPL和DPL的含义)是什么,调用门的使用,还有LDT和TSS的工作原理(15章着重 ...

  2. 保护模式下C语言编程,关于windows ring3保护模式与中断调用

    关于windows ring3保护模式与中断调用 最近发现了一个问题,就是进行某些中断调用时,并不如想象中的那样执行. 比如一个简单的ROM BASIC调用,我的机器(XP系统)弹出一个对话框:NTV ...

  3. 什么是隐私浏览模式?隐私模式下的浏览器就一定保护用户隐私吗?

    现在市面上的浏览器普遍都有的一个基础功能就是"隐私浏览模式",很多人都以为只要开启这个模式自己上网就可以不被追踪识别,误以为自己的隐私得到了保障.其实大错特错! 即使我们开启了&q ...

  4. 《大话设计模式(C#实现)》(Yanlz+VR云游戏+Unity+SteamVR+云技术+5G+AI+设计模式+GoF+UML+单例模式+观察者模式+抽象工厂+代理模式+框架编程+立钻哥哥++OK+)

    <大话设计模式(C#实现)> 版本 作者 参与者 完成日期 备注 YanlzFramework_GoF_V01_1.0 严立钻 2020.02.10 ##<大话设计模式(C#实现)& ...

  5. 实战并发编程 - 08基于Guarded Suspension模式优化轮询while(true)

    文章目录 Guarded Suspension模式简介 看牙医的就诊流程 代码举例 总结与拓展 Guarded Suspension模式简介 guarded在这里是"保护"的意思: ...

  6. 实施微服务架构模式所面临的挑战

    实施微服务架构模式所面临的挑战 微服务架构.Docker容器.可编程基础架构.服务器租用cn.bluehost.com云计算和现代持续交付(CD)技术的新兴组合,使得通过软件开发实现业务价值的真正模式 ...

  7. 实战并发编程 - 04基于不可变模式解决并发问题_2

    文章目录 Pre 业务描述 短信服务商基本信息 短信路由网关 基于不可变模式改造代码 第一步先将SmsInfo改造为不可变对象 接着在需要将获取服务商列表的代码改造为防御性复制 接着提供一个直接替换S ...

  8. 非阻塞模式WinSock编程入门

    介绍 WinSock是Windows提供的包含了一系列网络编程接口的套接字程序库.在这篇文章中,我们将介绍如何把它的非阻塞模式引入到应用程序中.文章中所讨论的通信均为面向连接的通信(TCP),为清晰起 ...

  9. 多线程编程反模式_编程反模式

    多线程编程反模式 您是否曾经进行过代码审查,记录了非常高的WTF / m? 您是否想知道所有这些错误代码的原因是什么? 在大多数情况下,导致原因1的原因是使用设计和编码反模式. 如果您喜欢定义,请参见 ...

最新文章

  1. 前端之css引入方式/长度及颜色单位/常用样式
  2. 《深入理解计算机系统-程序结构》读书笔记
  3. ROI Align 在 R-FCN 中的推广:PSROI-Align(附代码)
  4. optee的栈指针和栈内存的介绍
  5. 广告中oCPX到底是如何进行优化的?
  6. 深度学习资料汇总(满满的干货)
  7. 前端开发怎么用php,做web前端开发怎么样?
  8. leetcode python3 简单题69. Sqrt(x)
  9. Spring DI如何给对象赋空值 以及 对 “” null 空值的总结
  10. Gym 100342J Triatrip (求三元环的数量) (bitset优化)
  11. 用代码块在new对象时set属性
  12. java mybatis缓存机制_mybatis缓存机制与陷阱
  13. 常见微型计算机外部输入设备,微型计算机常用外部设备
  14. 小菜的项目管理修炼之道
  15. COGS 2075. [ZLXOI2015][异次元圣战III]ZLX的陨落
  16. 「查漏补缺」2020 截止9月2日 秋招前端面试经历 (已整理答案)
  17. android之标准体重
  18. 在windows11上安装cuda,cudnn,以及GPU版的pytorch
  19. 算法--UR机器人位姿表示
  20. NOI2018 游记

热门文章

  1. hdu4561 连续最大积
  2. hdu2433 spfa+mark[x][u][v]优化
  3. 【Linux 内核】调度器 ⑤ ( put_prev_task、set_next_task 函数 | select_task_rq 函数 | migrate_task_rq 函数 )
  4. 【Linux 内核】宏内核与微内核架构 ( 操作系统需要满足的要素 | 宏内核 | 微内核 | Linux 内核动态加载机制 )
  5. 【Java 虚拟机原理】JDK 体系结构 | Java 源码运行原理 | Java 虚拟机内存
  6. 【Flutter】Flutter 布局组件 ( PhysicalModel 组件 )
  7. 【数据挖掘】关联规则挖掘 Apriori 算法 ( 关联规则 | 数据项支持度 | 关联规则支持度 )
  8. 【计算机网络】网络层 : BGP 协议 ( BGP 协议简介 | BGP 协议信息交换 | BGP 协议报文格式 | BGP-4 常用报文 | RIP 、OSPF、BGP 协议对比 )
  9. [JVM 相关] Java 新型垃圾回收器(Garbage First,G1)
  10. jsp经验-Filter