OS调研 操作系统启动引导 入门级理解

OS booting

这两天一直在调研操作系统的启动过程,buaa ppt讲的有些太云里雾里了,而且我对底层的好奇心比较强烈,逻辑粗糙不能自洽就会很难受,到现在对OS booting终于有了一个至少可以让我不会难受的理解,据学长说有细节错误,看个乐即可。

操作系统的启动过程大概分成以下部分

  • 开机,CPU复位

  • 跳转到BIOS

    • POST(power on self test开机自检)
    • boot sequence(读取驱动顺序)
  • 加载MBR,从MBR读取boot loader

    • stage1
    • stage2
  • boot loader 引导OS启动

cpu复位

开机后,cpu被reset,其中寄存器中的数据都被清零,但至少有两个例外。

CS和IP是8086CPU中两个关键的寄存器,它们指示了CPU当前要读取指令的地址。根据体系架构的不同,他们会被初始化成一些特殊值,举例两种是:

CS: 0xf000     IP: 0xfff0                <-80286

CS: 0xffff	   IP: 0x0000                <-8086

它们有个共同点,就是CS<<4+IP=0xffff0,这就是实模式(cpu复位时进入实模式)的地址计算规则。在这时还没有软件,这种运算完全是基于物理电路的.

所以cpu加电后读取到的第一个指令就是地址0xffff0处的指令,这只是BIOS的入口,并不是BIOS本体的第一个指令。0xffff0是一个jump指令,让下一条指令读取的位置jump到0xfe05b处,这里才是BIOS真正开始工作的地方。

这里可能有一个细节有些诡异,我们以前学过的cpu寻址都是在RAM也就是主存中寻址,可是BIOS在ROM中,怎么可以寻址到BIOS的呢。

8086,具有20根地址线,它的寻址范围是0x00000-0xFFFFF,可以寻址1M的内存空间。实际上,这20根地址线并没有全部用于内存寻址,只不过是大部分地址线用于内存,还有一部分地址线用于只读存储器ROM和外围设备。

