Linux环境开发1:计算机的启动过程

168 阅读7分钟

概述

对一台装了Linux的主机,用户按下开机按钮,要经历以下过程:

  1. bios自检
  2. 系统引导程序
  3. 启动系统内核

第一阶段:BIOS自检

按下电源后,CPU的RESET的引脚会产生一个逻辑值,这就是CPU的复位。此时CPU会被唤醒,随后在0xfffffff0位置执行一条长跳转指令,跳转到固化在ROM中的BIOS处,并开始执行BIOS代码。

BIOS(Basic Input/Output System)又被称为基本输入输出系统,由主板厂商固化在ROM中。BIOS的主要作用是硬件自检,然后将控制权转交给下一阶段的启动程序。

BIOS硬件自检即检测系统外围关键设备(如CPU、内存、显卡、IO)是否正常。自检中如果发生错误,将按两种情况处理:对于严重故障,直接停机,此时由于各种初始化操作还未完成,不能给出任何提示或信号;对于非严重错误,BIOS会给出提示或报警信号,等待用户处理。

硬件自检完成后,BIOS会将控制权转交给下一阶段的启动程序。BIOS保存一份外部储存设备有序列表,设备的排序称为启动顺序。BIOS会按照启动顺序读取设备,找到第一个存在系统引导程序的设备,把控制权转交系统引导程序,随后BIOS结束运行。

第二阶段:系统引导程序

分区

在了解系统引导程序工作流程之前,我们需要先学习设备分区的知识。

对包含系统引导程序的设备,最前面的512字节就叫作主引导记录 (Master Boot Record,MBR)。主引导记录只有512字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪个位置去找操作系统。主引导记录由以下3个部分组成:

  1. 第1-446字节: 调用操作系统的机器码(第一部分引导代码)。
  2. 第447~510字节:分区表(Partition Table)。
  3. 第511、512字节: 主引导记录签名(0x55和0xAA)。

第二部分分区表的作用是将硬盘分成若干个区。分区表的长度只有64字节,里面又分成4项,每项16字节。所以,一个硬盘最多只能分4个一级分区,又叫作主分区 。每个主分区的16字节由以下6部分组成。

  1. 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。
  2. 第2-4个字节:主分区笫一个扇区的物理位置(柱面、磁头、扇区号等)。
  3. 第5个字节: 主分区类型。
  4. 第6-8个字节: 主分区最后一个扇区的物理位置。
  5. 第9-12字节:该主分区第一个扇区的逻辑地址。
  6. 第13-16字节: 主分区的扇区总数。

随着硬盘越来越大,4个主分区已经不够了,需要更多的分区。但是分区表只有4项,因此规定有且只有一个区可以被定义成扩展分区(Extended Partition)。扩展分区就是指这个区里面又分成多个区。这种分区里面的分区就叫作“逻辑分区(Logical Partition)。扩展分区包含一个或多个逻辑分区。

计算机先读取扩展分区的第一个扇区,叫作扩展引导记录(Extended Boot Record,EBR)。它里面也包含一张64字节的分区表,但是最多只有两个分区项,第一个分区项描述第一个逻辑分区,第二个分区项描述第二个逻辑分区,如果不存在下一个逻辑分区,第二个分区项就不需要使用。如果有两个分区项,计算机就可以找到第二个逻辑分区,接着会读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。

系统引导程序工作流程

系统引导程序分为两部分,第一部分位于主引导记录(MBR)上,这部分先启动,作用是引导位于某个分区上的第二部分引导程序。

BIOS转交控制权时,计算机读取该设备的第一个扇区,也就是读取最前面的512字节。如果这512字节的最后两个字节是0x55和0xAA,就表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给启动顺序中的下一个设备。

BIOS把第一部分引导代码装入内存后,它就退出了,此时第一部分引导就启动了。现在计算机的控制权就要转交给硬盘的某个分区了,这里又分成2种情况。

  1. 要引导的操作系统位于激活的主分区里。计算机会读取激活分区的第一个扇区,这个扇区叫作卷引导记录(Volume Boot Record,VBR)。卷引导记录告诉计算机,操作系统在这个分区里的位置。随后,计算机就会加载操作系统了。
  2. 要引导的操作系统位于逻辑分区里。要启动逻辑分区上的操作系统,计算机读取MBR前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装好的启动管理器程序(比如GRUB),这意味着第二部分引导代码启动了。它提示用户选择启动哪一个操作系统。用户选择后,就可以直接启动所选的操作系统了。

系统引导程序到此就基本结束了,下面轮到操作系统内核登场了。

第三阶段:启动系统内核

实模式和保护模式

从80386开始,CPU有3种工作方式:实模式、保护模式和虚拟8086模式。

CPU在刚刚启动的时候工作模式是实模式,等到操作系统运行起来以后就切换到保护模式。 实模式只能访问地址在1MB以下的内存,称为常规内存,我们把地址在1MB以上的内存称为扩展内存。

在保护模式下,全部32条地址线有效,可寻址高达4GB的物理地址空间:扩充的存储器分段管理机制和可选的存储器分页管理机制不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持;支持多任务,能够快速地进行任务切换(switch)和保护任务环境(context);4个特权级和完善的特权检查机制,既能实现资源共享,又能保证代码和数据的安全和保密及任务的隔离。

内核启动

控制权转交给操作系统后,橾仵系统的内核首先被载入内存。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件产生init进程,这是Linux启动后的第一个进程,其进程号(PID)为1,其他进程都是它的后代。然后,init 进程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。至此,全部启动过程完成。