0. 介绍
- bootsect.s是Linux的Boots启动脚本,在BIOS(硬件自带)进程启动好后,会将bootsect.s代码(编译好的)复制到内存中以便使用
- bootsect.s是汇编写的,因为此时OS还没起来,所以也没有运行C的环境(库)
- bootsect.s为Linux启动最开始要做的工作,这个时候计算机只有一个BIOS,所以bootsect.s除了汇编基本命令外只能调用BIOS的函数
代码位置:{linux-code-root}/boot/bootsect.s
1. bios
只要硬盘中的 0 盘 0 道 1 扇区的 512 个字节的最后两个字节分别是 0x55 和 0xaa,那么 BIOS 就会认为它是个启动区
对于OS来说,bios就一个操作,将磁盘0 盘 0 道 1 扇区的代码编译然后放到内存0x7c00位置
2. 两行代码
BOOTSEG = 0x7c0
ds段寄存器为代码基址,往后所有代码中的地址都是ds基址左移4加上偏移量,即 ds:[address] ,即 0x7c00:[address]
3. 实模式
进入实模式之前,基于上面的ds段寄存器初始化好,后面的地址可以进行计算了,就开始复制其他程序到内存了
最终结果:
- bootsect.s被BIOS复制到内存0x7c00位置后,bootsect.s又自己吧这512B的代码复制到0x90000位置
- 然后将内存又初始化两块地方,0x10000和0x90200(即将两块内存空间的指针放入寄存器),用于将setup.s和head.s复制到内存
- 然后将远离这几块代码区域的内存位置,初始化一个栈顶指针即0x9FF00位置
- 最终将编译好的setup和system代码复制到内存
4. 最后
跳转到0x90200位置,随即开始了setup的执行