​ (——csdn

请添加图片描述

再细致一点大概是这样的。

请添加图片描述

上面这张图也可以成为之前的理论的一个佐证:

BIOS的地址范围是0xf0000~0xfffff,cpu跳转到的第一个地址0xffff0在BIOS里都快到头了,自然这不可能是BIOS真正启动的地方,只能是一个跳板,跳到0xfe05b,从那里执行BIOS的真正任务。

​ (——知乎

BIOS之开机自检

当打开计算机电源,计算机会首先加载BIOS信息。BIOS中包含了CPU的相关信息、设备启动顺序信息、硬盘信息、内存信息、时钟信息、PnP特性等等。在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。

POST是BIOS的第一个任务,以保证某些重要硬件组件,像是键盘、磁盘设备、输出输入端口等等,可以正常运作且正确地初始化。

如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。

BIOS之Boot sequence

打开BIOS的操作界面,里面有一项就是"设定启动顺序" 。这是BIOS的功能之一。

(说到这里,会不会有疑惑,BIOS是ROM是只读的,但大多BIOS都可以让用户自己设定默认启动顺序,这信息是怎么写进去的呢。

默认启动信息被写在NVRAM(是断电后仍能保持数据的一种RAM)里,BIOS可以读取这个NVRAM。)

我们可以在这里选择用哪个硬盘,哪个U盘或者直接从网络启动

请添加图片描述

当我们选好了从哪个硬盘启动以后,就要读取MBR了。

顺带一提,BIOS是用机器码写的。

MBR 主引导记录

硬盘上第0磁头第0磁道第一个扇区被称为MBR,也就是Master Boot Record, 即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。

下图是MBR的结构。446byte的启动引导程序(不一定是GRUB,bootloader有很多种,GRUB只是linux下最常用的一种,之后会再介绍bootloader),64byte的分区表信息(储存至多四个主分区的一些信息)。2byte结束标记(幻数0x55aa)。

请添加图片描述

BIOS执行到最后,他要把任务交接给对应的MBR,比如如果选了第一个硬盘来启动,就读一下第一个硬盘的MBR,如果从第二个硬盘启动,就读第二个硬盘的MBR(由MBR的定义可知,一个硬盘有且只有一个MBR)。

BIOS首先会确认选择的硬盘(或者什么u盘等)的MBR的最后两个字节是不是0x55aa,如果是,就会把该硬盘的第一个扇区也就是MBR,加载到内存0x7c00处。如果不是,BIOS就确定了这个硬盘有问题,不能用来系统引导,从而选择可以选择的下一个硬盘,重复同样的步骤。

选择好MBR,确定好幻数,加载到0x7c00这一系列boot sequence完成以后,BIOS执行跳转指令,jump to 0x7c00处,将引导系统启动的任务交接给MBR中的boot loader。

bootloader

请添加图片描述

在这里拓展一些关于硬盘分区的知识。

上面提到,一个硬盘最多有四个主分区,主分区是装操作系统用的,也就是一个硬盘上最多装四个操作系统。

主分区以外还有扩展分区,里面不装操作系统,你可以随便分。

主分区中最多有一个活动分区,也就是引导的时候默认会进入的那个操作系统。

除了整个硬盘的前512字节MBR以外,每个主分区的前512字节叫PBR,和MBR差不多,但是是引导这个分区里装的特定的操作系统用的,我们每安装一个新的操作系统,他会往硬盘的MBR里写一些信息,也会往自己的PBR里写一些信息。

比如,一台新电脑,我们先安装一个linux操作系统,它会往MBR PBR都写入一些引导信息,当启动的时候,MBR引导程序加载并启动保存在活动分区PBR中的引导程序。os就被引导起来了。

如果我们在另一个主分区里装windows系统,它会在MBR和自己的PBR里写入引导信息,其中,他会把MBR中linux系统的信息全覆盖,电脑启动时就会直接从windows操作系统启动,不考虑linux。

但是,如果先装windows再装linux,linux会在MBR里写入linux自带的bootloader——GRUB,它是一个多系统选择器,我们可以从GRUB自如地进行多系统引导,在GRUB中选择哪个系统,接下来就会加载对应主分区的PBR,引导我们真正想要的系统。

如果在GRUB中选择了windows,这期间的过程是:硬盘MBR->活动分区(linux)的PBR->windows的PBR

请添加图片描述

接下来概念性地解释一下bootloader。

引导加载程序是系统加电后运行的第一段软件代码,称为Bootloader,是在操作系统内核运行之前运行的一段小程序;bootloader比BIOS“精明”很多,因为它就是在安装操作系统的时候由操作系统写入MBR的,所以bootloader会认识硬盘内的文件系统格式,因此就能够读取核心档案,承担OS真正运行之前的最后一步工作。

bootloader中储存了此电脑是单系统还是多系统的信息,如果只有单系统就会直接加载系统内核,如果不止一个系统,就会调出多系统选择器(如GRUB),在其中选择启动某个系统。

bootloader分成两个阶段,stage1,stage2。stage1更底层一些,用汇编写,stage2功能更灵活一点,用C写,他们储存在不同的地方。

以GRUB为例,

第一阶段它保存在MBR中.用汇编语言编写,也就是MBR中的引导程序部分。①基本的硬件设备初始化(屏蔽所有的中断、关闭处理器内部指令/数据cache 等)。②为加载 Bootloader 的Stage2 准备空间。③如果是从某个固态存储媒质中,则拷贝 Bootloader 的stage2 到RAM 空间中。④设置好堆栈。⑤跳转到 stage2 的C 程序入口点。

GRUB引导程序的第二阶段,通常用C语言编写,这个阶段的任务有: ①初始化本阶段要使用到的硬件设备。②检测系统内存映射。③将kernel 映像和根文件系统映像从flash 上读到RAM 空间中。④为内核设置启动参数⑤调用内核。

简而言之,stage1放在MBR中,作用就是找到Stage2,并把控制权交给它,stage2是GRUB的主程序,实现了GRUB的主要功能:提供选单,读取配置文件(/boot/grub/grub.conf),连接对应的PBR。

然后bootloader将选择的内核镜像以及初始化内存盘镜像也被载入到内存中。一切准备完毕之后,bootloader就会调用内核镜像,完毕操作系统的载入。

请添加图片描述

(其实bootloader好复杂啊,我也不懂,百度+胡诌)

推荐资料

一个很好的油管视频
在百度网上冲浪很久,发现还是油管的一些视频说得更清晰一些。下面是截屏,务必去原视频支持。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值