在实模式下开启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模式, 因此上面的跳转指令的地址还是基于分段机制的

在loader程序中涉及到的CPU模式切换的更多相关文章

  1. 微信小程序中涉及虚拟产品购买,ios暂不支持的相关整理意见

    这个东西呢也不能怪微信小程序,属实苹果搞的事情,那怎么小程序相关内容去通过审核呢? 首先我们要搞清楚哪些属于虚拟商品:如某某书币,某某会员,或者是提前编辑好的网课,文档等都属虚拟商品购买,简言之就是没 ...

  2. C语言学习笔记(一)_hello world程序中涉及的c语言元素

    #include <stdio.h> //使用printf函数之前必须include<stdio.h> int main() { int i; //声明一个变量 printf( ...

  3. 定位java程序中占用cpu最高的线程堆栈信息

    找出占用cpu最高的线程堆栈信息 在java编码中,有时会因为粗心导致cpu占用较高的情况,为了避免影响程序的正常运行,需要找到问题并解决.这里模拟一个cpu占用较高的场景,并尝试定位到代码行. 示例 ...

  4. 转:如何在32位程序中突破地址空间4G的限制

    //如何在32位程序中突破地址空间4G的限制 //首先要获得内存中锁定页的权限 #define _WIN32_WINNT 0x0501 //xp系统 #include <windows.h> ...

  5. 了解 JavaScript 应用程序中的内存泄漏

    简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理 ...

  6. 理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程

    本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(1)--简介 本文介绍SQL Server如何编译存储过程并使用计划缓存 ...

  7. 让你提前认识软件开发(21):C程序中的定时器

    版权声明:本文为博主原创文章.对文章内容有不论什么意见或建议.欢迎与作者单独交流.作者QQ(微信):245924426. https://blog.csdn.net/zhouzxi/article/d ...

  8. 在Python程序中的进程操作,multiprocess.Process模块

    在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...

  9. Python程序中的进程操作

    之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程 ...

随机推荐

  1. mybatis 学习一 总体概述

    mybatis使用起来不复杂,大体上来说,就是将db连接信息,所有的sql语句信息,都放到配置文件里面,然后去读配置信息,根据db信息,创建好session工厂,然后拿到sqlsession回话之后, ...

  2. RAC环境下ORACLE序列缓存导致序列混乱

    目前项目中发现了这样一个问题,在数据库部署了RAC环境之后,偶尔会出现从Oracle Sequence所取出来的数是混乱的,比如第二次比第一次所取的数要小.这样当程序的逻辑依赖于ID的大小来排序时,就 ...

  3. 关于KMeans的评价及聚簇结果的得到

    import numpy as npfrom sklearn.cluster import KMeansfrom sklearn import metricsimport matplotlib.pyp ...

  4. 使用union来遍历结构体中的成员

    前几天和实验室的同学讨论问题的时候发现他使用的一段数据校验的代码自己以前没有接触过,今天有空就把它整理了一下. #include <stdio.h> #include <stdlib ...

  5. 0008_Python变量

    1.变量名:数字,字母,下划线组成,不能以数字开头,不能是Python内部关键字. 2.变量类型:数字,字符串,布尔值(首字母大写) 3.内存与变量: 4. =    赋值 ==   比较 is == ...

  6. 核PCA与PCA的精髓和核函数的映射实质

    1.PCA简介 遭遇维度危机的时候,进行特征选择有两种方法,即特征选择和特征抽取.特征选择即经过某种法则直接扔掉某些特征,特征抽取即利用映射的方法,将高维度的样本映射至低维度.PCA(或者K-L变换) ...

  7. Java探索之旅(8)——继承与多态

    1父类和子类: ❶父类又称基类和超类(super class)子类又称次类和扩展类.同一个package的子类可以直接(不通过对象)访问父类中的(public,缺省,protected)数据和方法. ...

  8. R: vector 向量的创建、操作等。

    ################################################### 问题:创建.操作向量   18.4.27 怎么创建向量 vector,,及其相关操作 ??? 解 ...

  9. p2279&bzoj1217 消防局的设立

    传送门(洛谷) 传送门(bzoj) 题目 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 连接这些基地,并且每两个基地都能够通过道路到达, ...

  10. 理解setTimeout和setInterval

    setTimeout和setInterval,这两个js函数都是用来定时执行.setTimeout执行一次,setInterval执行多次. 问题出现在今天,使用setInterval是,设置执行速度 ...