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 个字节的最后两个字节分别是 0x550xaa,那么 BIOS 就会认为它是个启动区

  • 对于OS来说,bios就一个操作,将磁盘0 盘 0 道 1 扇区的代码编译然后放到内存0x7c00位置

    2. 两行代码

    image.png

  • BOOTSEG = 0x7c0

  • ds段寄存器为代码基址,往后所有代码中的地址都是ds基址左移4加上偏移量,即 ds:[address] ,即 0x7c00:[address]

    3. 实模式

  • 进入实模式之前,基于上面的ds段寄存器初始化好,后面的地址可以进行计算了,就开始复制其他程序到内存了

最终结果:
image.png

  • bootsect.s被BIOS复制到内存0x7c00位置后,bootsect.s又自己吧这512B的代码复制到0x90000位置
  • 然后将内存又初始化两块地方,0x10000和0x90200(即将两块内存空间的指针放入寄存器),用于将setup.s和head.s复制到内存
  • 然后将远离这几块代码区域的内存位置,初始化一个栈顶指针即0x9FF00位置
  • 最终将编译好的setup和system代码复制到内存

4. 最后

跳转到0x90200位置,随即开始了setup的执行