首页 > 系统 > Linux > 正文

Linux 系统开机加电后发生了什么?

2024-08-27 23:54:53
字体:
来源:转载
供稿:网友
   linux系统的启动流程
  关于linux系统的启动流程我们可以按步进行划分为如下:
 
  BIOS
 
   POST自检
   BIOS(Boot Sequence)
  引导操作系统
 
   加载对应引导上的MBR(bootloader)
   主引导设置加载其BootLoader
  加载操作系统
 
  启动BIOS,准备实模式下的中断向量表和中断服务程序
  电脑启动后,CPU逻辑电路被设计为只能运行内存中的程序,没有能力直接运行存在于软盘或硬盘中的操作系统,如果想要运行,必须要加载到内存(RAM)中。
 
  BIOS是如何启动的,CPU硬件逻辑设计为在加电瞬间强行将CS值置为0XF000,IP为0XFFF0,这样CS:IP就指向0XFFFF0这个位置,这个位置正是BIOS程序的入口地址。
 
  BIOS程序被固化在计算机主机板上的一块很小的ROM芯片里。现在CS:IP已经指向了0XFFFF0这个位置,意味着BIOS开始启动。
 
  POST自检
  BIOS的第一步动作就是进行 上电自检(POST)
 
  POST的工作是检查硬件设备。随着BIOS程序的执行,屏幕上会显示显卡的信息,内存的信息等,
  
  BIOS-runtime服务按照boot启动顺序搜索设备,寻找BBR
  由于BIOS功能使用上的不同,它由两个部分组成:POST和runtime服务。POST完成后,它将从存储器中被清除,但是BIOS runtime服务会被保留,用于目标操作系统。
 
  为了启动操作系统,BIOS的runtime服务将搜索那些激活状态的或是可引导启动的设备,搜索的顺序则由CMOS设置决定(也就是我们平时所谓的在BIOS中设置的启动顺序)。一个软驱,一台光驱,一个硬盘上的分区,网络上的设备甚至一个usb 闪存盘都可以作为一个启动设备。
 
  当然,linux通常是从硬盘启动的。硬盘上的MBR(主启动记录)包含有基本的boot loader,它是一个512字节大小的扇区,位于磁盘的第一个扇区(0磁头0磁道1扇区)。当MBR被装载到RAM中后,BIOS就会将控制权转交给MBR。
 
  引导操作系统内核并为保护模式做准备
  位于MBR中的主 boot loader 是一个512字节的镜像,其中不仅包含了 bootload 程序代码,还包含了一个小的分区表。
 
  最初的446字节是主 boot loader,它里面就包含有可执行代码以及错误消息文本。接下来的64字节是分区表,其中包含有四个分区的各自的记录(一个分区占16字节)。MBR 通过特殊数字 0xAA55(译者注:在电子界中 AA55 确实是具有传奇色彩的数字,想知道为什么么?将它展开成二进制形式,看看有什么规律)作为两个字节的结束标志。0x55AA 同时也是 MBR 有效的校验确认。
 
  首先对CPU发送 int 0x19 中断,使CPU运行 int 0x19 中断对应的中断服务程序,这个中断服务程序的作用就是把软盘第一个扇区的程序加载到内存的指定位置。
 
  主 boot loader 的工作是寻找并加载次 boot loader(内核加载程序)
 
  它通过分析分区表,找出激活分区来完成这个任务,当它找到一个激活分区时,它将继续扫描剩下的分区表中的分区,以便确认他们都是未激活的。
 
  确认完毕后,激活分区的启动记录(次 boot loader)从设备中被读到 RAM,并被执行。
 
  其中加载过程需要借助 BIOS 提供的int 0x13中断向量指向的中断服务程序来完成。该程序将软盘第二个扇区开始的4个扇区,即 setup.s 对应的程序加载至内存的 SETUPSEG(0x90200)处。
 
  把第一阶段和第二阶段的 boot loaders 联合起来,就是在x86个人电脑中,我们所说的 linux loader(LILO)或者 GRand Unified Bootloader(GRUB)。由于 GRUB 修正了一些 LILO 中存在的缺陷,因此下面就让我们来看看 GRUB(如果你希望得到更多的关于 GRUB,LILO 和与之相关话题的讨论资源,请见文后的参考资料)
 
   对于 GRUB 来说,一个比较好的方面就是它包含了 linux 文件系统的知识。与LILO使用裸扇区不同的是,GRUB 能够从 ext2 或者 ext3 文件系统中加载 linux 内核。它是通过将本来两阶段的 boot loader 转换成三个阶段的 boot loader。在第一阶段(MBR)中会启动 stage1.5 的 boot loader 来理解 linux 内核镜像中的特殊的文件系统格式,例如,reiserfs_stage1-5(用于从reiserf日志文件系统中进行加载)或 e2fs + stage1_5 (用于从wxt2或ext3文件系统进行加载)。当 stage1.5 的 boot loader 被加载并运行时,stage2 的 boot loader 才能被加载。当 stage2 被加载时,GRUB能根据请求的情况显示一个可选内核的清单(在 /etc/grub.conf 中进行定义,同时还有几个软符号链接 /etc/grub/menu.lst 和 /etc/grub.conf)。你可以选择一个内核,修改其附加的内核参数。同时,你可以选择使用命令行的shell来对启动过程进行更深层次的手工控制。
 
  在次 boot loader 存在与内存中后,就可以对文件系统进行查询了,同时将默认的内核镜像以及初始化内存盘镜像也被加载到内存中。
 
  一切准备完毕之后,次 boot loader 就会调用内核镜像,完成操作系统的加载。
 
  加载内核并从实模式转换为保护模式
  当内核映像被加载到内存中(加载过程仍然用int 0x13中断向量),并且次引导加载程序释放控制权之后,内核阶段就开始了。
 
  加载内核镜像
  内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个 zImage(压缩映像,小于 512KB)或一个 bzImage(较大的压缩映像,大于 512KB),它是提前使用 zlib 进行压缩过的。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,如果有初始 RAM 磁盘映像,就会将它移动到内存中,并标明以后使用。然后该例程会调用内核,并开始启动内核引导的过程。
 
  当 bzImage(用于 i386 映像)被调用时,我们从 ./arch/i386/boot/head.S 的 start 汇编例程开始执行。
 
  这个例程会执行一些基本的硬件设置,并调用 ./arch/i386/boot/compressed/head.S 中的 startup_32,设置一个基本的环境(堆栈等),并清除 Block Started by Symbol(BSS)。然后调用一个叫做 decompress_kernel 的 C 函数(在 ./arch/i386/boot/compressed/misc.c 中)来解压内核。当内核被解压到内存中之后,就可以调用它了。这是另外一个 startup_32 函数,但是这个函数在 ./arch/i386/kernel/head.S 中。
 
  进入保护模式并初始化
   进入保护模式
   设置中断描述附表和全局描述符表
   创建了内存分页机制
  启动内核
   start_kernel启动内核
   创建init进程
  BIOS阶段–准备实模式下的中断向量表和中断服务程序
  BIOS是什么
  上个世纪70年代初,”只读内存”(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片,计算机通电后,第一件事就是读取它。计算机,启动这块芯片里的程序叫做”基本出入系”(Basic Input/Output System),简称为BIOS。
 
  它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。
 
  BIOS存储的信息
  BIOS芯片中主要存放:
 
   自诊断程序:通过读取CMOSRAM中的内容识别硬件配置,并对其进行自检和初始化;
   CMOS设置程序:引导过程中,用特殊热键启动,进行设置后,存入CMOS RAM中;
   系统自举装载程序:在自检成功后将磁盘相对0道0扇区上的引导程序装入内存,让其运行以装入DOS系统;
   主要I/O设备的驱动程序和中断服务:由于BIOS直接和系统硬件资源打交道,因此总是针对某一类型的硬件系统,而各种硬件系统又各有不同,所以存在各种不同种类的BIOS,随着硬件技术的发展,同一种BIOS也先后出现了不同的版本,新版本的BIOS比起老版本来说,功能更强。
  BIOS:计算机加电自检完成后第一个读取的地方就是就是BIOS(Basic Input Output System,基础输入输出系统),BIOS里面记录了主机板的芯片集与相关设置,如CPU与接口设备的通信频率、启动设备的搜索顺序、硬盘的信息、系统时间、内存信息、时钟信息、PnP特性、外部总线、各种接口设备的I/O地址、已经与CPU通信的IRQ中断信息,所以,启动如果要顺利启动,首先要读取BIOS设置。
 
  计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它。
 
  电脑启动后,CPU逻辑电路被设计为只能运行内存中的程序,没有能力直接运行存在于软盘或硬盘中的操作系统,如果想要运行,必须要加载到内存(RAM)中。
 
  BIOS是如何启动的
  CPU硬件逻辑设计为在加电瞬间强行将CS值置为0XF000,IP为0XFFF0,这样CS:IP就指向0XFFFF0这个位置,这个位置正是BIOS程序的入口地址。
 
  BIOS需要在内存中加载中断向量表和中断服务程序
  BIOS程序被固化在计算机主机板上的一块很小的ROM芯片里。现在CS:IP已经指向了0XFFFF0这个位置,意味着BIOS开始启动。随着BIOS程序的执行,屏幕上会显示显卡的信息,内存的信息,说明BIOS程序在检测显卡,内存,这个就是POST开机自检期间,有一项对启动操作系统至关重要的工作,那就是BIOS在内存中建立中断向量表和中断服务程序
 
  BIOS程序在内存最开始的位置(0x00000)用1KB的内存空间(0x00000~0x003FF)构建中断向量表,在紧挨着它的位置用256KB的内存空间构建BIOS数据区(0x00400~0x004FF),并在大约57KB以后得位置(0x0e05b)加载了8KB左右的与中断向量表相应的若干中断服务程序。
 
  中断向量表有256个中断向量,每个中断向量占4个字节,其中两个字节是CS值,两个字节是IP值。每个中断向量都指向一个具体的中断服务程序。
 
  BIOS阶段的工作
  POST开机自检
 
  BIOS程序首先检查,计算机硬件能否满足运行的基本条件,这叫做”硬件自检”(Power-On Self-Test),缩写为POST。
 
  如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。
 
  电脑主机打开电源的时候,随后会听到滴的一声,系统启动开始了开机自检(POST-power on self test)自检开始)
 
  这个过程中主要是检测计算机硬件设备比如:CPU,内存,主板,显卡,CMOS等设备是否有故障存在
 
  如果有硬件故障的话将按两种情况理:
 
   对于严重故障(致命性故障)则停机,此时由于各种初始化操作还没完成,不能给出任何提示或信号;
   对于非严重故障则给出提示或声音报警信号,等待用户处理),如果没有故障,POST完整自己的接力任务,将尾部工作交接给BIOS处理
 
 
  加载BIOS
  BIOS把控制权转交给下一阶段的启动程序。
 
  这时,BIOS需要知道,”下一阶段的启动程序”具体存放在哪一个设备。也就是说,BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做”启动顺序”(Boot Sequence)。打开BIOS的操作界面,里面有一项就是”设定启动顺序”。
 
 
  在此之后,计算机心里就有谱了,知道应该去读取哪个硬件设备了。
 
  引导操作系统
  硬件自检完成后,我们期望能否启动操作系统,但是问题出来了
 
   操作系统存放在哪?
   BIOS如何找到操作系统?
   BIOS如何加载操作系统?
  背景知识
  多操作系统时的启动顺序
  为了寻找操作系统,BIOS按照”启动顺序”,把控制权转交给排在第一位的储存设备。
 
  这时,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。
 
  如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;
 
  如果不是,表明设备不能用于启动,控制权于是被转交给”启动顺序”中的下一个设备。

(编辑:武林网)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表