x86 启动顺序

x86启动顺序 - 第一条指令

  • CS = F000H, EIP = 0000FFF0H
  • 实地址是:
    Base + EIP = FFFF0000H + 0000FFF0H = FFFFFFF0H
    这是BIOS的EPROM(Erasable Programmable Read Only Memory)所在地
  • 当CS被新值加载,则地址转换规则将开始起作用
  • 通常第一条指令是一条长跳转指令(这样CS和EIP都会更新)到BIOS代码中执行

x86启动顺序 - 处于实模式的段

  • 段选择子(Segment Selector): CS,DS,SS,…
  • 偏移量(Offset): EIP

x86启动顺序 - 从BIOS到Bootloader

  • BIOS 加载存储设备(比如软盘、硬盘、光盘、USB盘)上的第一个 扇区(主引导扇区,Master Boot Record, or MBR)的512字节到内存的0x7c00 …
  • 然后跳转到 @ 0x7c00的第一条指令开始执行

x86启动顺序 - 从Bootloader到OS

  • bootloader做的事情
    • 使能保护模式(protection mode)& 段机制(segment-level protection)
    • 从硬盘上读取kernel in ELF 格式的ucore kernel (跟在MBR后面的扇区)并放到内存中固定位置
    • 跳转到ucore OS的入口点(entry point)执行,这时控制器到了ucore OS中

x86启动顺序 - 段机制

x86启动顺序 - 使能保护模式

  • 使能保护模式(protection mode),bootloader/OS 要设置CR0的bit 0(PE)
  • 段机制(segment-level protection)在保护模式下是自动使能的

x86启动顺序 - 加载ELF格式的ucore OS kernel