现在中美贸易战+芯片大战搞得我们处处被漂亮国卡脖子,我辈唯有奋发图强,打铁还需自身硬!今天我们就来看看如果要自己搞一个OS出来,有多难。
可以先试着阅读freertos的源代码,这是目前工业级别的实时操作系统里面代码量较少的。如果你能半个月之内读懂,那么按照你的水平应该可以的。
如果不行的话还可以试试看下面的学习路线。
这是lisuwei写的一篇简单的教你如何实现操作系统中的多任务抢占式调度器的PDF电子书,全书只有25页,相信只要有CS或者EE大三水平的人应该可以一个小时内就看完,然后一天内写个简单的操作系统。(如果你把操作系统定义为只有多任务调度器的情况下)



如果你觉得这个难度级别太低了,还想挑战更高级的,比如工业界更加常用的ucos实时控制操作系统,那么可以看看野火开发板里面附送的资料。


这些书的页数都不是很多,一个月就能看完的。如果你真的完全读懂了,半个月写出来一个简单的RTOS应该也不是太大问题。
当然这种OS是不带GUI的,甚至没有键盘和鼠标输入,通常都是单片机等工控领域直接用传感器和简单的按钮进行控制。和你理解的电脑操作系统还是相差甚远。
如果你要写一个电脑操作系统,那你理解完实时操作系统的原理后再去解决鼠标键盘的驱动,以及显示器输出(VGA驱动)就行了。鼠标键盘的ps/2驱动方式本质上和uart串口的驱动方式非常像,属于嵌入式驱动开发里面最基础的部分(在很多大学通常是嵌入式开发这门课的第一个homework),vga稍微有点难度(只是稍微难一点,至少没有hdmi,usb这种涉及到差分高速信号的协议那么难),在时序方面涉及到行和场的消隐和同步信号的发生,以及在行和场的有效tick内按顺序输出每个像素点rgb数字值,然后通过硬件级的dac(数模转换器,本科大二数字电路这门课里面有讲过,通常是一个权值电阻阵列)输出到物理层的d-sub接口。通常这三个部分都是大学本科嵌入式课程里面的期末作业。
之所以要封装驱动这一步,是因为OS里面通常都有系统调用(system call)的API,你为了能够让你OS上面其他软件很方便的像屏幕输出文字(printf,putchar函数),以及获取键盘输入的字符(scanf,getchar函数),那么你就必须实现驱动,封装出各种系统调用的API。只不过VGA驱动在X86平台通常都有显卡以及vgabios封装好了,你只需要往对应的RAM地址范围填入对应的ascii码或者RGB颜色值就好了。但是如果是用STM32这种ARM平台,就没有这么好用的BIOS提供给你了,就需要我上面说的自己封装驱动了。
最后把输入输出io外设的驱动搞定了,那么剩下就是GUI方面的开发了,你可以模仿现有的stemwin去写简单的控件以及事件处理函数(按钮,文本输入框等),也可以不用gui,就用最原始的命令行操作,只需要预存ascii的字库点阵图,然后通过一定的算法计算出每个点阵图该渲染到哪些像素就好了。毕竟不带gui的linux也算是“电脑操作系统”嘛。况且现在的bios通常有内置了部分中断处理程序能够直接实现在ram指定区域上存入一定的ascii值,然后屏幕自动输出对应点阵字的程序,x86平台可以通过int 09h等软中断触发。所以这一部分本质上就是调库而已,几乎不会耗费你多少时间。(这部分内容通常本科大二的汇编语言这门课会学习到,王爽的汇编语言等教程最后几章就是再讲bios中断的,感兴趣可以看看这本书,国产教材里面少有的良心之作)
处理完任务切换以及IO之后,还有更重要的内存分配(malloc函数),磁盘文件系统(外设IO仅仅是能够实现往磁盘透明读写0101的二进制数据流,真正要让磁盘能够像电脑操作系统一样有文件夹等结构,甚至支持加密,快捷方式等功能,必须要实现一套文件系统,例如FAT,EXT,NTFS等),这些在上面的电子书里面都有介绍提到,网络上也有很多资料,例如fatfs这个库实现了一个简单的文件系统。这方面说难也不难,说简单也不简单。之所以说不难,是因为如果仅仅是满足于实现功能,那么确实不会很难,但是要写出高性能,低占用空间的内存分配算法和文件系统,在优化方面还是很难的。
如果你还想进阶,让你的操作系统具有网络通讯的能力,还可以了解一下LwIP这个库,它是一个非常简单的在嵌入式单片机上实现TCP/IP协议栈的库。
上面涉及到的内容几乎都是计算机或者电子工程专业的科班课程。如果你是非科班,那么学起来应该很吃力,因为你缺少科班大一大二的基础课知识,你真的对这个感兴趣的话,我建议你去中国大学mooc上面把那些评分高的好大学的慕课都看几遍补上基础知识再来学会更好一点,不然很容易丧失兴趣。
看完上面的分析可以看出,一个OS,根据你对他的要求和定义不同,写出它需要耗费的时间也不同,半个月时间写出一个完成度较高的电脑操作系统的难度还是比较大的。
图上这些资料都是买开发板附赠的,如有侵权请私信我删除。
有兴趣的老铁,快快关注我,私信拿资料吧!