计算机当中包含的存储器可以分为随机存储器(RAM)和只读存储器(ROM)(好像硬盘也能叫存储器,但本文不讨论)。RAM的特点是要持续供电才能保存数据,可读可写,而ROM就算断电,也不会丢失数据,而且是只读的。
我们打开机箱的盖子,罗列一下所有的RAM和ROM,首先主板上有一根或者几根4G/8G的RAM,还有一个CMOS,它也是RAM,显卡上面有2G的RAM(就是显存),还有ROM,网卡上面也有ROM。而CPU和这些存储器是通过总线连在一起,我们整理一下,他们的逻辑连接大概就像这样。
为什么每个接口卡都有ROM?ROM是只读的,硬件厂商在制作硬件的时候会在里面设置一些程序(比如一些可供调用的函数,就是所谓的BIOS),至于这些函数是干嘛用的下面再说。你也许会说,为什么不把所有的程序都写到主板上的ROM里面?我们拿显卡举例吧,生产显卡的厂商不止一家,他们的ROM里面的程序是不一样的,如果把所有的程序都写到主板上的ROM,那我以后换显卡该怎么办?这其实就像你写程序一样的,你应该不会把所有功能都写在一个函数里面吧?!所以不同的接口卡都有自己的ROM。
这些不同的存储器在物理上都是独立的,但是在CPU眼里,它们被抽象成了一块逻辑存储器(就是所谓的内存地址空间),每个设备对应逻辑存储器的一个地址范围,就像这样。
当cpu访问相应的内存区段时,实际上就是在访问相应设备的内存。当然,这里还有一个有意思的问题,就是CPU如果要把显存上的一个地址的内容挪到cpu内部,就像执行指令"MOV ax, [B800:0]"(当然这是伪代码,实际上是不合法的。B800:0是显存上的一个地址),但CPU如何根据这个指令判断出应该去显存上面去读数据,而不是其他什么存储器呢?这涉及到计算机组成原理了,有兴趣的可以去学习下。
接下来我们聊一个有意思的话题,就是主板上的ROM在操作系统被加载的过程中扮演一个什么样子的重要角色?我们知道任何程序(包括操作系统)一开始是被存在硬盘上的,想要得到执行的话,肯定需要被加载到内存条上才行,可是谁来加载呢?因为我们在按下开机键的时候,内存条才刚刚通电,上面什么东西都没有啊!等等,我们好像漏掉了什么?回顾上面的内存地址空间示意图,我们主板上的Rom已经有程序了,且内容不会因为断电而消失记得吗?所以当机器通电的时候,cpu就可以访问到System Rom 里面的BIOS程序了。所以整个过程是这样的,当我们按下开机键的时候,cpu直接从某一地址开始执行代码(在8086CPU的机器中,该地址是FFFF:0000,这个地址刚好在"System Bios Rom"这个地址范围内,我们不需要关心这具体地址是什么,反正就是在硬件层面“写死了的地址”),好了,接下来想干嘛就干嘛,当然也可以从硬盘把操作系统的代码给load到内存条(这是笼统的描述,以后再详细描述操作系统从硬盘加载到内存的过程),这差不多就是“盘古开天地”的过程了。