你是否好奇过,当你的电脑开机后,CPU是如何一步步将控制权交给操作系统的?今天,我们就来揭开bootsect.s引导区代码的神秘面纱,一起探索CPU启动的奥秘!
引导区代码的作用
当电脑加电后,CPU会首先将CS:IP设置为0xF000:0xFFF0,这是CPU与BIOS之间的约定。随后,BIOS会将启动设备的0盘面0磁道第1扇区(512字节)的内容载入到内存的0x07C00处。这个扇区的内容就是bootsect.s汇编代码。
代码结构分析
bootsect.s代码首先定义了几个段的段基址,包括BOOTSEG、INITSEG、SETUPSEG和SYSSEG。这些地址用于后续的代码拷贝和段寄存器设置。
.globl begtext, begdata, begbss, endtext, enddata, endbss
.text
begtext:
.data
begdata:
.bss
begbss:
.text
SETUPLEN = 4 ! nr of setup-sectors
BOOTSEG = 0x07c0 ! original address of boot-sector
INITSEG = 0x9000 ! we move boot here - out of the way
SETUPSEG = 0x9020 ! setup starts here
SYSSEG = 0x1000 ! system loaded at 0x10000 (65536).
ENDSEG = SYSSEG + SYSSIZE ! where to stop loading
! ROOT_DEV: 0x000 - same type of floppy as boot.
! 0x301 - first partition on first drive etc
ROOT_DEV = 0x306
接下来,代码会将BOOTSEG段的512字节的boot代码拷贝到INITSEG所在的段里面。这里使用了movw指令一次性拷贝两个字节的内容,因此cx的初始值是256。
引导过程详解
代码会将boot拷贝到0x9000段,并将INITSEG的值给CS,把go的偏移量给IP,实现跳转到0x9000段执行。随后,CS转到0x9000段后,相继将ds,es,ss三个段寄存器设置过来,并将栈顶设置为0x9FF00。
接着,代码使用0x13中断,将启动盘的第2个扇区开始,共SETUPLEN(4)个扇区的内容读取到es:0x020 (也就是0x90200)地址去。读取正确后,会跳转到ok_load_setup继续执行。
之后,代码会载入SYSTEM部分到0x10000开始的段里面,并使用0x10打印“Loading system…”的提示字符串。
最后,代码会检查根文件系统等机器数据,并使用jmpi 0,SETUPSEG跳转到Setup所在的代码段,完成引导过程。
小结与拓展
通过本文,我们了解了bootsect.s引导区代码的作用和结构,以及CPU启动的整个过程。如果你对操作系统和底层原理感兴趣,可以进一步学习BIOS、硬盘分区、文件系统等相关知识。
我是思享编程网的陆砚码,更多编程知识,欢迎关注我们的网站(www.sxgpb.com)。
