4-计算机的启动过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35733751/article/details/84979970

 

现在我们思考这样一个问题:处理器是如何执行编译好的程序。

1. 如何将编译好的程序交给处理器执行

通常程序运行必须要借助操作系统,以我们熟悉的windows为例,当我们用鼠标点击图标运行一个软件时,在我们看不到的层面上,操作系统必须给运行的程序分配空闲的内存空间,并在合适的时候交给处理器执行。

图1-执行程序

操作系统对运行的程序是有严格要求的,例如编译好的程序是针对哪种操作系统的,(例如在windows编译好的程序在linux中不能运行,反之亦然),程序的版本,数据段和代码段从哪里开始,有多长等等。

所以在特定的操作系统开发一个软件并不容易,但换个角度想,操作系统也是一个软件,通常是计算机先执行的一个程序(这里暂时不讨论BIOS),也是在处理器上运行的,现在我们想在计算机一开机的时候绕过操作系统,执行我们自己编写的程序,对于这个问题我们就不得不讨论计算机的加电启动过程了。

 

2. 计算机的加电和复位

处理器周围有很多引脚,,有一个RESET用于接收复位信号,每当处理器加电,就会复位并初始化。换句话说,当你按下机箱的启动按钮的时候,CPU就会通过RESET引脚接收到复位信号。

图2-处理器的引脚

在8086CPU中,复位信号将会把代码段的寄存器CS会初始化为:0xFFFF,其他寄存器则为:0x0000,也包括了指令寄存器IP(IP是一个很重要的寄存器,后面会多次提到)。当然8086之后的处理器并未延续这种设计,无论后来的计算机怎么样设计,都有其目的。

IP寄存器是一个指针寄存器,它只和CS一起使用,只有处理器才能改变它的内容,CS指向代码段的起始地址,而IP则指向段内的编译,总之处理器会根据CS:IP形成的地址取出指令并执行。

总之,8086CPU收到启动复位信号之后,CS和IP这个时候合成的20位地址就是:0xFFFF0。大家都知道,要想执行指令,必须先把指令读到内存里,可是按照我们之前所学推理,这个时候内存是空的,没有任何有意义可执行的指令。

这意味着8086CPU此时从内存地址0xFFFF0开始获取指令并执行会失败,导致的后果就是计算机可能奔溃,但实际情况真的是这样吗?既然我们能想到这个问题,那么当初设计8086CPU的工程师们也能想到啊,他们是怎么做的呢?

 

首先大家应该知道一个确定的事实,8086CPU有20根地址总线,地址范围是0x00000到0xFFFFF,可以访问1MB的内存空间。这么这1MB的内存,是不是我们任意使用呢?出于各种考虑,当初设计计算机的工程师把这1MB的内存从物理上和逻辑上分为几个部分。

图3-8086CPU的1MB内存分布

 

我们从上图可以看到8086CPU的1IMB内存空间的分布,其中0x00500 — 0x07BFF区域和0x7E00 — 0x9FBFF区域是程序的可用区域。其他区域则是其他程序使用的固定区域,每一个区域都有其独特的作用,当然这里我们并不需要去记,只需了解即可。

 

我们再来回忆一下内存相关概念:

RAM[Random Access Memory],内存可读可写,通常是程序员编写的程序运行所需的内存,断电后数据丢失,访问速度快。

ROM(Read Only Memory),只读存储器,断电后数据不会丢失,也因为ROM的特点,所以将一些计算机开机启动时必要的程序指令固化在ROM中,处理器每次加电时都会自动执行。

图4

所以,对于8086CPU来说,如果要访问0x00000-0x9FFFF,则访问的是DRAM(动态随机访问存储器)。如果要问0xF0000-0xFFFFF,则真正访问的是ROM,也就是64KB的大小。

 

而8086CPU通电之后会进行初始化工作,将CS指向0xFFFF,IP指向0x0000,因此通过CS和IP寄存器形参的地址就是0xFFFF x 0x10 + 0x0000 = 0xFFFF0(0xFFFF0是一个由段地址和偏移地址合成的物理地址),我们可以知道0xFFFF0地址正好是ROM的起始地址,而ROM中固化了8086开机时需要执行的指令,即BIOS的入口。

 

3. 基本输入输出系统

对于BIOS系统,相信装过系统的同学应该不陌生了。

当处理器定位到0xFFFF0地址后,就开始取出指令并执行了,从之前的图来看,0xFFFF0-0xFFFFF里面存储了一条指令,翻译成汇编语言就是:jmp 0xF000:0xE05B。

这是8086CPU开机之后,执行的第一条指令。

在这里,jmp是跳转(jump)的简化形式,0xF000是要跳转到的段地址,用来改变段寄存器CS的内容。0xE05B是目标代码段的偏移地址,一旦执行这条指令后,处理器将会从0xF000:0xE05B指定的地址处开始重新取指令执行。

 

0xFFFF0-0xFFFFF区域是属于ROM的,在ROM中的指令主要完成硬件的诊断、检测和初始化。就是让硬件处于一个正常的、默认的工作状态,也是能够让计算机运行起来最基本,最常规的功能。因此又把ROM中的指令叫做基本输入输出系统,即(Base Input & Output System BIOS) ROM

 

4. 一切从主引导扇区开始

当计算机加电后,BIOS会完成基本的初始化工作,这时计算机还没有完全启动起来,当BIOS完成自己的工作之后,接下来就开始交接了,如下图所示:

图5-计算机启动过程

BIOS-ROM完成初始化工作后,开始通知硬盘,把主引导扇区的512个字节加载到内存地址:0x0000:0x7c00处(也就是物理地址0x07c00),然后用一个jmp指令跳到那里接着执行,即jmp 0x0000:0x7c00 。

为什么是0x07c00地址呢?这个问题是当初的设计者定的,我们知道就行,通常主引导扇区的作用就是继续从硬盘中读取更多的内容并加以执行,例如像我们熟悉的windows系统就是这样一步一步把自己运行起来的。

猜你喜欢

转载自blog.csdn.net/qq_35733751/article/details/84979970