操作系统是需要在计算机启动后马上投入工作的,那么要学习写一个操作系统,首先第一反应,我感觉就是要知道如下几个方面的知识:
- 计算机是怎么的启动?
- 都干了些什么事情?
- 操作系统是从什么时候切入的?
现在就来研究这三个问题。
1、加电与启动
怎么启动?地球人都知道,首先要按下电源开关。电源就开始向主板和其它设备供电,给它提供能量;当供电稳定了之后CPU马上就从地址FFFF:0000H 处开始执行指令,放在这里的只有一条跳转指令,跳到系统BIOS中真正的启动代码处。
这个是硬件工程师控制的,与操作系统无关。
2、BIOS启动阶段
在上个世纪的70年代初,”只读内存”(read-only memory,缩写为ROM)被发明了出来,于是开机程序就被刷入ROM芯片里,这就成为了拉起计算机的“鞋带”。这里的程序叫做”基本输入输出系统”(Basic Input/Output System),简称为BIOS。
BIOS程序主要是检查计算机硬件能否满足运行的基本条件,所以叫做”硬件自检”(Power-On Self-Test),缩写为POST。
BIOS中主要存放的程序包括:
- 自诊断程序(通过读取CMOS RAM中的内容识别硬件配置,并对其进行自检和初始化);
- CMOS设置程序(引导过程中通过特殊热键启动,进行设置后存入CMOS RAM中);
- 主要I/O驱动程序;
- 中断服务。
- 系统自动装载程序(在系统自检成功后,将磁盘相对0道0扇区上的引导程序装入内存使其运行);
BIOS提供的中断服务应该是程序员可用的最底层的服务了吧。
这最后一步之后是我们需要的系统切入点吗?
3、主引导记录
根据BIOS中设定的启动设备和”启动顺序(Boot Sequence)”,依次尝试读取设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,转入”启动顺序”中的下一个设备。这最前面的512个字节,就叫做”主引导记录”(Master boot record,缩写为MBR)。最后把读取成功的MBR放入从0x7c000开始的内存中。
3.1主引导记录的结构
根据上面说的,“主引导记录”只有512个字节,可是远远存不下一个系统的,只能再作为一个跳板,指明操作系统开始加载的真正的位置。
主引导记录由三个部分组成:
- 第1-446字节:调用操作系统的机器码。
- 第447-510字节:分区表(Partition table)。
- 第511-512字节:主引导记录签名(0x55和0xAA)。
1-446字节 | 447-510字节 | 511字节 | 512字节 |
---|---|---|---|
用操作系统的机器码 | 分区表 | 0x55 | 0xAA |
其中,第二部分”分区表”的作用,是将软(硬)盘分成若干个区并记录相关的信息。
3.2 分区表
分区表的长度只有64个字节,其中又划分成四个部分,每部分占16个字节。所以一个硬盘最多只能分四个一级分区,又叫做”主分区”。
每个主分区的16个字节,又由6个部分组成:
- 第1个字节:如为0x80表示该主分区是激活分区,控制权要转给这个分区。四个主分区里面只能有一个是激活的。
- 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。
- 第5个字节:主分区类型。
- 第6-8个字节:主分区最后一个扇区的物理位置。
- 第9-12字节:该主分区第一个扇区的逻辑地址。
- 第13-16字节:主分区的扇区总数。
第1字节 | 第2-4字节 | 第5字节 | 第6-8字节 | 第9-12字节 | 第13-16字节 |
---|---|---|---|---|---|
激活标志 | 第一个扇区物理位置 | 主分区类型 | 最后一个扇区物理位置 | 第一个扇区逻辑地址 | 扇区总数 |
最后的四个字节(”主分区的扇区总数”),决定了这个主分区的长度。也就是说,一个主分区的扇区总数最多不超过2的32次方。如果每个扇区为512个字节,就意味着单个分区最大不超过2TB。再考虑到扇区的逻辑地址也是32位,所以单个硬盘可利用的空间最大也不超过2TB。如果想使用更大的硬盘,只有2个方法:一是提高每个扇区的字节数,二是增加扇区总数。
4、硬盘启动
这时,计算机的控制权就要转交给硬盘的某个分区了,这里又分成三种情况。
4.1 情况A:卷引导记录
四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做”卷引导记录”(Volume boot record,缩写为VBR)。“卷引导记录”的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。
4.2 情况B:扩展分区和逻辑分区
随着硬盘容量越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成”扩展分区”(Extended partition)。所谓”扩展分区”,就是指这个区里面又分成多个区。这种分区里面的分区,就叫做”逻辑分区”(logical partition)。
计算机先读取扩展分区的第一个扇区,叫做”扩展引导记录”(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。
但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。
4.3 情况C:启动管理器
在这种情况下,计算机读取”主引导记录”前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的”启动管理器”(boot loader),由用户选择启动哪一个操作系统。
5、操作系统
控制权转交给操作系统后,操作系统的内核首先被载入内存。至此,全部启动过程完成。
网友评论