引导扇区
BIOS 启动后加载并执行磁盘的第一个扇区,大小为 512 字节。这个扇区为引导扇区,用于启动存放在硬盘上的其他程序。
引导扇区的最后两个字节必须是 0x55 0xAA。
加载过程为:
电脑开机->BIOS 自检->把引导扇区加载到内存 0x7c00-> 执行扇区代码,此时为完全的裸机状态,只有实模式的 CPU。
最简单的代码
最简单的就是写一段无限循环:
|
|
这段代码将循环之后的代码到 510 字节用 0 填充,也就是nop指令。
|
|
最后的魔数 dw 0xaa55 以通过 BIOS 检查为可运行。
编译:
|
|
用 qemu 运行:
|
|

除了 BIOS 之外,什么都没输出。只是风扇开始转动。CPU 一个核心满载。
打印字符串
当然,只要做些工作,我们可以在屏幕上打印出文字出来。
|
|
分析下:
|
|
是 intel 下内存专门放引导扇区的地方,这里指定从 07c00h 开始执行程序。
将 cs、ds、es 段寄存器都放在一起,也就是将代码、数据、字符串全放在同一个地方,让 CPU 知道它们在哪。
|
|
因为在实模式下,我们不是很需要将代码和数据分开。
后面重复运行 DispStr 函数。
|
|
这里是显示的核心代码。在引导扇区,只能使用 BIOS 中断。
|
|
将 字符串地址放入 bp 寄存器。因为 BIOS 里字符串地址要放在 ES:BP 内,不然 BIOS 找不到需要显示的文字。
|
|
这段设置显示模式,将 ax 寄存器分为两部分:
- ah: 0x13 用中断的 13h 号功能:显示字符串
- al: 0x01 给 13h 设置选项,表示字符串只包含字符,不包含颜色属性;显示完移动光标。
后面就很正常的参数,注释很清楚了。
和上面循环代码一样,编译后在 qemu 运行即可:

参考资料
- 自己动手写操作系统 于渊 电子工业出版社
- os-tutorial-zsh 01-bootsector-barebones