0x100-OSFromScratch-Boot

目录

本系列介绍

这个系列,基于 Nick Blundell 2010 年的文献 Writing a Simple Operating System — from Scratch,记录一下学习操作系统底层的过程。

有能力阅读英文的同学,直接到 这里 阅读英文原版。没有信息丢失。

这份文献并没有完结,出于各种原因最后几个章节那么多年也没有再补全。但是已有的内容,已经足够我们看清全局,作为进一步深入学习的敲门砖。

在看本系列文章的时候,配合 cfenollosa 的 Github Repo。Nick Blundell 没有完结的几个章节,cfenollosa 的 Repo 中都有代码,可以自行配合 Google 理解。

就像作者所说,Writing a Simple Operating System — from Scratch 不是教我们如何写一个功能健全的操作系统,而是将操作系统底层通用的逻辑展示出来,希望在整个工程结束之后,能为各位今后无论在计算机技术任何一方面的发展,做一块垫脚石。

开篇 —— 计算机的启动(Boot)

不要和操作系统启动混淆,这里讲的是计算的启动,远在操作系统之前。

计算机启动的时候,任何我们熟知的与操作系统相关的内容,如文件系统,读写设备,都不存在。这个时候能工作的,只有 BIOS,Basic Input/Ouput Software。

BIOS 被烧录在计算机的一块 ROM 当中,在计算机启动的时候,BIOS 负责计算机硬件的检测,以及控制计算机最基础的一些硬件,如显示器,键盘,硬盘。

BIOS 在对一些至关重要的硬件,如内存,做完检查之后,就到了要加载操作系统的时候。

但是重申,BIOS 并不知道有文件系统的存在,它只知道从一个指定的区域,如硬盘的第几个柱面 (Cylinder),第几个磁头(Head),第几个扇区(Sector)去读取数据,通常,BIOS 会读取 512个字节的数据。

因此,最简单的方式,就是设置 BIOS 去读取 0 柱面,0 磁头,0 扇区位置上的 512 个字节,这快区域被称为 boot sector,按字面意思翻译为启动扇区

再明确一点,BIOS 和 CPU 都无法区分什么是数据,什么是指令。CPU 会执行 EIP 寄存器指向的任何数据。BIOS 也必须有一种机制,让它知道,哪里才是加载操作系统所需的启动扇区。有时候我们的电脑不止一块硬盘,那么让 BIOS 知道哪一块硬盘上才有启动扇区,那么它才能成功读取扇区上的数据,计算机启动过程才能继续。

因此,启动扇区的最后 2 个字节,一定是这个被称为神奇数字的 0xaa55

BIOS 循环读取每个存储介质的前 512 字节,找到最后 2 个字节为 0xaa55 的介质,加载操作系统。

至此,BIOS 将控制权移交给操作系统。

启动扇区的 16 进制展示

如果我们将加载操作系统的程序用 16 进制写出来,就像下面这个样子。

e9 fd ff 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa
  • 前三个字节,e9 fd ff,是无限循环的机器指令
  • 紧接着是 507 个字节的 0
  • 最后两个是上文所说的神奇数字,0xaa55

这里要注意的是,x86 处理器都是小字节序(Little-Endian),实际的高位,写入到内存中的低位。

前三个字节,由于写作时间的原因,在如今的计算机上可能有所不同。接下来的第二篇,我们会讲到如何用模拟器运行 boot sector 代码,可以清楚看到整个 boot sector 的内容。

总结

  • 计算机启动之初,只有 BIOS
  • BIOS 负责检测计算机硬件,读取 boot sector,加载操作系统
  • boot sector 一般都是 512 个字节,最后两个字节,一定是 0xaa55
  • BIOS 读取到 0xaa55,加载操作系统,将计算机控制权交给操作系统

参考文献:

  • Writing a Simple Operating System — from Scratch by Nick Blundell