我们现在的任务是快速搭建一个最小化的内核,方便我们在项目运行起来后可以加载lisp的解释器。所以我们要解决繁琐的操作系统最开始的引导到加载内核代码的过程。好在不需要重头开始,rust有现成的模块给我们使用。
要知道这个系列的文章遵循一个原则:
如果可以拿来使用就先使用起来,而不必要了解原理。了解到原理即可,如无必要不进行重写。
哈哈哈,是不是很工具主义呢?

从blog_os的项目开始

关于如何使用rust写一个最小化的内核,已经有很多资料了。如果读者喜欢可以自己进行探索。但是今天这里要介绍的事blog_os。这个blog_os的博客(英文)是一个很好的文档 (中文文档),告诉你怎么开始用rust写一个os。而且会穿插一些必要的操作系统的知识。比如分页机制,比如堆栈的初始化,再比如重要的打印。所以如果你想打好基础,请务必跟着博客的内容自己开发一遍。
等你完成了后再来继续阅读下面的博客也是可以的,当然或许你阅读时失败了,也没有问题,下面会有一个简便的教程,如果不考虑细节也是允许的。

我们知道英文难啃,在知乎里使用Rust开发操作系统作为关键字搜索。会发现有人在翻译上面的英文博客。当然没有全部翻译完,建议催更。

跳过理论的直接开始

显然如果你阅读了上面的博客就不需要下面的介绍了,可以去下一篇博客继续学习。以下是给那些愿意偷懒的同学准备的。
我们现在做的事情很简单,就是把blog_os的源码下载下来后,直接在那个基础上进行开发就好了。

  1. git clone https://github.com/phil-opp/blog_os.git {你要起的文件夹名字}
  2. cd {你要起的文件夹名字}
  3. # 切换到他最新一次的提交 这部是必须的
  4. git checkout post-10

好了,我们现在的任务就是让它跑起来,笔者是根据博客的内容一点点做的,大约花了一周的时间。但是仅仅运行起来却只花你大约一晚上的时间就可以了。
现在直接用cargo build是不行的。我们要特别的编译环境—交叉编译环境。要在一个平台上写另一个平台上的代码,没有这个东西是不行的。顺便一提,笔者希望用Common Lisp去实现操作系统,后来没有找到对应语言的这个东西,于是放弃了。好在rust上是有这个东西的,有下面的语句就可以安装。

cargo install cargo-xbuild

现在简单多了,直接运行一个执行命令就可以跑起来了。(因为运行的方法已经在代码中配置好了,如果你对这个过程感兴趣,再次强烈建议阅读blogos博客。)

cargo xrun

它会帮助你自己安装依赖然后直接执行虚拟机。如果一切正常的情况下会看到下面的内容:
2020-01-03 16-25-22 的屏幕截图.png

你会发现它一直在打印点点。这个其实是处理的时钟中断。我们现在去关闭它。找到下图中的文件。在src/interrupts.rs的75行处。把它注释掉就好了。

2020-01-03 16-30-48 的屏幕截图.png
好了现在我们的操作系统安静了许多,没有打印那群令人恼火的点点了。

恭喜自己,准备开始新的挑战

太棒了,你已经做了我将近一个月的工作量了。哈哈,但是别膨胀。后面才是重头戏。那么接下来我们要去做什么呢?我的建议是阅读文档储备一下知识。如果你是选择取巧的方法走到了这一步,心里很虚怎么办呢?我给你准备了一个阅读清单,每当你在后面的开发中遇到一些语言和概念上的问题可以去下面这里找到答案。

现在整理好表情,下一章要开始进入的lisp解释器的领域了。如果有空还是先多看看上面列出的Rust的基础语法,或者有关os的基础知识,或者感受一下lisp语言的魅力,让你对我们要实现的东西有个初步的感悟吧。