一个计算机的启动要从哪里说起呢?我想故事应该从计算机的加电和复位说起。
一 计算机的加电和复位
1 首先想象计算机CPU处理机外部有一个RESET引脚,其他引脚暂时抽象忽略,而CPU内部存在着四个通用寄存器:AX,BX,CX,DX,四个段寄存器:CS,DS,ES,SS
还有BP,IP等等。
2 当RESET引脚传来高电平的时候处理机内部会出现硬件初始化:CS寄存器数值变为0Xffff,而其余寄存器的数值都清0。
3 CS:IP指向了物理地址FFFF0H位置,这个位置只剩下16个字节所以执行不了多少指令了,这个地方执行的指令机器码是EA(跳转指令)5B E0(偏移地址是E05B)00 F0(段地址是F000)的位置,所以CS:IP再次指向F0000物理地址
4 接着进行硬件的诊断检测和初始化。
5 最终在完成自己的使命之前需要把硬盘的主引导区相关数据加载到物理地址0X07C00处,然后调整CS,IP的数值从哪里执行,这里就相当于接力棒的交接棒(拜托了,继续执行操作系统的使命就交给你了)。
所以根据这个地方的信息,我们可以推断我们下一个章节的任务:我们可以写好一个程序,然后编译完成放到主引导扇区,这样我们一开机,ROM(BIOS)就会直接执行这个程序,从逻辑上来看这不就是世界上最简单的操作系统吗?一开机就能执行,只不过是没有操作系统等价的逻辑功能罢了。
二 内存片的分块:
1 在我们CPU眼里内存是一个地址连续,逻辑连续的一个抽象单元,但是实际上内存是物理上分开的单元。
2 对于0X0000到0X9FFFF位置是我们的DRAM,就是动态随机访问存储器,这个存储器访问速度贼鸡儿块,原因就是其任何一个内存单元的访问速度和它位置无关(随机访问)。
3 0XA0000到0XEFFFF位置就是我们各种外设的内存芯片:比如声卡,网卡,显卡,接口电路等等,这一点我是深有体会,操作外设一切皆内存,比如我想向屏幕输入一个信息我就是向指定显存内存单元输入对应的ASCII编码和对应的相关设置编号。
4 0XF0000到0XFFFFF就是我们的ROM芯片,(READN ONLY MEMORY),
它的唯一作用就是一个开机启动前的接力者,把硬盘主扇区相关数据读到DRAM然后检验相关硬件是否是合格的。
注:硬盘的工作原理:硬盘是一个完整的物理设备,因为这门课的特殊性,不需要对硬盘的具体结构有太过详细的了解,只需要知道硬盘分为若干盘片,一个盘片有两个盘面,一个盘面有若干磁道(柱面),每个磁道(柱面)有通常63个扇区,每个扇区从扇区头开始存储512个字节相关数据,扇区编号从1开始磁道(柱面)编号从0开始。磁头(盘面)编号从0开始。
最特殊的就是整个硬盘的第一个扇区:0面0道1扇区(0头0柱1扇区),这个扇区称为主引导区,如果计算机设置是从硬盘启动,那么ROM-BIOS将读取硬盘主引导扇区的内容,然后把相关内容加载到内存0X0000:0X7C00处(至于为什么加载到这个地方我们是不清楚的)。