Open supergem3000 opened 7 months ago
状态:内存和寄存器数值 初始状态:手册规定(CPU Reset) 状态迁移
各种平台规定自己的CPU Reset状态,主板Firmware根据约定状态加载,并加载操作系统。
把第一个可引导设备的第一个512字节加载到物理内存的7c00位置。此时处理器处于16-bit模式。
#define SECT_SIZE 512 .code16 // 16-bit assembly // Entry of the code .globl _start _start: lea (msg), %si // R[si] = &msg; again: movb (%si), %al // R[al] = *R[si]; <--+ incw %si // R[si]++; | orb %al, %al // if (!R[al]) | jz done // goto done; --+ | movb $0x0e, %ah // R[ah] = 0x0e; | | movb $0x00, %bh // R[bh] = 0x00; | | int $0x10 // bios_call(); | | jmp again // goto again; ---+---+ // | done: // | jmp . // goto done; <---+ // Data: const char msg[] = "..."; msg: .asciz "This is a baby step towards operating systems!\r\n" // Magic number for bootable device .org SECT_SIZE - 2 .byte 0x55, 0xAA
磁盘必须按GPT方式格式化,预留一个FAT分区,Firmware能够加载任意大小的PE可执行文件.efi。
用510字节指令完成磁盘->内存的加载,初始化C程序的执行环境,操作系统就开始运行了。
计算机硬件的状态机模型
状态:内存和寄存器数值 初始状态:手册规定(CPU Reset) 状态迁移
各种平台规定自己的CPU Reset状态,主板Firmware根据约定状态加载,并加载操作系统。
Legacy BIOS:约定
把第一个可引导设备的第一个512字节加载到物理内存的7c00位置。此时处理器处于16-bit模式。
UEFI上的操作系统加载
磁盘必须按GPT方式格式化,预留一个FAT分区,Firmware能够加载任意大小的PE可执行文件.efi。
实现最小操作系统
用510字节指令完成磁盘->内存的加载,初始化C程序的执行环境,操作系统就开始运行了。