该项目是一个自制计算机系统的项目,其目标包括cpu设计、外围的控制器如内存、cache、IO、中断等设计、外设如打印机、存储器等的设计,编译器和操作系统的移植。项目本身并不追求极限性能,和完美的安全性,只是在力所能及的条件下做一些优化。功能完善、易于测试和扩展是本项目的首要目标。
硬件设计目标
本项目所使用的CPU为类MIPS架构,硬线逻辑仅支持整数指令,没有硬件乘法器、除法器。在FPGA中综合,不使用任何基于厂商的IP。采用5级流水线,精确中断,集成SDRAM双端口控制器,包含一级指令和数据cache。
CPU的整体结构与李亚民所著的《计算机原理与设计》中的相似,但调整了一些指令的实现,并期望引入微代码来增加CPU的可扩展性,降低编译器移植和系统编程的难度。
编译器移植目标
本项目计划移植lcc编译器到该平台,以实现工具链软件。由于本项目所使用的CPU与MIPS结构相似,所以移植基于lcc编译器的MIPS后端md文件进行。由于本项目所使用的CPU与MIPS结构不完全相同,修改lcc的后端的工作可能包括:
- 熟悉lcc的整体结构,包括其前端和中间代码生成
- 基于MIPS后端针对该平台进行移植
- 进行一些力所能及的优化和测试工作
编译器是一个十分复杂的程序,编译器移植工作可能是整个项目中难度最大的部分。
其他工具链软件的设计
- 对于连接器,本项目认为其在项目初期是可选的
- 对于汇编器,本项目拟选择一个维护良好的开源汇编器为基础,进行修改
- 对于预处理器,本项目拟直接使用gcc工具链的C语言预处理器
操作系统的移植目标
鉴于MINIX操作系统有详细的资料,并且代码量很少只有几万行,本项目打算在工具链软件调试适当时,进行操作系统的移植工作,目标是将MINIX操作系统移植到该自制平台。这些工作可能包含:
- Minix 源码的阅读
- X86 保护模式的考察
- 对于该自制平台的保护模式的设计取舍的思考
- 在不影响兼容性的情况下加入虚拟内存(段式或页式)
- Minix 的移植工作
从目前来看,minix中平台相关的代码,大量是处理保护模式、中断向量等内容,在硬件相关的设计上可以进行取舍,以简化移植工作。
对于该自制平台的保护模式的设计目标,主要是为了保护操作系统内核的安全,保障操作系统的稳定运行。并不追求完美的进程间的数据隔离。因为Intel的处理器,花费了巨大的精力,实现了其精妙的保护模式,仍然逃不过幽灵、熔毁等旁路攻击。所以在一个科研性质的自制平台上追求完美的数据隔离是不自量力的行为。
Minix3 并不支持分页,使用的是段式存储,这需要对cpu的内存控制进行一些修改。
希望向CPU中加入微代码,也有方便系统编程的目的。可将常用的系统编程指令序列设计成若干由微指令解释的指令,如内存块的复制,中断、异常发生时现场的保存、从中断、异常返回时的现场恢复等。
因为系统编程这一部分,大部分是用汇编语言直接编写,所以编译器并不能帮上忙,若直接定义新指令,可以简化这部分编程的难度,也利于调试。而且这些系统编程指令,往往不是用户程序所使用的,因此编译器可能永远都不知道这些指令的存在,所以引入这些指令可能不需要对编译器的修改。
参考资料
该项目是一个长期项目,笔者已经为实施该项目所需要的知识储备准备了多年,并搜集了一些参考资料。
硬件系统的设计
- Verilog HDL 数字设计与综合, Samir Lalnitkar, 夏文宇等译。
- See MIPS Run, Dominic Sweetman. 这本书很好看,解释了许多重要的概念,例如MIPS中的指令延时槽,内存的保护等。关于这本书还有一些小故事,之前我一直在读这本书,直到最近我才发现这本书有一本中文译本,而且翻译质量非常好,打开一看竟然是我自己的老师屈建勤翻译的,相见恨晚呀!感谢屈老师能为大家提供这么好的学习资料的翻译。
- Computer System Architecture, M.Morris Mano. 这本书是很老的书,但是笔者是从这本书里入门的。这本书是笔者刚开始学习计算机系统设计时,经过了很多次试错,最终选定的一本书,写的非常详细。书中从最基本的数字逻辑开始,一直讲到外围电路的设计,没有使用任何基于商业软件的IP,而且最终书里实现了一个很简单的CPU。
- 计算机原理与设计,李亚民。本项目设计的CPU基于这本书所记载的类MIPS CPU进行修改。笔者非常感谢这本书的作者,这是一本伟大的著作。这本书是我看到过的对处理器设计描述最详尽的著作。在工程上,理论和实践的差距之巨大,无法用语言描述。阅读这本书,从作者精妙的代码中,就可以填补理论和实践之间巨大的鸿沟,这对一个工程师来说会产生一种巨大的满足感。
- Fpga4Fun: https://www.fpga4fun.com/. 笔者通过这个网站入门FPGA。
- Computer Organization And Design The Hardware/Software Interface. 这是一本经典教材。
软件系统的设计
- Operating System Design and Implementation (the Minix Book), Andrew S. Tanenbaum. 这本书简直是学习操作系统的圣经,就是如果认真读代码的话,需要大量的精力。
- Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1. Minix书中的代码是基于X86的,要想读明白其平台相关的部分,X86的系统编程手册是不可缺少的材料。关于X86的保护模式,手册里有介绍,但是他的介绍非常繁琐,笔者也是花了很长时间才弄明白,有机会笔者会写一篇博文,详细介绍minix如何使用X86的保护模式。
- MOP: Minix Overdocumentation Project,http://www.os-forum.com/minix/boot/index.php. 这个网站的作者,花费了大量的时间,对minix的启动代码进行了逐行分析。只要完整的阅读完这个网站,你就可以知道一台X86 PC在按下电源按钮后,BIOS运行结束后到操作系统加载之间的所有运行情况。但是要做好心理准备,这个过程很复杂,并且理解他需要了解X86的保护模式。Minix书中并没有对其boot monitor的代码进行注释,只是在书中提了一句,说boot monitor十分复杂,不亚于一个小型的操作系统。事实上也确实如此,笔者不才,完整阅读这个网站花费了两个多月的时间。笔者发现这个网站,是在读minix书的过程中,由于书中对其启动器描述的缺乏,使得我对操作系统初始的运行环境有疑惑,进而找到了这个网站,完美地解答了疑惑。这个网站的作者,对笔者也有很深的影响,有时候做一件事不需要考虑太多结果。学习本身就是一件有意义的事情,对于个人如此,对于社会更是如此。这个网站也是我准备这个博客的原因之一,要把自己的学习过程社会化,只要能有一个人从我的经历中得到帮助,本身就是一件很有意义的事情。
- Lcc-A Retargetable C Compiler: Design and Implementation. lcc是一个很有名的编译器,它本身是一个文本程序,这本书详细的介绍了其实现的每一个细节。只是笔者水平有限,读起来十分吃力,花了将近四个月时间才读完,掌握了对其修改的能力,也深入了解了ANSI C标准的实现。值得一提的是,这本书有一中文译本,但是很遗憾,不同章节翻译的质量有很大的波动,而且也有一些翻译上的错误,在这里笔者就不推荐了。