linux启动全接触

  关于Windows启动过程介绍的文章可谓多如牛毛而对于Linux的介绍却是凤毛麟角凡是曾经使用过Linux的用户可能都会注意到当计算机启动时屏幕上会出现很多信息一般情况下这些信息我们可以通过以下的命令看到

  cat /var/log/dmesg | more

  这些信息究竟有什么含义?这个问题看起来似乎很容易回答因为只要在Linux参考书里查找一下就会找出一个类似于这样的答案这是一些内核启动信息……但是内核启动信息到底是什么意思呢?

  要想对Linux内部工作有所了解就必须要对Linux内核的体系结构有一个全面的了解下面我们就去揭开它的秘密在此我不想解释Linux内核的体系结构只想解释(或者说是试图去解释)计算机系统启动进程中一些最基本的概念这里所说的启动过程是指从按下开关到提示符出现的整个过程

  启动指的是什么

  在操作系统的词汇里启动是指通过处理器执行一些指令把操作系统的一部分放入到主存中在启动过程中Linux内部的数据结构会被初始化会被赋给一些初始值并且某些进程会被创建因为当计算机电源打开时所有的硬件设备都处于一种不可预知的状态内存也处于一种不活动的随机状态所以计算机的启动过程可以说是一个长且复杂的任务因此我们必须知道之所以叫启动主要是因为计算机体系结构的原因

  在此提请读者注意     对计算机内部的工作和内核的操作有一个基本的了解对自己非常有益

  这篇文章中提到的所有文件指的都是Linux内核版本里的文件这些文件对于所有的Linux内核来说都是相同的并且可以在任何一个Linux系统里找到它们此处我使用的是Red Hat

  在本文里讨论范围限于IBM PC体系结构

  BIOS及其功能

  当计算机打开电源时内存里包含的是一些随机的数据所有的东西都没有被初始化操作系统也没有被加载开始整个启动过程的是一个特殊的硬件电路它触发CPU的Reset脚的逻辑值然后一些CPU的寄存器比如CS(一个分段寄存器代码段寄存器它指向含有程序指令的段)eip(在执行指令过程中当CPU检测到一个意外事故发生时它会做出三种类型的判断错误陷阱中止这取决于eip寄存器的值它存储在内核模块栈里)就会被给定一个值接着物理地址为xfffffff的代码将被执行这个地址被存储在一个只读存储器(ROM)里BIOS(基本输入/输出系统)实际上是一段存储在ROM里的程序它包含了一系列可以被某些操作系统调用用于处理计算机各种硬件设备的中断驱动和低级程序其中微软的DOS就是这样的一种操作系统

  Linux是否使用附于计算机系统的BIOS来初始化硬件设备?或者说是否有其它的东西来完成同样的任务?不过这个问题没有那么简单必须要了解一些知识我们从模式开始Intel微处理器实现地址翻译(从逻辑地址>线性地址>物理地址)有两种不同的途径分别称作实模式和保护模式实模式存在主要是为了使得处理器可以和较老的处理相兼容事实上所有的BIOS程序都是在实模式下运行的但是Linux内核是在保护模式下运行而不是在实模式下因此一旦初始化完成后Linux就不再使用BIOS而是完全由自己来为计算机上的所有硬件提供驱动程序(这点和DOS是不一样的)

  那么什么时候Linux使用保护模式?为什么BIOS不能使用相同的模式?BIOS使用实模式是因为其在操作过程中使用的是实模式地址并且在计算机刚打开电源时只有实模式地址可用一个实模式地址由段地址和偏移地址组成因此相应的物理地址就为段地址×(×)+偏移

  那么这是不是意味着在整个启动过程中Linux就从来不使用BIOS了呢?答案是否定的在启动阶段Linux从硬盘或者其它外部设备加载内核时需要使用BIOS

  让我们来看一下启动时BIOS主要做了哪些操作

  BIOS要对硬件进行一系列彻底的检测这个步骤主要是检查系统安装有哪些设备以及它们工作是否正常通常把这个步骤叫做自检(PowerOn SelfTestPOST)这时会显示版本及其它很多相关的硬件信息

  BIOS要对硬件进行初始化这一步非常重要因为它要保证所有的硬件设备在IRQ(中断请求)和I/O端口操作时都没有冲突等这步完成以后它会显示一个已经安装的PCI设备表

  接着到了操作系统BIOS将查找一个可以引导的操作系统这取决于BIOS的设置它可以从软盘硬盘或者光盘启动

  一旦发现一个合法的设备BIOS就会把其第一扇区的内容复制到物理地址即从xc开始的内存中然后跳至刚加载的地址并执行之

  到此为止BIOS所要做的工作就全部完成了

  自举程序及其功用

  BIOS调用一个专门的程序这个程序的任务就是把操作系统的内核调入内存这个程序就叫做自举程序(Boot Loader)在我们继续下面内容之前先来看一下启动系统的不同途径

  从软盘启动Linux

  从软盘启动时存储在软盘第一扇区的指令将被加载并执行这个指令然后就会把其余的内核复制到内存中

  Linux内核可以装在MB的软盘里不过为了减少磁盘占用量它们都进行了压缩这个压缩过程是在编译时完成的而解压缩的过程则由自举程序完成

  从软盘启动Linux时自举程序要做的工作非常简单它是一个位于/usr/src/linux/arch/i/boot/bootsectS的汇编语言文件当我们编译Linux内核源代码或者获取一个新的内核时这个可执行的汇编代码就会被放在内核程序的前端由此可见要制作一个可启动的Linux软盘其实很简单我们只要从磁盘的第一个扇区拷贝Linux内核就可以创建一个可启动软盘当BIOS加载软盘的第一个扇区时它实际上拷贝的是自举程序自举程序由BIOS调用(跳到物理地址为xc的位置)然后执行以下的操作

  ()把自已从地址xc移动到x

  ()使用地址xff创建实模式栈

  ()设置磁盘参数表这里使用的是BIOS提供的软盘驱动程序

  ()通过调用BIOS程序显示Loading信息

  ()自举程序调用BIOS程序来加载软盘上内核的setup()函数并把它放在起始地址为x的内存中

  ()接下来自举程序调用一个BIOS程序这个程序从软盘加载剩余的内核程序并将其放入起始地址为x(所谓的低地址)或者x(所谓的高地址)

  ()然后跳转到setup()函数

  从硬盘启动Linux

  当系统从硬盘启动时启动过程又有所不同硬盘的第一个扇区叫做MBR(Master Boot Record)其上存储着分区表和一个小程序这个程序加载存储由操作系统的第一扇区来开始启动Linux是一个高度灵活且非常优秀的软件所以在MBR里它使用一个叫做LILO的程序来代替上述的那个程序LILO允许用户选择所要启动的操作系统

  一般来说Linux是从硬盘启动的这就需要不同的自举程序在Intel系统里用得最多的自举程序就是LILO对于其它的体系结构还存在着别的自举程序LILO可以安装在MBR上(请注意在安装Red Hat Linux时有一个步骤会让用户选择把LILO安装到MBR或者引导扇区)或一个活动分区的引导扇区上

  由于LILO太大MBR无法容纳所以它被分成两部分MBR(或者磁盘分区的引导扇区)包含有一个小的自举程序它被BIOS载入到起始地址为xc的内存中然后这个小程序再把自己移到xa地址处接着设置实模式栈最后加载第二部分的LILO自举程序(请注意实模式栈地址范围是xb 到 xa)

  第二部分的LILO会从磁盘读取所有可用的操作系统并且给用户列出以选择所要启动的系统一旦用户选择完成自举程序就会加载相应的扇区内容到内存中并且执行之

  自举程序被BIOS调用时(跳到物理地址为xc处)要执行以下操作

  ()把自已从地址xc移动到x

  ()使用地址xff创建实模式栈

  ()设置磁盘参数表这里使用的是BIOS提供的软盘驱动程序

  ()通过调用BIOS程序显示Loading Linux信息

  ()自举程序调用BIOS程序来加载软盘上内核的setup()函数并把它放在起始地址为x的内存中

  ()接下来自举程序调用一个BIOS程序这个程序从软盘加载剩余的内核程序并将其放入起始地址为x或者x

  ()然后跳转到setup()函数

天有泪,烛有泪,天泪有声,烛泪有形,

linux启动全接触

相关文章:

你感兴趣的文章:

标签云: