在实模式下开启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. SpringMVC 学习笔记(请求方法的返回值和参数)

    在用注解对配置 处理器时,一般是一个方法处理一个请求,不同方法的返回类型有着不同的意义. 返回值为 ModelAndView 类型 ModelAndView 是Model 和 View 的一个集合类型 ...

  2. 06_android虚拟机介绍 05_sdkManager介绍

    如果你不对SDK Manager进行设置,它默认会去谷歌官网下载最新的内容.由于官网被墙了,要么你FQ要么去设置代理.通过代理去下载相关的内容. 每一个android版本都对应着一个API的版本号.如 ...

  3. Unity编辑器的扩展:IMGUI

    IMGUI 介绍 所有关于 Editor 的相关 UI,包括 Inspector.Hierarchy.Window.Game 视图上动态创建的那些半透明 UI.还有 Scene 视图上可添加的辅助显示 ...

  4. assert.ok()

    测试 value 是否为真值. 相当于 assert.equal(!!value, true, message). 如果 value 不为真值,则抛出一个带有 message 属性的 Assertio ...

  5. 笔试题: 数据库 已看1 一些关键的sql语句练习 和选择题 有用 sql语句练习 挺好

    一.     选择题 1.SQL语言是( C )语言. A.层次数据库 B.网络数据库 C.关系数据库 D.非数据库     redis 是 3.如果在where子句中有两个条件要同时满足,应该用哪个 ...

  6. \阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint2-采集端图像采集子系统设计

    1.在编写程序前有一个流程,思维导图: 初始化:包括初始化摄像头:注册事件到epoll 然后是开始启动采集:一旦开始采集我们的摄像头就会有数据了,它会触发事件处理函数:我们在这里的处理是保存这个图像: ...

  7. Linux的.run文件简单制作

    run程序安装包实质上是一个安装脚本加要安装的程序,如下图所示: |-----------------|| || 安装脚本 || ||-----------------|| || 程序 || ||-- ...

  8. redis系列:通过文章点赞排名案例学习sortedset命令

    前言 这一篇文章将讲述Redis中的sortedset类型命令,同样也是通过demo来讲述,其他部分这里就不在赘述了. 项目Github地址:https://github.com/rainbowda/ ...

  9. [CentOS7] vncviewer与windows之间的复制粘贴

    转载:https://my.oschina.net/seava/blog/226966 用VNC连接到Linux之后,最纠结的问题就是无法复制粘贴.其实很简单,在Linux里面,打开一个终端,然后输入 ...

  10. 如何在MySQL中设置外键约束

    引用:http://blog.sina.com.cn/s/blog_53729e4601011wja.html MySql外键设置详解   (1) 外键的使用: 外键的作用,主要有两个:    一个是 ...