1.2.1 加载第一部分代码—引导程序(bootsect)

来源:互联网 发布:和合期货软件下载 编辑:程序博客网 时间:2024/05/20 13:12

1.2 加载操作系统内核程序并为保护模式做准备

从现在开始就要执行真正的boot操作了,即把软盘中的操作系统程序加载至内存。对于Linux 0.11操作系统而言,计算机将分三批逐次加载操作系统的内核代码。第一批由BIOS中断int 0x19h把第一扇区bootsect的内容加载到内存;第二批和第三批在bootsect的指挥下,分别把其后的四个扇区和随后的240个扇区的内容加载至内存。

1.2.1 加载第一部分代码—引导程序(bootsect)

按照我们使用计算机的经验,如果在开机的时候马上按Del键,屏幕上会显示一个BIOS画面,可以在里面设置启动设备。现在我们基本上都是将硬盘设置为启动盘,Linux 0.11是1991年设计的操作系统,那时常用的启动设备是软驱以及其中的软盘。站在体系结构的角度看,从软盘启动和从硬盘启动的基本原理和机制是类似的。

经过执行一系列BIOS代码之后,计算机完成了自检等操作(这些与我们讲的启动操作系统没有直接的关系,读者不必关心),由于我们把软盘设置为启动设备,计算机硬件体系结构的设计与BIOS联手操作,会让CPU接收到一个int 19h中断,CPU接收到这个中断后,会立即在中断向量表中找到int 19h中断向量。我们在图1-3的左下方可以看到int 19h中断向量在内存中所在的准确位置,这个位置几乎紧挨着内存的0x00000位置。

 图1-3 响应int 0x 19h中断

接下来,中断向量把CPU指向0x0E6F2,这个位置就是int 0x 19h相对应的中断服务程序的入口地址,即图1-3中所示“启动加载服务程序”的入口地址。这个中断服务程序的作用就是把软盘的第一个扇区中的程序(512B)加载到内存中的指定位置。这个中断服务程序的功能是BIOS事先设计好的,代码是固定的,与Linux操作系统无关,无论Linux 0.11的内核是如何设计的,这段BIOS程序所要做到就是“找到软盘”并“加载第一扇区”。其余的它什么都不知道,也不必知道。

小贴士

中断向量表(Interrupt Vector Table):实模式中断机制的重要组成部分,表中记录所有中断号对应的中断服务程序的内存地址。

中断服务程序(Interrupt Services):通过中断向量表的索引对中断进行响应服务,是一些具有特定功能的程序。

按照这个简单、“生硬”的规则,int 0x19h中断向量所指向的中断服务程序(即启动加载服务程序)将软驱0号磁头对应盘面的0磁道1扇区的内容拷贝至内存0x07C00处。我们可以在图1-4的左边看到第一扇区加载的具体位置。

 图1-4 把软盘第一个扇区中的程序加载到内存中的指定位置

这个扇区里的内容就是Linux 0.11操作系统的引导程序,也就是我们将要讲解的bootsect,其作用就是陆续把软盘中的操作系统程序载入内存。这样制作的第一扇区就称为启动扇区(boot sector)。第一扇区程序的载入标志着Linux 0.11操作系统中的代码即将发挥作用了。

这是非常关键的动作,从此计算机开始与软盘上的操作系统程序产生关联。第一扇区中的程序是由bootsect.s中的汇编程序汇编而成(以后简称bootsect),这是计算机自开机以来,内存中第一次有了Linux操作系统自己的代码,虽然只是启动代码。

至此,已经把第一批代码bootsect从软盘载入到计算机的内存了。下面的工作就是执行bootsect把软盘的第二批和第三批代码载入内存。

点评

注意,BIOS程序固化在主机板上的ROM中,是根据具体的主机板而不是根据具体的操作系统设计的。

理论上,计算机可以安装任何适合其安装的操作系统,既可以安装Windows,也可以安装Linux。不难想象每个操作系统的设计者都可以设计出一套自己的操作系统启动方案,而操作系统和BIOS通常是由不同的专业团队设计和开发的,为了能协同工作,必须建立操作系统和BIOS之间的协调机制。

与已有的操作系统建立一一对应的协调机制虽然麻烦,但尚有可能,难点在于如何与未来的操作系统建立协调机制,现行的方法是“两头约定”和“定位识别”。

对操作系统(这里指Linux 0.11)而言,“约定”操作系统的设计者必须把最开始执行的程序“定位”在启动扇区(软盘中的0盘面0磁道1扇区),其余的程序可以依照操作系统的设计顺序加载在后续的扇区中。

对BIOS而言,“约定”在接到启动操作系统的命令后,“定位识别”只从启动扇区把代码加载到0x07C00 (BOOTSEG)这个位置(参见Seabios 0.6.0/Boot.c文件中的boot_disk函数)。至于这个扇区中是否是启动程序,以及是什么操作系统,则不闻不问并一视同仁。如果不是启动代码,只会提示错误,其余是用户的责任,与BIOS无关。

这样构建协调机制的好处是站在整个体系的高度,统一设计和统一安排,简单而有效。只要BIOS和操作系统的生产厂商开发的所有系统版本全部遵循此机制的约定,就可以各自灵活地设计出具有自己特色的系统版本。

0 0