bios是加电完成后执行的指令,boot是BIOS执行完成后的指令(算是操作系统内部指令)
即BIOS 加电到 选择系统, boot是选择系统之后(装了多个系统的师傅应该了解,开机到一半有个选择操作系统)
想去了解系统加电过程,于是安装了一个qemu进行调试
不能单步执行,n,s都不行
系统停在了0xFFFF FFF0 //可以通过断点知道
通过dump 内存 0x0000 0000 - 0x000F FFFF
和 0xFFF0 0000 - 0xFFFF FFFF 发现大部分是一致的
0x0000 0000 – 0x000D FFFF 全0 //boot 在0x7c00 目前是全0
0xFFF0 0000 – 0xFFFD EF8F 全0
0xFFFD EF90 – 0xFFFD FFFF 未知数据
先看初值
然后看第一条指令
0xfffffff0: ljmp $0xf000,$0xe05b
inter 手册
To insure that the base address in the CS register remains unchanged until the EPROM based software-initialization code is completed, the code must not contain a far jump or far call or allow an interrupt to occur (which would cause the CS selector value to be changed).
bios连在南桥上,将bios映射到内存上
然后看芯片手册 EPROM应该是在加电后已经加载完毕了,所以才能进行ljmp
然后ljmp修改了cs:base值 0xFFFF 0000 -> 0x000F 0000
跳转到了0x000F E05B //BIOS正式函数 //估摸着bios 是要在最后写ljmp $0xf000,$0xe05b
然后bios执行硬件检查 ,并且把boot加载到0x7c00
然后执行boot指令,开启系统
总结:系统加电 芯片组至reset 等待CPU加电并稳定频率(HZ) 这时候BIOS(ROM) 芯片组(主板芯片组映射表)也完成
cs:base + EIP = 0xFFFF FFF0 长跳转至0x000F e05b执行bios程序
bios硬件检查,并将boot移动到0x0000 7c00
然后跳转至0x0000 7c00 操作系统开始