注,该博客采用8086CPU作为详述,和别的可以类比,大部分都是相同的。
一台计算机的大概结构:
最底层是CPU,中间层是操作系统,最上面的就是应用程序了。比如:CPU采用intel的,然后操作系统采用Windows,然后应用程序我使用QQ。就是这样的一个大概的逻辑结构。
所以这里的CPU的流程和计算机的流程其实是一样的,因为计算机的核心就是CPU。也就是计算机的启动过程≈CPU的启动过程。
预先知识:
计算机的加电和复位
电子计算机也就是我们平常用的普通计算机。都是得通电后才可以使用的。
当CPU通电启动后,CPU会执行一个硬件初始化和内部的一个自测试来检测是否有问题,然后再把寄存器赋值到一个预先定好的状态。
而复位就和CPU加电启动的功能是一样的。
对于8086CPU来说,进行硬件初始化,会把所有的CPU置为0,除了代码段寄存器CS会置为FFFF。注,这里只针对8086CPU
CPU的主要功能就是拿来取指令和执行指令,再加点或者复位后就会立刻去执行工作。
而8086只有实模式这一个CPU运行模式,所以它会自动去取CS:IP地址的指令。也就是位于FFFF:0000(FFFF0)地址的指令。
8086CPU地址分配情况
在计算机中8086CPU可以访问00000~FFFFF的内存地址空间,但是并不意味着这段内存就是一个整体了。
事实上这块00000~FFFFF的地址范围会被地址分配电路分配到三个部分里面去:
这三个部分分别是:
DRAM
00000~9FFFF对于的可读写内存,也就是平常我们常说的内存条。
内存由字节组成(通常的内存单位就是一个字节,也就是八位),而字节又由比特(bit组成)。为了节约成本,并提高容量和集成度,在内存中,每个比特的存储都靠一个极其微小的晶体管和一个同样极其微小的电容来完成的。电容可以充放电,可以通过充电和放电来表示比特的1和0但是这么微小的电容它的泄漏电荷的速度当然也非常快。所以,个人计算机中使用的内存需要定期补充电荷,这称为刷新在刷新期间肯定就是不能访问的,但是没关系刷新的时间非常短,完全可以错开。
这种存储器又叫动态随机访问存储器(Dynamic Random Access Memory,DRAM),所谓的动态随机访问的意思就是访问任何一个地址所花费的时间一样。
由于这个存储器的构成原理,所以它断电关机后内容就没了。所以开机后是不能直接读取里面的内容的,因为里面啥也没有。
外部设备接口电路或接口卡
A0000-EFFFF 这一段地址空间来自于外部设备接口电路或接口卡。比如声卡,网卡和显卡。
计算机可以连接各种设备,但是设备是不能直接接入的,它们需要通过各自的接口电路或者接口卡才行。
比如显卡:
左边这个是电脑主板,中间这个是显卡,右边这个是显示器。
显卡通过电缆连接显示器,给显示器发送视频信号,另外显卡还需要插在计算机的主板上才行,都连接好了就行了。
显卡上也有存储器,CPU可以把要显示的文本内容写入显卡上的存储器然后显卡将其转化为视频信号传输给显示器,然后显示器就可以显示文本了。
ROM BIOS
F0000~FFFFF 这一段地址访问的是一个特殊的存储芯片叫做ROM BIOS。
这种存储器只能用来读取不能写入,叫做只读存储器(Read Only Memory,ROM)简称为ROM。
和DRAM内存条不同,ROM的内容是不会刷新的,内部已经写好了。
所以整体的8086地址分配情况其实是这样:
所以8086在FFFF0地址得到的第一条指令,其实是在ROM BIOS里面的。
这个ROM BIOS里面就固化了开机指令通常是一个跳转指令,它通过改变CS 和IP的内容,使处理器从ROM 中的较低地址处开始 取指令执行。
这块ROM 芯片中的内容包括很多部分,主要是进行硬件的诊断、检测和初始化。
它还负责提供一套软件例程,让人们在不必了解硬件细节的情况下从外围设备(比如键盘)获取输入数据,或者向外围设备(比如 显示器)输出数据。
这块ROM 芯片只针对那些最基本的、对于使用计算机而言最重要的设备,而它所提供的软件例程,也只包含最基本、最常规的功能。正因为如此,这块芯片又叫基本输入输出系统(Base Input & Output System,BIOS)ROM
ROM-BIOS 的容量是有限的,当它完成自己的使命后,最后所要做的,就是从辅助存储设备读取指令数据,然后转到那里开始执行。
辅助存储设备
历史上,有多种辅助存储设备,比如软盘、光盘、硬盘、U 盘等, 相对于内存,它们就是人们常说的“外存”,即外存储器(设备)。
CPU从内存中读取指令和操作数,外部存储设备是内存的后部存储设备,外部存储设备的内容只有加载到内存之后才能通过cpu来访问。
HDD是传统的机电式硬盘(Hard Disk Drive),是机械和电子技术的混合体。
SSD是最近兴起的集成电路硬盘也叫固态硬盘(Solid State Drive),是纯粹的集成电路硬盘存储速度很快。
HDD硬盘:
硬盘 是多盘片、密封、高转速的,采用铝合金作为基片,并在表面涂上磁性 物质来记录二进制位。这就使得它的盘片具有较高的硬度,故称为硬 盘。
硬盘的内部构造:
硬盘可以只 有一个盘 片(这称为单碟),也可能有好几个盘片。但无论如何, 它们都串在同一个轴上,由电动机带动着一 起高速旋转。一般来说,转速可以达到每分钟3600 转或者7200转,有的 能达到一万多转,这个参数就是我们常说的“转/分钟”(Round Per Minute,RPM)。
每个盘片都有两个磁头(Head),上面一个,下面一个,所以经常用磁头来指代盘面。磁头都有编号,第1 个盘片,上面的磁头编号为0, 下面的磁头编号为1;第2 个盘片,上面的磁头编号为2,下面的磁头编 号为3,以此类推。
每个磁头不是单独移动的。相反,它们都通过磁头臂固定在同一个 支架上,由步进电动机带动着一起在盘片的中心和边缘之间来回移动。 也就是说,它们是同进退的。步进电动机由脉冲驱动,每次可以旋转一 个固定的角度,即可以步进一次。就好比旋转木马,必须通过中间那个启动来一起移动。
当盘片高速旋转时,磁头每步进一次,都会从它所在的位置开始,绕着圆心“画”出一个看不见的圆圈,这就是磁道(Track):
磁道是数据记录的轨迹。因为所有磁头都是联动的(参考前面那个旋转木马),故每个盘面上的同 一条磁道又可以形成一个虚拟的圆柱,称为柱面(Cylinder)。
磁道,或者柱面,也要编号。编号是从盘面最外面的那条磁道开始,向着圆心的方向,从0开始编号。
为了加速数据在硬盘上的读写,最好的办法就是尽量不移动磁头。当0 面的磁道不足以容纳要写入的数据时,应当把剩余的部分写在1 面的同一磁道上。如果还写不下,那就继续把剩余的部分写在2 面 的同一磁道上,以此类推。换句话说,在硬盘上,数据的访问是以柱面来组织的。也就是竖着记录的,这里的面就是柱面的意思,一层一层的像千层饼一样。
前面的描述就是相当于一个柱子然后分好几层,并且是竖着分和通过圆面来分是由上至下,由外之内来区分和读取,最后读取的可以抽象成一个圆面。
然而你以为到这里就完了吗?其实并没有。
磁道还不是硬盘数据读写的最小单位,磁道还要划分为扇区(Sector)。磁道很窄,也看不见,但在想象中,它是一个空心圆,占有一定的宽度。将它划分许多分段之后,每一部分都呈扇形,也就是扇区:
每条磁道能够划分为几个扇区,取决于磁盘的制造者,通常为63 个。个扇区都有一个编号,但是与磁头和磁道不同,扇区的编号是 从1 开始的,最后通常是63结尾。
扇区与扇区之间以(空白)间隔开来,每个扇区以扇区头开 始,然后是512 个字节的数据区。扇区头包含了每个扇区自己的信息, 主要有本扇区的磁道号、磁头号和扇区号,用来供硬盘定位机构使用。 现代的硬盘还会在扇区头部包括一个指示扇区是否健康的标志因为在反复读写后很有可能对扇区进行一个破坏,以及用来替换该扇区的扇区地址。用于替换扇区的,是一些保留和隐藏的磁道。
启动过程
有了前面的预备知识,这个启动过程就很好理解了。
首先8086CPU加点启动后,指向的地址为 FFFF:0000,这条指令是属于BIOS的。
这里8086对应的BIOS中的指令为jmp F000:E05B(FE05B),也是属于BIOS的地址空间里面容纳了硬件的诊断、检测和初始化程序。
但是ROM BIOS的内存是不大的肯定容纳不下像Windows操作系统这样的东西,只能作为一个媒介来使用。所以在ROM BIOS里还写好了一些指令,用来从外部存储设备里面读取内容到内存,然后让CPU来执行。就像你平时用的Windows,肯定是存放在硬盘里面的,然后系统先执行自己的初始化,然后把外部设备里的系统再加载到内存让后CPU来执行。
前面的内容可以归咎与ROM BIOS了,其实里面干啥了我们也不知道,因为这个是人家写好的。但是后面ROM BIOS的执行完了的我们是知道的:
(这一坨黄色的是CPU在离开ROM BIOS前执行的最后的代码)
这里需要补充一个知识,主引导扇区:硬盘的第一个扇区是0 面0 道1 扇区,或者说是0 头0 柱1 扇区,这 个扇区称为主引导扇区。
如果计算机的设置是从硬盘启动(大多数是这样),那么,ROMBIOS 将 读 取 硬 盘 主 引 导 扇 区 的 内 容 , 将 它 加 载 到 内 存 地 址 0x0000:0x7c00 处(也就是物理地址0x07C00),然后用一个jmp 指令 跳到那里接着执行:
jmp 0x0000:7C00
通常,主引导扇区的功能是继续从硬盘的其他部分读取更多的内容 加以执行。像Windows 这样的操作系统,就是采用这种接力的方法一步 一步把自己运行起来的。然后就电脑正常运行了。