Chinaunix首页 | 论坛 | 博客
  • 博客访问: 581109
  • 博文数量: 137
  • 博客积分: 4040
  • 博客等级: 上校
  • 技术积分: 1584
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-08 13:05
文章分类

全部博文(137)

文章存档

2011年(10)

2010年(23)

2009年(104)

分类: LINUX

2009-04-24 14:32:33

系统的启动是指从计算机加电到显示用户登陆提示的整个过程。我们将在这里对整个流程以及关系到的一些内容做讨论。过程主要可以分为两个阶段:载入内核和准备运行环境,我们分别进行讨论。本部分的讨论只基于i386硬件架构,但大部分内容是有共通性的。

载入内核(将内核载入内存,并将控制权传递给它)

    计算机加电到Boot Loader开始工作,硬件含量远大于软件含量,所以这里暂不提及,如果实在有关心的朋友,请先别着急,我们将在下期里讨论它。

这一阶段是 Boot Loader 的主战场。它必须将可执行的内核映像和内核启动所需的额外数据信息从存储介质上载入内存,这并不是件简单的工作,因为除了从硬盘载入,可能还会需要从网络引导服务器这样的外部介质上载入。各种纷繁芜杂的文件系统类型也给载入带来了巨大的挑战。

Boot Loader 可能还需要改变CPU的运行特权级别,然后就可以让内核投入运行了。

除此之外, Boot Loader 还要完成一些其它功能,比如从BIOS中获取系统信息,或者从启动时的命令行参数中提取信息等。有的 Boot Loader 还要扮演引导选择工具的角色,方便用户选择不同的操作系统。

Boot Loader的职责:

l         判断到底要载入什么,这可以要求用户进行选择

l         载入内核和它可能需要用到的相关数据,比如initrd或者其它参数

l         为内核准备好运行环境,比如,让CPU进入特权模式

l         让内核投入运行

Boot Loader的历史变迁:

早期的Linux只支持软盘引导扇区和 Shoelace 两种 Boot Loader Shoelace 是从Minix继承下来的、文件系统相关的 Boot Loader。它只支持 Minix 文件系统。当时Linux只使用 Minix 一种文件系统,所以这样做并没什么问题。可是, Minix 文件系统存在不能保存创建、修改和访问时间信息;文件名长度限制在14个字节等问题。随着Linux的发展,这些与传统Unix文件系统大相径庭的缺陷越来越让人难以忍受,它已经不适合作为Linux的主要文件系统了。

为了支持其它文件系统的实现,Linux引入了VFS(虚拟文件系统)。这个举措很快就引起了热烈的反响,一大批新的文件系统实现出现了。其中一个 Minix 文件系统的变体,扩展文件系统 Xiafs (根据它的作者命名)突破了 Minix 文件系统的文件名长度限制,将此长度一举提高到全部30个字符。当时文件系统之间的竞争着实激烈,很难看出谁会胜出,甚至搞不清楚会不会有一个最终的“赢家”。

       尽管不确定性很大,但是有一点却是清楚的:不管最后哪种文件系统会受到青睐,但是除了 Minix 作为根文件系统,谁也不能从硬盘上启动,因为Shoelace只支持Minix文件系统。LILO应运而生了。由于支持多种文件系统(当时内核支持的主流文件系统已经有 Minix ,扩展文件系统 ext Xiafs 。还有人在移植 BSD FFS ,根本看不出来什么时候是个尽头)在实现和维护上难度太大,而 Boot Loader 也不应该成为人们试验新的文件系统的绊脚石,所以LILO采取了和文件系统无关的设计。

这种设计经受住了时间的考验,被证明是非常成功的。即使在今天,LILO仍旧可以从内核支持的绝大部分文件系统的硬盘上启动。但是,由于ext2历经了这么长的时间一直没有大的演变,成为了事实上的标准,所以跟文件系统相关的Boot Loader又渐渐流行了起来。

    尽管ext2已经能满足大部分人的日常需要,但是文件系统的设计者们还是在研制以日志机制为特征的新的文件系统,并且已经取得了相当大的进展。考虑到当前又有可能出现多种文件系统的实现同时并存的情况,因此对与文件系统无关的Boot Loader的需求可能会再次变得强劲。

初始化基本的操作环境

一旦内核开始运行,它会初始化内部的数据结构,检测硬件,并且激活相应的驱动程序,为应用软件的准备运行环境。期间包含一个重要操作——应用软件的运行环境必须要有一个文件系统,所以内核必须首先装载root文件系统。由于我们的目的是介绍基本流程,所以相关的硬件初始化细节就不再讨论,相关内容在下一期杂志中会有详细介绍。

硬件初始化完成后,内核着手创建第一个进程——初始进程。说是创建, 其实也不尽然,该进程其实是整个硬件上电初始化过程的延续,只不过执行到这里,进程的逻辑已经完备,所以我们就按照进程的创建方式给它进行了“规格化” ——我们把这个初始进程也叫做“硬件进程”,它会占据进程描述符表的第一个位置,task[0] INIT_TASK表示。该进程进而会再创建一个新进程去执行init()函数,其实,这个新进程才是系统第一个实际有用的进程,它会负责接着执行下一个阶段的初始化操作; 而初始进程(INIT_TASK)自己则会开始执行idle循环,也就是说,内核初始化完成之后,初始进程唯一的任务就是在没有任何其它进程需要执行的时候, 消耗空闲的CPU时 间(因此初始进程也被称为idle进程)。

下一阶段的初始化工作要比前一阶段轻松一点,因为现在是由一个真正进程来接手负责完成它们了,而前一阶段都是由“硬件进程”手工去做的。在此阶段,这个由INIT_TASK创建的新进程需要初始化总线、网络并启动系统中的各种系统内核后台线程,然后再初始化外设、设置文件格式,在这之后,它要为进入系统做最后的准备——初始化文件系统,安装root文件系统,打开/dev/console

阅读(688) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~