今天准备开始学习开发操作系统了。

就叫它 XIAOJIOS 吧~

学习开发操作系统的原因呢,第一点还是因为咱们国家的一个情况,我还是希望掌握开发 OS 的一个技术的,第二点是因为很多操作系统的机制希望去学习一下,并且尝试自己编写一份。

这里参照一本书《30天自制操作系统》,主要也是跟着它学习的。

环境准备

今天主要用到两个工具:

  • NASM——基于英特尔 x86 架构的汇编与反汇编工具
  • qemu——开源免费的虚拟机程序

nas汇编文件的编译方式为:

1
nasm xxx.nas -o xxx.img

qemu启动加载 img 文件的方式为:

1
qemu-system-x86_64 -drive file=os.img,if=floppy

编写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
46
47
; hello.nas
; 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 "XIAOJIOS " ; 磁盘的名称(必须为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,xia0ji233"
DB 0x0a ; 换行
DB 0
RESB 0x1fe-($-$$)
DB 0x55, 0xaa

; 启动扇区以外部分输出

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

这里需要注意的是,本书原本给的文件中,使用新版本的 nasm 可能会报错:

1
helloos.nas:41: error: attempt to reserve non-constant quantity of BSS space

这里我们需要把那句话改为:

1
2
RESB	0x1fe-($-$$);或者改为下面的那句话
times 0x1fe-($-$$);$,当前位置;$$,当前段位置;$ - $$,当前位置距离段开始的偏移位置

所以这里的目的就是用 0x00 填充 完 0x1fe 的大小即可。

第0x001fe和0x001ff(扇区最后两个字节)的内容应当是0x55,0xaa,这样才能被计算机认定为启动区IPL(initial program loader),但是第一章的代码并不能称之为启动区,因为下一步并没有加载其他程序。

汇编+运行

用以下命令得到 img 文件:

1
nasm hello.nas -o XIAOJIOS.img

qemu 启动

1
qemu-system-x86_64 

完成!


希望能坚持下去,能在第三十天看到一个完整的操作系统。