操作系统的启动过程

来源:互联网 发布:python接口自动化测试 编辑:程序博客网 时间:2024/05/22 09:02

由于操作系统实验有些步骤不弄明白,后面很难做。然后仔细查了一下计算机在上电之后都干了什么。下面是我的笔记,但是我脑子里仍有模糊的概念,所以可能表述不清或者概念错误。

启动过程

  • 计算机上电
  • CPU执行FFFF:0000H处的指令(跳转指令),跳转到BIOS的代码入口。
  • BIOS自检(POST)
  • 按用户规定的启动顺序依次检查哪个设备是启动设备。
  • 将启动设备上的主引导记录(MBR)加载进内存0x7C00处。
  • 主引导记录里面的引导程序再将控制权交给操作系统的引导程序。
  • 至此电脑就全权交给了操作系统。

计算机上电

计算机上电之后的一段时间电压是不稳定的。在这不稳定的时间里,芯片组会不断地发送reset信号直到电压稳定下来。

BIOS代码入口

FFFF:0000H是BIOS的代码入口。神奇的是,这个地址包含在BIOS的地址区间里面。来看下面一张图:
这里写图片描述
从这张图可以看出BIOS ROM的内存空间包含了那个入口地址。(我暂时还不懂那里的语句是什么,很神奇)

启动设备

所谓的启动顺序就是,嗯,直观上看是从BIOS界面里设置的那个启动顺序。但是具体BIOS是怎么识别这些顺序我也不明白。这些顺序应该是通过BIOS来设置特殊的寄存器识别。因为平时进入多系统或者装系统的时候都是通过BIOS进行设置的嘛。
按照启动顺序会在启动设备上寻找正确的主引导记录,这是一段512字节的代码。所谓正确的主引导记录就是主引导记录的最后两个字节是0x55,0xaa(主引导记录签名)。至于什么是主引导记录,百度百科说的很清楚了。如果英语条件好的话,建议看看维基百科上的解释(MBR)。

加载主引导记录

找到主引导记录之后,BIOS会把主引导记录加载进内存的0x7c00处。(我也没查为什么是0x7c00)。这个过程其实就是搬运代码的过程。汇编很容易就搞定。

转交控制权

加载主引导记录之后,BIOS会执行一个跳转指令跳转到主引导记录的代码入口执行主引导记录里面的引导程序(bootloader)。(这就是说主引导记录不只是一段可执行的代码,其中还有其他东西。比如分区表什么的,还有上面说的最末尾的主引导记录签名)。

再次转交控制权

引导程序会在自身的配置里面查找操作系统的启动代码,找到之后将之加载进内存,然后执行该代码。引导程序一般为初始化一些寄存器,和设置系统工作模式(比如,设置GDT,IDT,跳转到保护模式),引导程序接着加载内核模块,内核模块继续对硬件进行高级初始化(比如中断分配,地址空间映射分配),并通过读取相应配置读取驱动程序,进行链接,然后初始化初始进程,初始进程进一步完成更高级系统配置的读取和加载,到这里系统启动完毕,具体启动过程要看具体的操作系统。

说明

这次的操作系统课程中,第二个实验是编译linux内核并且在虚拟机qemu上启动。回想起来,那个image文件其实就是系统内核镜像,是在MBR加载进内存之后通过MBR加载进内存的(好绕口)。
接下来的实验三要写的其实就是主引导记录了。(512字节,末尾0x55,0xaa不是主引导记录还是什么?)。在编译链接的时候,链接脚本已经设置了这段代码的开头是0x7c00,取代了BIOS做的那些前戏。。。。。。

参考
http://wangpai.2345.cn/thread.php?fid=12&pid=3497300
http://blog.csdn.net/langeldep/article/details/8788119

0 0