计算机的启动总是从上电开始的,在上电过程中处理器会执行硬件初始化的相关操作,以及可选的内部测试,然后将内部所有寄存器的内容初始到一个预置的状态——复位。复位可根据行为的差距分为上电复位、硬件复位、软件复位等。
对于Intel 8086来说,复位将使代码段寄存器(CS)的内容为0xFFFF,其他所有寄存器的内容都为0x0000,包括指令指针寄存器(IP)。
NOTE
如果你好奇8086相关寄存器的使用可访问 X86架构(一)进行相关的涉猎。
加电或者复位之后,内存中还没有任何有意义的指令和数据,那处理器该如何取指令和执行指令呢?想要弄清楚这个问题,我们必须要知道内存空间的分配,以Intel 8086为例,F0000H~FFFFFH地址范围对应的内存是ROM,00000H~9FFFFH地址范围对应的内存是DRAM,如下图所示。
NOTE
DRAM——动态随机访问存储器(Dynamic Random Access Memory,DRAM),由大量成对的极其微小的晶体管和电容构成。由于微小电容的泄漏电荷的速度非常快,DRAM需要定期补充电荷,保证数据不丢失;一旦断电,其中保存的内容都会丢失。
ROM——只读存储器(Read Only Memory,ROM)不需要刷新,它的内容是预先写入的,即使掉电也不会消失,但也很难改变。基于这个特点,芯片的设计者常常将一些程序指令固化在ROM中,使处理器在每次加电时都自动执行。
前面说到8086复位时,CS=0xFFFF,IP=0x0000,所以,第一条指令位于物理地址0xFFFF0
,正好位于ROM中,那里固化了启动时需要执行的指令。位于物理地址0xFFFF0
的地方,是一个跳转指令,它通过改变CS 和IP的内容,使处理器从ROM中的较低地址处开始取指令执行,如:
jmp 0xF000:0xE05B
0xF000 是要跳转到的段地址,用来改变CS寄存器的内容;0xE05B是目标代码段内的偏移地址,用来改变IP寄存器的内容。因此,目标位置的物理地址是0xFE05B。一旦执行这条指令,处理器将开始从指定的段: 偏移
处开始重新取指令执行。
NOTE
8086这样设计的原因是处理器取指令执行的自然顺序是从内存的低地址往高低地址推进。如果从0xFFFF0 开始执行,这个位置离1MB 内存的顶端(物理地址0xFFFFF)只有16 个字节的长度,一旦IP寄存器的值超过0x000F,它与CS一起形成的物理地址将因为溢出而变成0x00001,这将回绕到1MB 内存的最低端。
ROM-BIOS
书接上文,这块ROM芯片中的内容包括硬件的诊断、检测和初始化,让硬件处于一个正常的、默认的工作状态。同时它还负责提供基础软件实现(最基本、最常规的功能),让人们在不必了解硬件细节的情况下从外围设备(比如键盘)获取输入数据,或者向外围设备(比如显示器)输出数据。所以,这块芯片又叫基本输入输出系统(Base Input & Output System,BIOS)ROM。
NOTE
在嵌入式环境中,BIOS-ROM(U-Boot)中做的工作略微不同,但启动的原理一致。
硬盘
硬盘是多盘片、密封、高转速的,采用铝合金作为基片,并在表面涂上磁性物质来记录二进制位。这就使得它的盘片具有较高的硬度,故称为硬盘。
NOTE
硬盘的相关知识,会在后面的文件系统内容中进行讲解,现阶段只能拜托大家请教一下度娘了哦~
现在我们知道硬盘的第一个扇区为主引导扇区,如果计算机的设置是从硬盘启动,ROM-BIOS将读取硬盘主引导扇区的内容,将它加载到内存地址0x0000:0x7C00 处,然后用jmp
指令跳到那里接着执行:
jmp 0x0000:0x7C00
0x7C00这个地方是由芯片的设计者定下的,这个取值当然是值得我们诟病的哈!!
主引导扇区的功能是继续从硬盘的其他部分读取更多的内容加以执行。像Windows 这样的操作系统,就是采用这种接力的方法一步一步把自己运行起来的。大家这里如果想不明白可以想想C盘,然后臆想一下咯。
好啦,相信到这里对计算机(芯片)的启动过程,你已经有了清晰的认识,别忘了留下你的小心心哦~