从零开始打造我的计算机系统
总序
从零开始打造自己的计算机系统,是我很早以前就有的想法了,什么叫从零开始打造自己的计算机系统呢?有人认为用ARM是,加上一大堆硬件是从零开始,有人认为在X86上写一个操作系统内核就是从零开始,我却决定从真正的零开始。
所有的只是计算机系统软硬件方面的知识,以逻辑为引擎,打造自己的计算机系统。模拟一个包含CPU,内存,磁盘,键盘,鼠标,网口,显卡,声卡在内的计算机系统。一切所有的只是知识,并且用C语言实现它。
当然这并不是原来的想法,原来的想法是做出实物来,大三暑假,确实用verilog写过一个CPU模拟器,写成的那一晚,真是人都要跳了起来,但是毕竟只是功能级的实现,连RTL都算不上,也没有什么时序仿真,接下来就去学C语言去了。
计算机知识学习的越多,就感觉电子的没有必要,支撑整个计算机体系的引擎是逻辑而不是电子,电子的汪洋确实没,我却离它越来越远了。
从一切意义上而言,我们有了{与或非}三种门,或者有{NAND门},或者有{NOR门},我们就有了整个计算机系统,它们都是逻辑完备的。首先{与或非}可以构成组合逻辑,然后作为时序逻辑和存储的基础:锁存器,也可以由与或非门构成。因此组合逻辑和和时序路基一建立,整个计算机系统也从此建立。而DRAM,一种电容周期刷新来保持记忆的内存,以磁性来保存记忆的磁盘盒磁带,以及光信息保存内容的光盘其实并不是打造一个新型计算机所必需的。
所以这一切都是模拟的,模拟可以从好几个层级进行模拟,可以模拟的很精细,也可以模拟的很粗糙,所以连模拟也有前人为我们探索了道路。首先作为软硬件的接口:指令集必须自己设计。从软件的视角,我们是通过指令来驱动硬件工作的,而恰好指令又能存放在硬件里,这就是程序存储思想的来源。
用当代的观点来看,一个完整的计算机系统可能包含以下几点。CPU,计算机的大脑,内存,计算机的记忆,磁盘,为了更大容量的记忆,显示设备,用来向用户输出信息,鼠标和键盘,接受用户的输入,声卡,向用户发送声音,网卡,一个面向旷阔计算机海洋的大门。很荣幸这一切都被人们抽象成了设备,设备具有一定的功能,并且连接总线上,设备总是有一个设备驱动器来驱动,所以一个典型计算机系统,看起来可能是这个样子的。
图 0.1 典型计算机框图
这样的简化模型,能让我们一开始工作的时候不用考虑那些复杂的设备,它们是后期可以添加上去的。在这个模型中我们或许需要考虑这样的一个问题,我们的设备的IO是独立地址空间还是内存映射IO呢?看起来Linux解决了这一个复杂性,但是我们还是选用内存映射IO的模型,就图 0.1而言,我们必须理解地址空间是什么意思,每个设备占用地址空间的一部分,IO设备一般占用地址空间的高部分,而内存占用低部分,我们或许会详细的问这样的映射是怎么实现的呢?
答:记得在大学里的某一次考试的某一道题其实考了这个内容,但是具体细节我忘了,但是通过几个{与或非}之后就能把不同的地址链接到不同的设备。
所以更真实一点的IO设备的映射图如下图所示:
图 0.2 IO设备的链接
如图 0.2所示,我认为这幅图更加形象的反映了“每一个设备都占用内存地址空间的一部分”这个概念。
重要:在物理世界里,很明显每一个控制器其实都是和处理器并行运行的,那么编程怎么实现这一点呢?可以用多线程,这里我使用了简单的消息队列来模拟这个过程。
目前,我们可以把这个计算机系统想象的简单一些,它有处理器,内存,显示器,键盘已经足够,处理器,由自己设计的指令集并且模拟实现,内存,是一个静态数组,显示器,调用一个图形库,划分一个800x800的窗口,键盘,捕获真实的键盘。
如同所有脆弱的芯片(8051,ARM)一样,我们还需要两个东西,一个是交叉编译器,在x86平台上编译出我们平台上的代码,一个是下载器,把内容下载到这个系统的内存里。所以最终本系统结构图如下。一些性能检测的工具,目前也需要有上位机来提供。
图 0.3 计算机系统模型
本系统,采用以下参数:
l 一个屏幕,用800x800的窗口,采用EGE娘的EGE库。
l 一块内存,内存暂定32MB。
l 一块硬盘,用文件作为模拟,64MB。
l 一个键盘
l 一个交叉编译器
l 一个程序加载器
屏幕的缓冲区映射到内存的0xb8000处(为什么?)采用80X25模型,每行80个,共25行。所以需要80字节X25=2000字节。最终为b8d70-1。
键盘的缓冲区映射到内存的0xb8d70处的16字节。接外部中断16。
在进行调试期间,我们采用《计算机组成原理-结构化方法》里面提供的布局模式,具体布局如下:
一个实际中运行的样子可能会是如下所示:
寄存器窗口:显示当前的寄存器的值,本CPU采用类似于MIPS的指令集,所以共有32个寄存器,SP,BP,IP会特别显示出来,
栈:显示当前堆栈内容
程序源文件:是反汇编后的结果。
子程序调用栈:我还不知道其用途。
解释器命令:这个还没有想好,可以先用《计算机组成原理-结构化方法》里面的,图示如下。
错误输出,输入,输出:分别对应STDERR,STDIN,STDOUT,这是借用UNIX的思想吧。
全局变量显示区:会显示全局变量。
综上所述,一个颇具可玩性的计算机系统的框架就这么设计好了。