计算机的启动过程-从插上电源的那一刻开始

1、加电之后,这两个寄存器决定计算机去哪里取指令去执行。

CS左移4位,再加上EIP,得到BIOS的地址。

从这两个寄存器中,得到BIOS的地址,做一个长跳转到BIOS中去。

BIOS的工作主要时一些硬件初始化工作,在做完基本的硬件检查后,BIOS会加载存贮设备(比如软盘、硬盘、或者USB等等)上的一个扇区,一个扇区是512个字节(主引导扇区,Master Boot Record,or MBR)的512字节到内存的0x7c00,然后跳转到@0x7c00的第一条指令开始执行。

大概的意思就是BIOS加载一个扇区,并跳转到这个扇区的第一条指令开始执行,而扇区中代码的功能负责对操作系统进行进一步的加载)

此处可能会有疑问,为什么不用BIOS直接加载操作系统,而要利用BIOS加载一个扇区,扇区里的代码再去加载操作系统?

这是因为,刚开始设计时BIOS的功能非常有限,只能加载一个扇区,而一般来说一个操作系统他的代码量会很大,这样会增加BIOS工作的难度。

好了,接下来到了这个扇区,首先要明白这个扇区里的东西是什么,这个扇区里的代码就做bootloader,关于bootloader所做的事情如下:

bootloader做的事情:

第一件:首先从实模式切换到保护模式,为后续操作系统做准备,从实模式16位寻址空间,切换到32位寻址空间。

一旦进入保护模式,这个时候段机制就自动的加载上来了(段机制开始正常工作)。

第二件:从硬盘上读取操作系统的代码,将操作系统的代码从扇区中读到内存中来。

第三件:将控制权交到操作系统的手里,具体的内容为将CS、EIP的值指向操作系统内核在内存中的起始点。

段寄存器类似于指针的作用,段寄存器中保存着index,index可以用来查找段描述符,描述符中会存着两个非常重要的信息,一个是起始地址,一个是大小。起始地址加上Offset(EIP偏移量),迭代一起就是线性地址,此时还没有启动页机制,此时线性地址就等于物理地址。(意思是说,若此时将base设置为0,则EIP的值就是他的物理地址)

(即可以用段机制来分段,也可以用页机制来实现)段机制其实就是一种物理地址的映射方式。

GDT全局描述表也称段表,是由bootloader建立的,记录关于段位置的信息。

段寄存器有16位。在前期的准备工作做好之后,有一个系统控制寄存器,此时,将寄存器置为1.

总结:

需要建立一个GDT,GDT中的每一项是一个段描述符,然后将寄存器,类如CS,EIP设置一个index,使得这个index可以指向GDT中的描述符,相当于建立了一个地址映射关系,从而使得段机制进入正常工作。

发布了33 篇原创文章 · 获赞 0 · 访问量 7710

猜你喜欢

转载自blog.csdn.net/gaoxiaobai666666/article/details/104526463