计算机的启动-从设计一个主板开始

晨曦之光 发布于 2012/04/10 14:58
阅读 118
收藏 0

计算机是怎么启动的呢?这是一个问题。操作系统是怎么操作硬件的呢?这是又是一个问题。编址是怎么回事,这当然也是一个问题。我们通过设计一个简单的主板来理解这一切。
首先我们看一下编址,所谓的编址有一种方式就是将所有主板上“可以被访问的”设备全部编址到一个空间中,这样的设备包括内存,pci设备等所有设备。本文还是以最简单的方式举例,我们设想地址总线只有3位,也就是cpu只能处理3位的地址,那么我们怎么设计一个主板呢?不失一般性,以最简单的场景为例,我们的板子上除了一个内存外只有一个设备叫做dev0,如果要我来设计这个板子我就将3位地址空间0-2分3个地址给内存,分3到5这3地址个给dev0,6-7这两个地址给bios。
但是板子是怎么知道这个地址信息的呢?这个地址拓扑信息存放在cmos芯片中,由bios使用,由北桥和南桥芯片负责最后的硬件信号路由,如下图:

是

这样的设计,主板在上电稳定之后,按照cpu的特定要求,首先从地址6处取出指令,这个地址信息直接路由到bios,然后bios的代码进入cpu,开始执行,执行什么呢?执行自检!如何自检呢?有两种方式,最简单的莫过于根据bios设定的地址信息进行自检,具体办法:
1.检测内存的容量:由于我们事先不知道内存到底占用那些地址,因此我们必须从北桥处得到地址路由信息,然后根据这个路由信息依次从内存插槽的地址处读取数据,如果能读到数据,内存容量数就加1,依次类推。
2.检测设备型号:根据设备的规范,从“设备的起始地址+设备类型偏移地址”读取信息,读取到的信息就是设备的类型,细节不外乎多路复用电路和选择电路,这些在《计算机组成原理》中都能学到。
3.注意,北桥芯片内部的地址路由信息并不是bios设定的地址拓扑信息,而是主板硬连线的地址信息,比如内存条插槽有3根地址线都连接到了内存,那么就会读取8个地址的数据,很显然根据bios的设定,地址3往后的数据并不来自内存,而是来自dev0和bios,因此在读取数据之后还要进一步探测设备类型,如果读取到的设备类型不是内存,那么就不算内存容量。具体实现就是我们在设计内存条和设备时为每一个地址都保存一个“复位信息”,该信息表明了这个设备的类型,具体细节:
3.1.读取地址0的数据,得到了内存复位信息,它是内存,内存容量加1;
3.2.读取地址1的数据,同3.1...
3.3.读取地址2的数据,...
3.4.读取地址3的数据,得到了非内存的复位信息,我们认为它不是内存;
3.5....
除了采用“复位信息”这种办法探测设备类型之外,控制总线也是一种可以利用的总线,在选定了地址之后,可以发送特定的控制信息,来使得设备自报姓名!
这样我们就得到了内存的容量,也得到了哪些地址连接的不是内存,而是设备,这些都是北桥的功劳,但是连接的具体是哪种设备,这就需要bios的地址拓扑和南桥芯片来帮忙了。所有的芯片都是要符合一定标准的,标准是怎样的,全靠人来确定,因此可以说,计算基本上是没有智能的。
     现在自检完成了,一切地址信息都已经在内存中了(bios自检的第一步就是确定内存的存在和显示设备的存在),之后它将开始引导操作系统了,可以直接引导操作系统,也可以引导一个叫bootloader的东西,然后由bootloader来引导操作系统,不管怎样,bios已经可以将对机器的控制权交给其它代码了,那么它是怎样引导OS的呢?这也很简单,比如bios是从第一块磁盘启动,那么bios在交付控制前之前要执行从磁盘读取代码(mbr的引导代码)到内存的操作,由于自检过程检查了所有的设备,磁盘当然也是其中之一,bios当然知道磁盘的地址在哪里,再加以控制总线上信号控制,磁盘内存的读取也不是什么难事,接下来就是操作系统的天下了。
     要从根本上认识到,机器的所有信息都是bios自检后告诉操作系统的,操作系统仅仅使用了这个信息,比如中断号之类的信息,不要以为是程序员动态申请的,这些信息都是从bios中得到的,这样一来,操作系统就知道了bios告知的地址信息,然后操作系统也就可以从这些地址的某些偏移处读取设备的属性从而构建出诸如linux内核中pci_dev之类的数据结构了。硬件+bios搭台,操作系统唱戏,这就是我们当前计算机系统的全部内容,程序员不负责搭台,他们只需要把戏唱好就好了,搭台的事由主板厂商来做。
     然而,正如我们现实生活中所能感知到的,有时候,一个很好的演员会在一个质量低劣的舞台上受伤,这只能说明舞台不好吗?很多时候,戏子们太天真了,而实际上,下面漏洞重重!


原文链接:http://blog.csdn.net/dog250/article/details/6261682
加载中
返回顶部
顶部