Jasper Ji

博观而约取,厚积而薄发。

如何写一个操作系统

2021-02-04 22:21

缘起

做程序员也有些年头了,做过的项目各式各样,但都不是什么成功项目,所以到底如何证明自己呢?于是想到了尝试写个操作系统试试,也算通用了。

大概7、8年前买过一本《Orange’S 一个操作系统实现》,主题很吸引我,可惜没读过三章就停滞不前了,汇编以及体系方面的东西让我这个半路出家的程序员看的一脸苦相,但我还是试图试试,于是就买了另一本关于汇编的书籍,王爽老师的《汇编语言.第三版》,依旧记得去乾陵一日游大巴上,我努力的读着,可惜作为一个刚接触脚本语言的人来说,汇编语言太难了,中间需要跨越的东西太多了。渐渐就放弃了,后来直接把这两本书给卖掉了。

今年突然间又想,我应该尝试写一个简单的操作系统,多年的工作以及自学,使得我对编程有了一个相对完整的认识,这个想法似乎不像当年那么不靠谱。但该如何下手呢?刚开始我只想能跑一个Hello wrold的例子也可以,网上找了下最多的居然是我当年卖掉的那本《Orange’S 一个操作系统实现》书中的例子,可惜当年我也没怎么看懂,只是买了本书而已。

例子

最简单的例子,来自《Orange’S 一个操作系统实现》一书。


	org 07c00h			; 告诉编译器程序加载到7c00处
	mov ax, cs
	mov ds, ax
	mov es, ax
	call DispStr			; 调用显示字符串例程
	jmp $			; 无限循环
DispStr:
	mov ax, BootMessage
	mov bp, ax			; ES:BP = 串地址
	mov cx, 16			; CX = 串长度
	mov ax, 01301h		; AH = 13,  AL = 01h
	mov bx, 000ch		; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)
	mov dl, 0
	int 10h			; 10h 号中断
	ret
BootMessage:		db	"Hello, OS world!"
times 	510-($-$$)	db	0	; 填充剩下的空间,使生成的二进制代码恰好为512字节
dw 	0xaa55				; 结束标志

这就是一个直接运行到硬件上的一段程序,而不是我们平时在操作系统写应用代码那样。对于一个实践者而言,我很想把这段程序跑起来,这很关键,只要能跑起来,我们就可以试图修改下,再跑起来,这样认识上才能有提高。其实跑这个例子也是费了点功夫,首先在虚拟机上安装了一个的Linux发行版Ubuntu系统,书中用到的汇编是跟MASM很相似的NASM,首先NASM的教程不多,不过还好可以参考MASM汇编的书籍。另外就是软盘的制作相关的东西,最后是安装Bochs虚拟机,这个虚拟机跟平时用的有些特别,不过还是了解如何操作,最后成功的把这个例子跑了起来。

汇编和CPU

似乎可以继续一路向前了,可惜看了头三章后,我发现了些问题。首先我对NASM汇编的东西几乎是一片空白,书的前几章几乎离不开汇编语言了,而看的非常吃力。另一个是我对PC的体系缺乏细节的了解,虽然之前也有了解但实操的过程中遇到的问题更具体。

NASM的书籍不多,《汇编语言.基于Linux环境.第三版》是一本从体系的角度来讲解NASM的书籍,一方面学习了NASM,也让我重新思考从8086到80386的一些变化,好几个点很有启发。王爽老师的《汇编语言》,也是一本非常不错的参考书,汇编语言在形式上与高级语言还是有着巨大差异,一开始我把心思放在那些寄存器之类上了,而忽略了一个编程语言应该是能够写点东西出来这事上。《汇编语言》这书很好的带我进入如何写点东西的正轨上。

8086方面的书籍,8086总设计师莫尔斯写的《8086初阶-体系结构、系统设计和程序设计入门》。王爽老师《汇编语言》也主要是讲8086的汇编的。80386的书籍不多,80386的设计师写的《Programing the 80386》一书,非常不错。中文版是93年出版的《保护方式下80386及其编程》一书,虽然没有备注是翻译,但我跟英文版对照后,确认就是翻译自《Programing the 80386》,主要是学习保护模式。

这里需要注意的是实模式与保护模式的差别,很多时候一开始如果研究的是8086的,往往需要转换下思维,最好的书籍依旧是《保护方式下80386及其编程》一书,于渊的《Orange’S 一个操作系统实现》细节上还是有点模糊。

总结

最终操作系统并没有完整的实验下去,主要是因为最难的部分也是最容易忽略的如何在特定架构上如何开始,把这一步迈过去后,基本上跟大多操作系统讲的差不多了,主要部分就是使用C语言来实现。

虽然实验已经过去了几个月了,最近一直在看Java并发的东西,发现实际写过点操作系统还是很有帮助的,比如更能从CPU的角度来思考。

Comments