这个故事始于2018年5月。那个月我给自己买了一辆树莓派3B。我有一个模糊的想法,想用它做一面智能镜,但很快就意识到:
我摆弄着Raspbian,试图加载谷歌助手,这样我就可以给自己买一个便宜的谷歌主页。不幸的是,Google Assistant SDK存在一些破坏交易的限制。像热词检测这样简单的事情很难设置,充其量也就是偶然事件。
也许它可以是一个“我的世界”服务器?结果发现,Mincraft Java版服务器根本不适合内存仅为1 GB的设备。
在此之前大约4个月,我在大学学习了操作系统入门课程。我们对哈佛大学创建的教学操作系统OS/161进行了修改。我个人很喜欢那个课程,因为我们在兔子洞里只走了几英寸,我有很多问题没有回答。我的覆盆子PI需要比35美元的纸镇…更好的东西。
如果你读到问题时深深地叹了口气,我不会责怪你。当涉及到这样的事情时,我是相当天真的。这种天真就是我没有立即放弃这个想法的原因。事实上,我用另一种同样天真的观点来支持它:
好了,别再提那些卑鄙的事了。我已经下定决心了。我决定写一种操作系统。我的目标是什么?
如果我能让它做任何有用的事,那就是奇迹了。我们就当这是一次学习经历吧。
做任何复杂的事情(连接到互联网、使用HDMI等)。是完全没有问题的。
就这样,在2018年5月的一个决定性的日子里,它开始了。这是一个周末的黑客马拉松,开始了一年多的操作系统编写之旅。
很明显,我没有在那个周末构建操作系统。事实上,我继续在黑暗中摸索。我决定慢慢来。将不会有代码的盲目复制。我会做一些研究,看一些手册。然后我会拼凑一些代码。加上一些评论和大量的待办事项。经常失败。再试试。冲洗并重复。
自2018年以来,该项目已经取得了长足的进步。我会花几个星期的时间练习它,然后在上课的时候把它放在一边几个月。
顺便说一句,我到目前为止写的并不是真正的操作系统。它还不够复杂。正确的术语应该是裸机程序。
到目前为止,该程序实现了虚拟内存和中断等概念。这里有一些用于线程化的初始代码。它使用帧缓冲区通过HDMI输出基本形状和VGA字体。我还在对一些实现USB的代码进行反向工程!
当试图编写操作系统时,会有过多的细节。您可以以任何您想要的方式实现一切,因为作为开发人员,您拥有很大的控制权。这也意味着有大量的事情需要跟踪。当一切都开始破裂时,很难找出原因。
我一直发现,一个好的学习方法很难做到。对于那些对嵌入式开发感兴趣的人,我建议您尝试一下这样的方式!我是在几乎没有经验的情况下进入的,而且走了这么远,所以我绝对可以想象会有更多的人做同样的事情!
你可以在GitHub上找到我的项目。我试着把事情记录下来,并尽可能地跟踪我的进度。我的承诺不是最好的,所以请注意。