想带着学生做一个操作系统,可行性有多大?

时间:2022-11-12 14:54:39

有知乎网友提问如下:

想带着学生做一个操作系统,可行性有多大?

个人觉得可行性非常大,如果只是做着来玩,让学生了解操作系统时如何实现的话。但是,如果你打算今后商业化的话,那就另当别论了。就算你能做出来,没有人用,那也是然并卵。

国内之所以没有发展出自己的操作系统,不是技术不行,是你没有这个生态。任你强大如某菊花品牌,先不论是否是套壳,你想让其他手机生产商都埋堆?你没发使用gms也是然并卵。你走不了海外,难道我要跟着你一锅熟?我当然还是要走gms生态。如此之类的吧。

不扯远,回到题主问题。

由头到脚做个玩具版的操作系统,不基于任何linux内核,其实难度远没有一些朋友想象中那么难。当然,这里要还要看不同的人对操作系统的理解。

比如,如果你只是想写个Hello world级别的操作系统,在系统开机之后直接跑你自己的写的程序,打印个Hello World什么的,估计你都用不了30分钟,参考下我以前推荐过的李渊写的《自己动手写操作系统》的第一章,用汇编写十来行代码,编译烧录到一个镜像,然后让虚拟机从该镜像启动就能看到效果。

以下是该书第一章的目录:
想带着学生做一个操作系统,可行性有多大?
对应的那十来行代码在此:

	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				; 结束标志

然后怎么编译,怎么烧录到软盘或者镜像,以及系统从启动,到自检,到读取启动盘mbr记录,加载引导代码bootloader之类的,这里就不详谈了,书上都有,或者自己到csdn之类的搜索下就出来了。

这里我只是想表达下,操作系统的也是可以有Hello World版本的,入门也就30分钟的难度而已。所谓万事开头难,只要你开了个头,那你带领学生继续写的信心就会更大了。

但是

我们上面这个操作系统其实充其量也只能算个boot loader而已,其实boot loader也还算不上,因为它没有去load任何东西。

这往下的其实就是要实现的操作系统相关的更多功能了,相关的模块或者知识点我相信应该包含这些方面:

  • 保护模式的跳转。这个你肯定得教给你学生的吧?毕竟,这是个非同寻常的跳转。这里gdt,ldt这些知识点肯定要涉及的了

  • 内存管理。你分页也好,分段也好,分页+分端也好,只要你不是实模式的,那么虚拟内存和真实内存映射,用户态和和心态这些你是跑不掉的,否则你跑个应用分分钟访问到操作系统的内存去了。

  • 进程管理。基本的cpu调度算法总要有吧,就算你只是个简单的写死的没有抢占式的时间片调度算法。

就教学来说,我觉得上面这些实现了估计也差不多了。

其实对于微内核来说,文件系统这些往往没有放到操作系统内核中去,而是作为应用层应用的,比如minix上就是这样做的。

如果还有精力的,那可以继续下面这些方面:

  • 设备管理。简单的块设备和字符设备支持上就好
  • 文件系统

其实《自己动手写操作系统》这本书我当时看的时候它刚出来,好多好多年前了,当时它还么有实现文件系统这一块的。设备管理好想也没有实现太多东西。

所以在这上面你应该能借鉴的不多。但是你可以参考我们大学时候的教程《操作系统设计与实现》,里面用到的是教学用的minix操作系统,完全足够你用了。

相关的一些细节以及上面提及的书籍,我在之前的回到中有说到,这里就不赘述了,先到这吧

Linux内核代码大佬们如何观看的?

我是@天地会珠海分舵,能力一般,水平有限,觉得我说的还有那么点道理的不妨点个赞关注下!