Linux 系统启动流程

Linux 系统启动流程

Linux 系统启动流程

    本文章对Linux系统启动过程进行了一番整理,很多东西借鉴了网上或鸟哥的linux书籍资料,目的是想让Linux的启动过程更加简单和易于理解。本文以概念和感性理解为主,倘若想深入研究Linux启动过程,请参阅其他专业书籍或网站。

  对于Linux系统的启动过程,可分为两类:

  第一类:个人电脑和服务器等硬件比较负责的系统中Linux系统的启动流程

  第二类:嵌入式Linux系统,如手机,智能电视等。

  下面的内容主要是围绕这两个方面展开。

一.  基本概念

  BIOS:Basic Input Output System基本输入输出系统。它是一组固化到计算机主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

  Boot Loader:启动加载器

  MBR:MstarBoot Record 主引导分区

  此处有必要谈谈BIOS与Boot Loader的异同点,以便理清两者之间的关系

  BIOS是与主板一起开发的,所以主板的一些硬件信息只有BIOS最清楚,不同的主板对应的BIOS基本都是不同的,进入BIOS设置的方式可能也不同,主板的具体信息需要BIOS报告给操作系统。当你买来一台新的电脑时,没有安装任何的操作系统,但是电脑仍然能够开机启动,屏幕也能正常亮还有开机Logo和音乐等,这些都是因为有BIOS的缘故。BIOS就相当于主板级别的一个小系统,主要负责系统(主要是主板)硬件的初始化,例如CPU,内存,硬盘,键盘,显示卡,网卡等硬件的初始化。BIOS通常是存在于PC或服务器等较负责的设备上,而BootLoader通常是存在于嵌入式系统中。

  Boot Loader:引导加载程序。Boot Loader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

  实际上,现在的BIOS和BootLoader并非完全分离的,非要将两者完全区分开是没有多大意义的。比如uboot(universal bootloader)在嵌入式系统中,还是会做一小部分硬件初始化的工作。

二. 以PC或服务器架设的Linux系统启动

  电源上电后,CPU从某个由CPU制造商预先安排的地址上取指令执行,加载BIOS程序运行。并通过BIOS程序去加载CMOS的信息,通过CMOS内的设置值取得主板的各项配置信息,如启动顺序/硬盘大小/系统时间等。取完这些信息以后,BIOS还会进行开机自检POST(Power-on Self Test,POST)。POST完成对CPU、系统主板、基本的640KB内存、1MB以上的扩展内存、系统ROM BIOS的测试;CMOS中系统配置的校验;初始化视频控制器,测试视频内存、检验视频信号和同步信号,对CRT接口进行测试;对键盘、软驱、硬盘及CD-ROM子系统作检查;对并行口(打印机)和串行口(RS232)进行检查。

  接下来就会开始进行设备的数据读取。系统软件大多放置到硬盘中,所以BIOS会指定启动的设备好让我们可以读取磁盘中的操作系统内核文件。但由于不同的操作系统的文件系统格式不相同。比如windows用NTFS/FAT,Linux主要用ext3/ext4等。因此我们必须要以一个引导装载程序来处理内核文件加载的问题,因此这个引导装载程序就被称为BootLoader了。而BootLoader是装载启动设备的第一个扇区内,也就时MBR中,比如U盘启动的Ubuntu12.04LTS系统的bootloader就是在U盘的MBR中(这在制作U盘系统启动盘的时候,由制作软件完成的)。

  那么BIOS又是如何读取到MBR中的bootloader程序的呢?实际上BIOS带有软件中断服务程序,BIOS是通过INT 13号中断来读取MBR的。只要BIOS能够检测到你的启动设备,那么就会利用INT 13中断去读取该磁盘的MBR,然后从bootloader入口地址处开始执行bootloader引导程序。

  Bootlaoder引导程序执行以后便开始加载操作系统内核,内核开始检测硬件与加载驱动程序。硬件驱动成功后,Kernel会主动调用init进程。init进程也是第一个进程,接着init会执行/etc/rc.d/rc.sysinit来准备软件执行的操作环境(如网络/时区等),执行run-lever执行等级对应的各个服务的启动(script方式),执行/etc/rc.d/rc.local文件,执行终端机模拟程序mingertty来启动login进程,最后就等待用户登录。  

  

三. 嵌入式Linux系统启动

  对于嵌入式Linux系统来说,不同的是嵌入式系统中没有BIOS。目前大多数的嵌入式Linux系统的bootloader都用的是uboot(GPL的一个开源项目,由DENX开发)。系统加电或复位后,CPU 从某个由 CPU 制造商预先安排的地址上取指令,开始执行bootloader。uboot的bootloader不仅负责启动内核等工作,而且完成部分硬件的初始化工作,如CPU缓冲器/寄存器等初始化,设置堆栈指针等。

  开始执行bootloader之后,会开始加载Linux kernel,将内核从Flash加载到DRAM中运行,内核会开始检测硬件与加载驱动程序,在硬件检测和驱动加载成功以后,内核会主动调用和执行init进程,接着init进程将准备软件执行的操作环境和启动各个必要的系统服务。这样整个Linux系统运行环境就跑起来了,接着便是运行响应的应用程序了。

 
 
分类: Linux之旅
原文地址:https://www.cnblogs.com/Leo_wl/p/3024166.html