在loader程序中涉及到的CPU模式切换
在实模式下开启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模式切换的更多相关文章
- 微信小程序中涉及虚拟产品购买,ios暂不支持的相关整理意见
这个东西呢也不能怪微信小程序,属实苹果搞的事情,那怎么小程序相关内容去通过审核呢? 首先我们要搞清楚哪些属于虚拟商品:如某某书币,某某会员,或者是提前编辑好的网课,文档等都属虚拟商品购买,简言之就是没 ...
- C语言学习笔记(一)_hello world程序中涉及的c语言元素
#include <stdio.h> //使用printf函数之前必须include<stdio.h> int main() { int i; //声明一个变量 printf( ...
- 定位java程序中占用cpu最高的线程堆栈信息
找出占用cpu最高的线程堆栈信息 在java编码中,有时会因为粗心导致cpu占用较高的情况,为了避免影响程序的正常运行,需要找到问题并解决.这里模拟一个cpu占用较高的场景,并尝试定位到代码行. 示例 ...
- 转:如何在32位程序中突破地址空间4G的限制
//如何在32位程序中突破地址空间4G的限制 //首先要获得内存中锁定页的权限 #define _WIN32_WINNT 0x0501 //xp系统 #include <windows.h> ...
- 了解 JavaScript 应用程序中的内存泄漏
简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理 ...
- 理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程
本文属于<理解性能的奥秘--应用程序中慢,SSMS中快>系列 接上文:理解性能的奥秘--应用程序中慢,SSMS中快(1)--简介 本文介绍SQL Server如何编译存储过程并使用计划缓存 ...
- 让你提前认识软件开发(21):C程序中的定时器
版权声明:本文为博主原创文章.对文章内容有不论什么意见或建议.欢迎与作者单独交流.作者QQ(微信):245924426. https://blog.csdn.net/zhouzxi/article/d ...
- 在Python程序中的进程操作,multiprocess.Process模块
在python程序中的进程操作 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...
- Python程序中的进程操作
之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程 ...
随机推荐
- 发起http(s)请求
发起http(s)请求我这里主要列举了3种方式: 一.命令行的方式 二.通过工具 三.通过代码 一.命令行的方式 1. curl curl官网: https://curl.haxx.se/downl ...
- Learning Python 008 正则表达式-003 search()方法
Python 正则表达式 - search()方法 findall()方法在找到第一个匹配之后,还会继续找下去,findall吗,就是找到所有的匹配的意思.如果你只是想找到第一个匹配的信息后,就不在继 ...
- Centos 6.5 hadoop 2.2.0 全分布式安装
hadoop 2.2.0 cluster setup 环境: 操作系统:Centos 6.5 jdk:jdk1.7.0_51 hadoop版本:2.2.0 hostname ip master ...
- 8、SRR数据下载https://ftp-trace.ncbi.nlm.nih.gov/sra/sdk/2.8.2/
1.prefetch SRRxxxxxx -/ncbi/public/sra 2.fastq-dump --split-files xxxxxxsra 3.SRA.SAM以及Fastq ...
- 阶段3-团队合作\项目-网络安全传输系统\sprint3-账号管理子系统设计\第2课-账号管理子系统设计
账号管理子系统的设计 客户端需要登录到服务器,在服务器去查询数据库,进行验证该用户. 打开client.c文件 编译之 把它复制到开发板里面去 这个程序是在本地数据库测试的!!!!!!!!!!!!!! ...
- hdu1054
/* [题意] 给定一棵树,标记一节点,则与该节点所连的边都被标记,问最少需要标记多少个节点使得所有边都被标记: 或者说给定一个树型城堡,在交叉路口放一个士兵,则与该路口相连的路都被守住, 问最少需要 ...
- POJ 1601 拓展欧几里得算法
学习链接:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 先来学习一下什么是欧几里得算法: 欧几里得原理是:两个整数 ...
- 图像特征--HOG特征
1.HOG特征:方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯 ...
- C#z中的虚方法,抽象类
1.虚方法 我在这动物类中定义了一个虚方法 Dosth class Animal { public int Aid; public string Name; public void SetAid(in ...
- 【TMF eTOM】eTOM的概念和术语
eTOM的概念 为了有效地理解和使用eTOM业务流程框架,我们首先要理解构成eTOM的关键概念.这些概念使eTOM成为集成业务流程设计/评估与传统过程的一个非常有效的工具.在这些概念中使用了在本文中详 ...