有知乎网友提问如下:
想带着学生做一个操作系统,可行性有多大?
个人觉得可行性非常大,如果只是做着来玩,让学生了解操作系统时如何实现的话。但是,如果你打算今后商业化的话,那就另当别论了。就算你能做出来,没有人用,那也是然并卵。
国内之所以没有发展出自己的操作系统,不是技术不行,是你没有这个生态。任你强大如某菊花品牌,先不论是否是套壳,你想让其他手机生产商都埋堆?你没发使用gms也是然并卵。你走不了海外,难道我要跟着你一锅熟?我当然还是要走gms生态。如此之类的吧。
不扯远,回到题主问题。
由头到脚做个玩具版的操作系统,不基于任何linux内核,其实难度远没有一些朋友想象中那么难。当然,这里要还要看不同的人对操作系统的理解。
比如,如果你只是想写个Hello world级别的操作系统,在系统开机之后直接跑你自己的写的程序,打印个Hello World什么的,估计你都用不了30分钟,参考下我以前推荐过的李渊写的《自己动手写操作系统》的第一章,用汇编写十来行代码,编译烧录到一个镜像,然后让虚拟机从该镜像启动就能看到效果。
以下是该书第一章的目录:
对应的那十来行代码在此:
org07c00h; 告诉编译器程序加载到7c00处movax, csmovds, axmoves, axcallDispStr; 调用显示字符串例程jmp$; 无限循环DispStr:movax, BootMessagemovbp, ax; ES:BP = 串地址movcx, 16; CX = 串长度movax, 01301h; AH = 13, AL = 01hmovbx, 000ch; 页号为0(BH = 0) 黑底红字(BL = 0Ch,高亮)movdl, 0int10h; 10h 号中断retBootMessage:db"Hello, OS world!"times 510-($-$$)db0; 填充剩下的空间,使生成的二进制代码恰好为512字节dw 0xaa55; 结束标志
然后怎么编译,怎么烧录到软盘或者镜像,以及系统从启动,到自检,到读取启动盘mbr记录,加载引导代码bootloader之类的,这里就不详谈了,书上都有,或者自己到csdn之类的搜索下就出来了。
这里我只是想表达下,操作系统的也是可以有Hello World版本的,入门也就30分钟的难度而已。所谓万事开头难,只要你开了个头,那你带领学生继续写的信心就会更大了。
但是
我们上面这个操作系统其实充其量也只能算个boot loader而已,其实boot loader也还算不上,因为它没有去load任何东西。
这往下的其实就是要实现的操作系统相关的更多功能了,相关的模块或者知识点我相信应该包含这些方面:
保护模式的跳转。这个你肯定得教给你学生的吧?毕竟,这是个非同寻常的跳转。这里gdt,ldt这些知识点肯定要涉及的了
内存管理。你分页也好,分段也好,分页+分端也好,只要你不是实模式的,那么虚拟内存和真实内存映射,用户态和和心态这些你是跑不掉的,否则你跑个应用分分钟访问到操作系统的内存去了。
进程管理。基本的cpu调度算法总要有吧,就算你只是个简单的写死的没有抢占式的时间片调度算法。
就教学来说,我觉得上面这些实现了估计也差不多了。
其实对于微内核来说,文件系统这些往往没有放到操作系统内核中去,而是作为应用层应用的,比如minix上就是这样做的。
如果还有精力的,那可以继续下面这些方面:
设备管理。简单的块设备和字符设备支持上就好文件系统其实《自己动手写操作系统》这本书我当时看的时候它刚出来,好多好多年前了,当时它还么有实现文件系统这一块的。设备管理好想也没有实现太多东西。
所以在这上面你应该能借鉴的不多。但是你可以参考我们大学时候的教程《操作系统设计与实现》,里面用到的是教学用的minix操作系统,完全足够你用了。
相关的一些细节以及上面提及的书籍,我在之前的回到中有说到,这里就不赘述了,先到这吧
《Linux内核代码大佬们如何观看的?》
我是@天地会珠海分舵,能力一般,水平有限,觉得我说的还有那么点道理的不妨点个赞关注下!