和所有打算自己实现一个操作系统的朋友一样,受Linux如何诞生的故事所激励,希望能全面了解计算机的硬件结构,就是被现有的操作系统所隐藏的各种细节,也希望弄明白一个操作系统到底是如何工作的。目前操作系统的架构以及设计实现也非常成熟,大部分学校的计算机系都开设操作系统课程,即使你没有自己实现操作系统,也能明白它如何实现内存和其他硬件资源的管理,进程调度,进程间通信,以及网络等等。你只要遵循所学到的知识,读源码,看教程,然后从一个汇编代码的bootloader写起,逐步加载一个用C写的内核镜像,包括虚拟内存管理,调度器,等等。目前大部分能够找到的homebrew操作系统源码,大概都遵循这个套路。
汇编代码给人带来的直观感受是多达几千行形状又细又长的代码,其中大部分的指令是MOV,在内存地址之间搬运来搬运去,或者随随便便就可以跳转到某个位置。但事实上,汇编语言支持强大的宏,正确地使用宏可以极大地增强汇编代码的可读性,缩小代码量,并且实现模块化编程。只是由于高级语言和编译器技术很早就得到普及,因此在结合宏进行汇编语言开发的探索没有进行下去。
Concordia受到JonesForth这个项目的启发。它是一个Forth语言的实现,同时也是一个由x86汇编完成的项目。这个项目包含Forth的定义,以及实现对这个语言的解释器的设计细节,同时它也成功地向我们演示了在2010年应当如何用汇编语言做些事情。Concordia也做了同样的事,Concordia未必是一个成功的系统,甚至很可能不是一个能使用的系统,但是Concordia也希望能启发人重新思考汇编的开发。
这个开发方式的大体思路是,你不能直接上手去写汇编代码,而是要先围绕一系列基础的操作和数据结构构造出宏,然后使用这些宏来编程。很类似先写出一个底层的代码库,只是在这里这个代码库使用汇编语言实现的。
从语言设计的层次,Forth是一个连接式语言(concatenative language),也就是说语言的语法要素通过前后连接而成,不像高级语言如C/Lisp有括号和引号等专门指示代码结构的语法要素,也就是说实际上Forth是顺序执行一系列的关键字。从语言实现的层次,Forth包含有一个可以不断扩充的关键字字典。关键字既可以对应到一段汇编代码,也可以对应到其它关键字的序列组合。
这样使得Forth所对应的汇编代码有些不同的特点。对于POSIX兼容的嵌套函数调用,每次调用函数之前,都先需要将所有寄存器中的内容压入栈中,调用结束后再弹出。然而在Forth所对应的系统,寄存器是全局的中转站,因此和POSIX正相反,是进入下一个子过程前时将结果保存至寄存器里,进入后再从寄存器中取回数据。
因此,Forth很类似一个可以使用汇编语言的最小运行时环境。如果说UNIX是一个庞大的C的运行时环境,它围绕着C提供了编译工具、系统不同层次访问各种资源的接口,那么Forth就是一个最小化的汇编语言的运行时环境。一个Forth提供了一个非常基础的汇编器,将汇编代码转化为机器指令序列后加载到内存中,然后通过Forth的关键字及关键字组合来调用它。
总之,这一切的目的并非是为了打造一个高效的或者易用的系统,而是为了使得计算机内的所有软硬件资源都能暴露给使用者。当然,风险自负。
很多描述性出现在注释中,你需要在阅读注释的同时阅读代码才能明白,可以从Main.S开始。.s后缀是*nix下汇编代码的后缀,你可能需要在编辑器中安装一个代码高亮插件。
这个项目是在OS X下开发的,因此使用了OS X的工具链。在OS X下的系统调用符合BSD规则。cc是BSD下的C编译器,其中整合了汇编器,因此接受AT&T风格的汇编代码。otool是BSD下的十六进制工具,你可以看到汇编后的二进制文件的分布,其中哪些是指令,哪些是数据。
由于OS X的系统和工具链都兼容BSD,这意味着你无法在Linux下直接使用这些代码。但是本项目服从WTFPL协议,意味着you just DO WHAT THE FUCK YOU WANT TO.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。