最近发现来一本日本人写的书,叫做《三十天自制操作系统》。这本书自制的操作系统十分简单,但是该有的功能都有,而且提供了完整的工具和代码十分值得学习。

Day01 - Hello World

第一天的主要工作是对现有的储存空间进行分区,我们打算先设计一个1.44M大小的操作系统。

我们先设计启动区,以下为启动区的汇编代码,文件命名为 helloos.nas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
; hello-os
; 以下是标准FAT12格式软盘专用的代码

DB 0xeb, 0x4e, 0x90
DB "HELLOyyy" ; 启动区名称(8字节)
DW 512 ; 每个扇区(sector)的大小必须为512字节
DB 1 ; 簇(cluster)的大小必须为1个扇区
DW 1 ; FAT的起始位置(一般从第一个扇区开始)
DB 2 ; FAT的个数必须为2
DW 224 ; 根目录的大小(一般设成224项)
DW 2880 ; 该磁盘的大小(必须是2880扇区)
DB 0xf0 ; 磁盘种类(必须是0xf0)
DW 9 ; FAT的长度必须是9个扇区
DW 18 ; 1个磁道(track)必须有18个扇区
DW 2 ; 磁头个数必须是2
DD 0 ; 不使用分区
DD 2880 ; 重写一次磁盘大小
DB 0, 0, 0x29 ; 固定写法
DD 0xffffffff ; 卷标号码
DB "HELLO-OS " ; 磁盘名称(11字节)
DB "FAT12 " ; 磁盘格式名称(8字节)
RESB 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

FAT12文件系统为1.44M的软盘设计。其中包含有有2880个扇区,一个扇区有512个字节(也就是说FAT12文件系统的管理的空间大小就是2880 512 = 1474560个字节)。FAT12将2880个扇区分成5个部分:*MBR引导记录、FAT1表、FAT2表、根目录、数据区

1

MBR引导记录有512个字节,最后两个字节是0x550xAA,记录的其他信息如下。

2

根据上面这两张图我们就能很好理解前面的汇编代码了。在 0x550xaa 之前的部分就是 MBR 。后面引导区外的代码就是 FAT1FAT2 。其中 FAT2 的作用就是修复 FAT1 ,所以他们的内容完全一样。他们每1.5个字节为一个簇。其中FAT表的0号簇和1号簇不能使用,他们储存的是坏簇标记 0xFF0 (这里是第一个 0xF0 和后面 0xFF 的第一个 F 拼成 0xFF0 的)和结尾标志 0xFFF

编译运行

我们使用作者自己提供的工具链对这些代码进行编译。

1
nask.exe	helloos.nas helloos.img

或者

1
.\nask.exe	helloos.nas helloos.img

3

可以看到我们成功生成了1.44M的光盘文件。

接下来我们把这个“操作系统”部署到虚拟机上去

4

启动!就可以看到我们的hello world了

5