【操作系统】从实模式到保护模式,从保护模式到Long Mode

摘要

本文是阅读x86-64处理器的几种运行模式后,基于本人先前学习成果的一个总结。
本文将简单介绍x86-64架构处理器从启动时的实模式,到32位的保护模式,再到64位的Long Mode的变化过程

从实模式到保护模式

保持着一贯向下兼容的传统,x86-64架构的CPU刚启动的时候依旧是处于实模式状态。实模式状态下的CPU同大多数大学计算机专业中学习的8086汇编的工作模式,字长仅16个bits。
如何从实模式进入保护模式?
三个步骤:
1. 打开A20 Gate
2. 提前准备好并加载GDT
3. 将CR0的PE位置1,表示打Protection Mode

更多细节,请看我之前发布在github的文章:
https://github.com/Gstalker/Kernel-Learning/tree/master/Cpt4.Rudiment%20of%20Protect%20Mode

从保护模式进入到Long Mode

有关Long Mode这个玩意,我们暂且用英文名称呼他。不特立独行的自行翻译,那样只会导致更多分歧。

步骤:

  1. 准备好页表并加载页表到cr3寄存器
  2. 将CR4寄存器的PAE位置为1
  3. 将EFER寄存器的LME位置为1
  4. 将CR0寄存器的PG位置为1

步骤1,2,4浅显易懂,了解过x86架构的CPU之后不需要cr寄存器上花更多笔墨。我们主要谈谈步骤3的EFER寄存器

EFER寄存器:Extended Feature Enable Register


先说最关键的:
Long Mode Enable (LME) Bit.
Bit 8. LME=1,启用longmode,注意必须先将CR0.PG=0后才能设置LME=1,然后再设置CR0.PG=1,则进入longmode。LME=0 ,使用legacy mode。

legacymode:实模式,保护模式,虚拟8086模式归类为legacymode
接着我们顺带提一下其它几个重要的二进制位
System-Call Extension (SCE) Bit
开启SYSCALL指令和SYSRET指令,允许软件使用这两条指令往返内核空间。这是一种低延迟的syscall调用接口,不过貌似现在的操作系统很少用到这个特性(就像x86架构的TSS一样,x64不再需要TSS了)
No-Execute Enable (NXE) Bit. :
Bit 11. 设置这个二进制位为1以开启NX特性。页表上标记为不可执行的物理页上不允许执行代码(对,栈不可执行保护的实现方式)

ok,介绍到这里,模式切换的内容就算结束了

一图流总结

【拾人牙慧】优质博客/专栏阅读记录

2020 1 3

术道经纬 – x86-64处理器的几种运行模式

2020:最坏的和最好的,我都经历过了

疫情打乱了一切,也重排了一切
这一年我从打比赛开始,到打比赛结束
这一年我从海口出发,去东北找女朋友,再回到湖南上学
这一年我打过工,也打过官司
这一年我曾卑微如尘,也见证中南第一个信安技能赛国赛的奖牌
这一年,我们坚持下来,不容易。
我知道我思想上过于懒惰。现如今我正努力去修正它。
愿接下来的日子里充满动力与期盼,目标是迈过毕业,直至白头。

Seek from within, from within
Then you will begin to see past uncertainty
Let out your cries from within, from within
Remember who you used to be
Everyday can be your new beginning