这部分没办法,汇编计组都忘完了,只能靠嗯背了

bootasm.S

  1. 打开 A20 地址线:
  2. 构建加载 GDT(全局描述符表):
  3. 设置 CR0 寄存器:
  4. 长跳转(ljmp):

打开 A20

使用键盘控制器打开 A20,打开 A20 后地址总线达到了 32 根,确保系统可以正常访问大于 1MB 的内存,寻址范围达到 4GB

Untitled

构建加载临时 GDT

在切换到保护模式之前提供一个简单的GDT,确保切换过程的正常进行。在实际的操作系统启动过程中,会在后续的初始化阶段替换这个临时GDT为更为复杂的操作系统所需的GDT。

设置 CR0 寄存器的 PE 位

PE 位置一开启保护模式,从此开始进入保护模式,16 位的 CPU 变成了 32 位的 CPU,此刻前后的指令格式也是不一样的,在此之前使用的 16 位指令,在此之后使用的 32 位指令

为了加快 CPU 执行指令的效率,存在着一种机制:流水线,简单来说,就是把多条指令加载到流水线上,同时运行不同指令不同部分。问题就出在这儿,进入保护模式后流水线上可能还存在 16位的指令,所以进入保护模式后需要清空流水线,无条件跳转 jmp 指令可以用来清空流水线

start32

  1. 设置保护模式下的数据段寄存器
  2. 设置栈指针 ESP 并调用 bootmain 函数
  3. 处理错误情况的代码段
  4. 进入一个无限循环

entry.S