30天自制操作系统-第一天-启动自己的os

发布时间 2023-03-22 21:17:00作者: 柠檬水请加冰

PC 的启动过程

  1. 当按下开机时,主板会收到一个电子信号并将其转发给PSU(电源单元)。
  2. 从主板接收到此信号后,PSU 现在会为 PC 内的所有组件供电。当一切都启动后,PSU 会通知主板。然后主板将控制权交给 BIOS——基本输入/输出系统。
  3. BIOS 是一个简单的固件,它被加载到内存中并为操作系统提供一些基本服务。BIOS 通过名为 POST 的测试(开机自检)进行自我初始化。在 POST 完成之后,处理器跳转到 BIOS 的第一条指令(加载到内存中)并开始执行它。
  4. 在前一步中,BIOS中固化了中断向量表(IVT)。中断是一个小程序,可以从程序中执行。硬件组件也可以引发中断。举个例子:每次当您按下键盘上的一个键时,都会引发一个中断,该中断由所谓的中断服务例程(ISR) 处理。
  5. BIOS初始化后,通过执行汇编指令INT 19调用中断19。BIOS尝试在引导设备上找到启动区加载。引导设备可以是软盘、硬盘、CD ROM 驱动器、U 盘等。

引导启动区

如果是采用mbr分区表的设备,BIOS 会从配置的引导设备读取第一个扇区(512 字节),并检查该扇区的最后 2 个字节是否包含签名——十六进制值0x55AA。如果找到那个魔法值,整个扇区被复制到0x7C00地址开始的内存中。然后 BIOS 将跳转到该内存位置并开始执行加载的引导扇区代码。我们的操作系统从这里开始

实现自己的OS

我们日常装机都会通过大白菜这样的装机工具来制作启动U盘,U盘的文件格式较为复杂,我们通过文件模拟实现最易的1.4mb的软盘。

汇编实现1474560字节大小的软盘

; hello-os
; TAB=4

; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code

		DB		0xeb, 0x4e, 0x90
		DB		"HELLOIPL"		; 启动扇区名称(8字节)
		DW		512				; 每个扇区(sector)大小(必须512字节)
		DB		1				; 簇(cluster)大小(必须为1个扇区)
		DW		1				; FAT起始位置(一般为第一个扇区)
		DB		2				; FAT个数(必须为2)
		DW		224				; 根目录大小(一般为224项)
		DW		2880			; 该磁盘大小(必须为2880扇区1440*1024/512)
		DB		0xf0			; 磁盘类型(必须为0xf0)
		DW		9				; FAT的长度(必须是9扇区)
		DW		18				; 一个磁道(track)有几个扇区(必须为18)
		DW		2				; 磁头数(必须是2)
		DD		0				; 不使用分区,必须是0
		DD		2880			; 重写一次磁盘大小
		DB		0,0,0x29		; 意义不明(固定)
		DD		0xffffffff		; (可能是)卷标号码
		DB		"HELLO-OS   "	; 磁盘的名称(必须为11字节,不足填空格)
		DB		"FAT12   "		; 磁盘格式名称(必须是8字节,不足填空格)
		RESB	18				; 先空出18字节

; 程序主体

		DB		0xb8, 0x00, 0x00, 0x8e, 0xd0, 0xbc, 0x00, 0x7c
		DB		0x8e, 0xd8, 0x8e, 0xc0, 0xbe, 0x74, 0x7c, 0x8a
		DB		0x04, 0x83, 0xc6, 0x01, 0x3c, 0x00, 0x74, 0x09
		DB		0xb4, 0x0e, 0xbb, 0x0f, 0x00, 0xcd, 0x10, 0xeb
		DB		0xee, 0xf4, 0xeb, 0xfd

; 信息显示部分

		DB		0x0a, 0x0a		; 换行两次
		DB		"hello, world"
		DB		0x0a			; 换行
		DB		0

		RESB	0x1fe-$			; 填写0x00直到0x001fe

		DB		0x55, 0xaa

; 启动扇区以外部分输出

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	1469432

汇编代码分析

  1. 代码开始,定义了标准FAT12文件格式。
  2. 程序主体未理解,猜测是调用显卡中断显示某一个地址的字符串
  3. 信息显示部分定义了需要显示的字符串,同时在第一扇区的末尾填充0x55aa魔数,标识这是一个引导扇区
  4. 启动扇区以外部分定义了FAT文件格式的FAT1和FAT2内容,FAT2是FAT1的拷贝,前面12字节关联代码开始处的磁盘类型
  5. 最后填充零,开始定义了扇区大小等信息,文件总大小要可以对应

总结

其实读完书中这一章,程序代码大部分都是看不懂的,我想这一节的关键不在于实现一个OS,而在于理解OS是如何被加载的,了解一下引导扇区。由于历史原因,约定了许多内容,记下来就好。

延伸阅读

PC启动过程说明
FAT12文件系统