在loader程序中涉及到的CPU模式切换

简介: 在实模式下开启4GB的物理内存地址寻址(称之为Big Real Mode)通过A20快速门(Fast Gate)修改0x90端口的数据, 对其进行置位(类似于打开一个开关), 开启使用CLI汇编指令关闭外部中断使用lgdt加载保护模式需要的系统数据结构置位cr0寄存器的值开启保护模式进入...

在实模式下开启4GB的物理内存地址寻址(称之为Big Real Mode)

  • 通过A20快速门(Fast Gate)修改0x90端口的数据, 对其进行置位(类似于打开一个开关), 开启
  • 使用CLI汇编指令关闭外部中断
  • 使用lgdt加载保护模式需要的系统数据结构
  • 置位cr0寄存器的值开启保护模式
  • 进入保护模式
  • 重新加载FS寄存器中的数据, 使其支持4GB的物理内存地址的寻址
  • 立刻置位cr0寄存器的数据关闭保护模式
  • 使用STI汇编指令开启外部中断
  • 这样CPU就可以支持4GB的寻址了
  • 注意: 该Big Real Mode是必须的, 我们需要将内核代码加载到1MB以上的物理内存地址空间上, 那么就需要开启4GB的内存寻址, 之所以要在返回到实模式是因为在实模式下所有内存地址都是可以访问的, 而在保护模式下则不能, 在这里我们需要访问一些物理地址所以需要在返回实模式

完成了内核代码的加载和移动到指定的1MB之上的位置之后的模式切换

  • 在Big Real Mode中已经开启了A20快速门开关, 这里就不需要了
  • 手动初始化好gdt数据结构(包括: 段描述符(数据段和代码段), 段选择子(用来索引数据段和代码段), gdt的基地址和长度(这个通过lgdt汇编指令加载到gdtr寄存器中))
  • 手动初始化好idt数据结构
  • 使用CLI汇编指令关闭外部中断
  • 使用lgdt将上面定义好的数据结构的基地址和长度加载到寄存器中
  • 置位(PE)cr0寄存器的值开启保护模式
  • 进入保护模式, 以0特权级别执行指令
  • 使用jmp指令将CPU指向保护模式的代码
  • CPU执行保护模式的代码
  • 紧接着要进入到IA-32e模式(64位), 必须要使用一个jmp跳转指令才能进入保护模式, 这是规定

进入IA-32e模式

  • 判断CPU是否支持IA-32e模式, 如果支持则(见下面的步骤)
  • 手动初始化64位的gdt
  • 重新加载gdt, lgdt 到gdtr中
  • 置位cr0寄存器的数据关闭分页机制PG
  • 置位cr4寄存器的数据PAE开启物理地址扩展功能(PAE)
  • 置位IA32_EFER寄存器的LME标志位开启IA-32e模式
  • 置位cr0寄存器的数据开启分页机制PG
  • 使用jmp将CPU指向内核代码
  • 执行完毕jmp指令时候才会进入到IA-32e模式, 因此上面的跳转指令的地址还是基于分段机制的
目录
相关文章
|
3月前
|
C++
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
C++ 根据程序运行的时间和cpu频率来计算在另外的cpu上运行所花的时间
47 0
|
5月前
|
缓存 C语言 计算机视觉
程序与技术分享:CPU0处理器的架构及应用
程序与技术分享:CPU0处理器的架构及应用
【原创】报告CPU当前工作模式的汇编源代码
【原创】报告CPU当前工作模式的汇编源代码
|
4月前
|
缓存 弹性计算 数据库
阿里云2核4G服务器支持多少人在线?程序效率、并发数、内存CPU性能、公网带宽多因素
2核4G云服务器支持的在线人数取决于多种因素:应用效率、并发数、内存、CPU、带宽、数据库性能、缓存策略、CDN和OSS使用,以及用户行为和系统优化。阿里云的ECS u1实例2核4G配置,适合轻量级应用,实际并发量需结合具体业务测试。
80 0
阿里云2核4G服务器支持多少人在线?程序效率、并发数、内存CPU性能、公网带宽多因素
|
6月前
|
存储 SQL 缓存
手写操作系统(5)——CPU工作模式与虚拟地址(下)
手写操作系统(5)——CPU工作模式与虚拟地址
63 0
|
6月前
|
存储 缓存 Linux
手写操作系统(5)——CPU工作模式与虚拟地址(上)
手写操作系统(5)——CPU工作模式与虚拟地址
81 0
|
6月前
|
安全 编译器 程序员
CPU处理器模式与异常
CPU处理器模式与异常
211 0
|
6月前
|
Nacos
nacos 2.2.3集群模式下,leader节点,CPU打满
nacos 2.2.3集群模式下,leader节点,CPU打满
77 1
|
6月前
|
Nacos
nacos 2.2.3集群模式下,leader节点,CPU打满,是什么原因?
nacos 2.2.3集群模式下,leader节点,CPU打满,是什么原因?
180 5
|
6月前
|
C语言
start.S详解学习(一):设置 CPU 模式
start.S详解学习(一):设置 CPU 模式
87 0

热门文章

最新文章

下一篇
无影云桌面