计算机是如何启动的?

 分类: 致知

相信很多人和我一样,从接触计算机开始,就一直在思考这个问题,当按下电脑的开机键之后,到底发生了什么,为什么这样就能启动电脑了?这篇文章我试着分析一下计算器的启动原理和过程。
计算机起动流程

CPU

CPU全称是中央处理器,是计算机的核心,包括控制单元,运算单元,存储单元和时钟等,它的主要功能是解释计算机指令以及处理各类数据。包括基本的算术操作,从存储器或者各个接口卡(外设)读取或者写入数据等。
CPU内部包含若干个寄存器,用来暂存数据或者指导CPU的运行,8086中常见的寄存器有,AX,BX,CX,DX,CS,DS,SS,ES,DI,SI,SP,BP,IP,Flag等。
我们都知道计算机只能识别二进制数据,例如指令101110000000是把寄存器ax的值设为0,因为二进制指令比较难以理解,所以人们发明了汇编语言,上述指令用汇编语言(Intel写法)描述就是mov ax,0。

存储器

存储器就是我们所说的内存,CPU是计算机的核心,但没有存储器是万万不行的,因为CPU需要操作的指令和数据没有地方存放。CPU通过地址总线,数据总线和控制总线和存储器连接,以便于CPU从内存的指定位置取出或者写入数据。上课的时候,老师告诉我们内存是易失性存储器(RAM),就是内存必须通电才能保证数据的完整性,掉电数据即不复存在,所以在这里的时候,我们会产生一个疑问,既然内存没有电就没有数据,CPU又不能自己产生数据,那么开机时,CPU的数据是从哪里来的?答案是ROM。

非易失性存储器

说道非易失性存储器,我们想到的可能就是类似U盘,硬盘或者光盘等类似的写入数据就能永久保存的数据,实际上还有一种叫ROM,它掉电以后内容不会消失,被用做存储永久数据,计算机很多设备中都有ROM,例如显卡,但最常见的是主板上的ROM,用来存储BIOS((基本输入输出设备)。ROM也是存储器的一种,也是通过三根总线和CPU相连,所以CPU能直接读取ROM的数据,不同的是CPU不能往ROM里写入数据。

计算机的启动

说到这里,似乎就好理解了,只要我们事先往ROM里写入一些数据,开机的时候让CPU直接执行ROM里的指令,不就行了?实际正式如此,过程如下:
1,按下电源键,主板开始给CPU供电,待电源稳定之后,CPU把CS寄存器的值设为0xFFFF,IP寄存的值设为0x0000,意味着CPU要执行0xFFFF0处的指令,0xFFFF0位于ROM中,所以有数据。
2,FFFF0H的数据一般是一条jmp指令,用以跳转到BIOS在ROM中真正的位置处。
3,BIOS要做的事情是加电自检(POST),就是我们常见的开机启动后,系统自检的画面。到这里,实际上电脑已经启动起来了。
4,在完成系统检查之后,BIOS会把系统的管理权交给下一阶段的设备中存放的程序。

在BIOS中,会有一个设备启动的顺序,如硬盘,U盘或者光盘,BIOS会依次读取这些设备的第一个扇区(前512字节)到内存0x7C00,并检查其最后两个字节是否为0x55,0xaa,如果是,则从0x7c00处执行,如果不是,则检查下一个启动设备。
启动设备的第一个512byte的扇区我们称之为MBR(主引导记录),包含调用系统的代码,设备的分区表和2字节的签名(0x55,0xaa),MBR的作用是把操作系统自己的引导程序读入内存,然后跳转到操作系统的引导程序,操作系统引导程序加载操作系统,并把CPU设置为保护模式,系统就启动完成了。

更详细的启动流程,请看下图:
启动流程

综上,计算机启动过程中,有几个关键点:
1, ROM事先就储存了启动程序。
2,CPU加电之后,会首先执行某一个固定位置的程序。
3,启动设备上的MBR负责第一阶段加载启动设备上的启动程序。
实际上对于我们来说,ROM和CPU都已经固定了,MBR就是整个系统的关键点,下面我们来完成一个MBR,不依赖操作系统,用来在系统启动时打印出”Welcome to https://www.hitoy.org/”。

DISADDR EQU 0xb800
DISCOLOR EQU 0x02
LOADADDR EQU 0x7c00
section .code vstart=LOADADDR
   _start:
   ;注意:实模式下不能设置CS段地址
   ;mov ax,LOADADDR
   ;mov cs,ax
   ;data addr
   mov ax,string
   mov si,ax
   ;display segment
   ;and AR
   mov ax,DISADDR
   mov ds,ax
   mov bx,0
   show:
        ;Copy Char to CL
        mov cl,[cs:si]
        mov ch,0
        cmp cx,0
        je end
        mov ch,DISCOLOR
        mov [ds:bx],cx
        inc si
        add bx,2
        jmp show
   end:
   jmp $
string: db "Welcome to https://www.hitoy.org/",0
times 510-($-$$) db 0
db 0x55,0xaa

用nasm编译成bin格式文件,然后写入启动设备第一个扇区,可以看到开机时文字已经被显示出来了。
用MBR开机显示文字

发表回复

评论列表:

夏日博客
夏日博客
一直在用计算机,但要让自己说出怎么个原理,却很难。
回复此留言
杰
看了标题我第一个想到的是boot! boot原来的意思是靴子,“启动”与靴子有什么关系呢?原来,这里的boot是bootstrap(鞋带)的缩写,它来自一句谚语: "pull oneself up by one's bootstraps" 字面意思是“拽着鞋带把自己拉起来”,这当然是不可能的事情。最早的时候,工程师们用它来比喻,计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!久而久之就简称为boot了。
回复此留言