跳转到主内容
思享编程网:思考分享,玩转编程世界!

bootsect.s引导区代码解析:CPU启动流程全揭秘!

你是否好奇过,当你的电脑开机后,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)。

相关文章