操作系统有哪些,我的简要说明明一下功能

对于一些关心国产芯片与国产操莋系统发展动态的朋友来说一提到国产操作系统,大家可能就会想到深度操作系统但笔者在一篇文章的评论中,看到有一位用户这样來描述他对国产操作系统的使用感受“这个系统装一次要2小时左右,好像没法修改分区盘的名字”真如这位朋友所说吗?笔者的实际使用体验来回答一下

国产操作系统深度的使用性能到底怎么样?各方不同的声音有很多有的人说非常好用,使用流畅、界面优美有嘚人说使用起来经常会卡顿,很难用甚至还有像上面这位朋友所说,“装次系统要2小时”但是,根据笔者这一年左右的使用体验来看感觉并不像有些朋友说的那么不堪。

首先说说深度操作系统的***吧感觉与***windows系统大同小异。可以用光盘来***也可以制作专用嘚深度U盘启动来装系统。这些在深度的官方网站都有详细说明这里就不多加赘述,主要谈体验

笔者的电脑配置为10年前的老古董,DDR2 800 2G的内存条、AMD 速龙 X2 250 CPU就是这样的硬件配置,***一次深度操作系统的时间大概在15分钟左右系统版本为15.6。所以我不知道这位朋友***一次国产操莋系统的时间要2小时是怎么来的。

再说说国产操作系统的具体使用由于笔者这台电脑只是轻度使用,仅限浏览网页、简单的表格制作、看看视频等其他对硬件要求高的应用不在此讨论范围之内,因笔者没用过不敢妄加评论系统***好后,自带谷歌浏览器网页打开嘚速度从实际体会来看,还是非常快的甚至可以说是秒开。不会说会出现卡顿、不流畅的现象当然,这也与浏览器、网速有关

深度操作系统15.6自带的表格软件为WPS 2016。不管是打开文档还是编辑文字个人感受还是相当不错的,甚至可以说比在windows xp下使用office 2003速度要快因为笔者之前茬这台电脑上装的操作系统就是windows XP,后面改成了深度操作系统

由于笔者这台电脑配置过于“古董”,只能轻度使用所以在国产操作系统仩面也主要是用到以上两方面。至于其他大的应用没有涉及到所以也就不乱加评论。经过这1年的使用体会来看个人认为,深度国产操莋系统已经做得相当不错了完全能满足日常办公、家用需求。希望国产操作系统的明天越来越好加油!

摘要本期涉猎了操作系统的来龍去脉后与大家携手步入Linux世界我们力图展示给大家一幅Linux系统的全景图,并为了加深对linux系统的全面认知亲手搭建了一个能运行在内存中嘚试验系统。同时为大家提供了几个shell脚本帮助建立试验系统

用萧亚轩的一首歌形容操作系统给我们的感觉再合适不过了,“最熟悉的陌苼人”

说熟悉,因为几乎每天我们都在有意无意和它打着交道无论是日常办公,还是畅游网际我们都无法离开操作系统的帮助。电腦初启首当其冲运行的就是操作系统。对于许多人而言电脑就是那扇“窗”。即便远离电脑我们依然无法逃脱操作系统的“魔掌”。在您收发短信、拨打***的时候手机屏幕背后一个嵌入操作系统正在默默为您服务。越来越多的数字设备都开始拥有自己操作系统雖然它们不同于Bill为我们带来的“窗子”,但并无什么本质的差别假如有一天,您的电视机开始对您嘘寒问暖请别忘记,有一个叫做操莋系统的东西站在它的背后

说陌生,因为直接为我们服务的大多属于应用软件也许是文字处理、也许电子邮件、也许网络游戏。他们嘟运行于操作系统之上提供我们所需的服务,这让我们很少直接面对操作系统对大多数用户而言,操作系统的细节是不可见的所以雖说我们无时无刻不在使用操作系统,彼此之间却多了一层隔阂对于操作系统的认识,往往只能停留在间接地、片面地感性基础之上其内部的运作机制,我们无法一目了然

无处不在却不以正面相示,让操作系统有了一种“犹抱琵琶”的美于是操作系统被冠以“最神秘”的称号。

揭开这层神秘面纱是我们杂志的初衷。我们希望能够诠释操作系统设计思想和您一起熟悉操作系统提供的各种服务,学***灵活运用这些服务的方法和技巧我们将以理论讨论结合实例实验方式,让您和我们一起拥有操作系统级开发软件的本领

好了,开始峩们的内核之旅走近这个“最熟悉的陌生人”吧!

提纲挈领地介绍操作系统的基本概念;

理清楚操作系统和其它系统软件或应用软件之間的关系;

了解操作系统的体系结构;

在此基础上,提出操作系统内核概念

简而言之,希望读者可以在读过本期的内容能在脑海里勾勒出一幅操作系统的全景图,为日后剖析内核、开发内核创造基础

学习的最佳方法是实践。

我们的杂志将以实践为主理论为辅。将实驗贯穿到学习、分析当中

在本期中,为了让读者能比较全面地理解操作系统并加强对操作系统的感性认识,我们将本期分为两大部分:

第一部分从理论上简要介绍操作系统的内涵揭示操作系统在软件体系中的特殊地位,然后讨论操作系统的体系结构和演化进程

第二蔀重点分析Linux操作系统,介绍Linux操作系统的发源特色以及内核结构。最后通过和读者一同亲手搭建一个实验操作系统——一个经过裁减具备基本功能的小型Linux让读者从实践中感受操作系统的体系结构和在计算机系统中所起的作用。


虽然定义总是生硬、乏味、令人费解但是它畢竟是概括性最强、最能体现水平的,所以我们还是要在开始就给出操作系统定义:

操作系统是应用程序的运行环境

可能运行环境这个術语令你如坠云端,它太广泛、太抽象了你一定在问运行环境到底是什么?简单地讲运行环境是一种即服务和控制于一体地容器。

如果你没有理解环境这个概念我可以举个并不贴切的社会实例。

在开发区中可以看到许多企业孵化池或产业园其中入住了各种各样的企業,孵化池或产业园的管理机构会统一为其中的企业办理各种工商、保险、卫生医疗等手续、提供后勤、治安等基础服务企业需要某些政务服务时,可以通过管理机构去和政府联系处理相关事宜,而不需要亲自去处理这些和企业业务无关的政务活动因此可以抽出身来集中精力在业务上。孵化池和产业园为企业提供了统一、普遍地服务和管理是企业运作的外在环境。操作系统从这个意义上来说类似於产业园的管理结构,为应用程序——好比企业——提供基础服务和管理

当然,我们现在并不指望你立刻认识到操作系统深刻内涵对咜的认识需要在不断地使用和思考中消化和积累,在本期杂志中我们将从各种角度介绍“运行环境”这个术语的真实含义,并在今后各期杂志中分阶段、分层次的展开学习操作系统的各个领域相信在不久的将来,你就能和我们一起认清它的庐山真面目了

想要认清一个囚,最好是从小认识他对技术的理解也是如此,我们必须了解它的产生原因和发展过程才能较为全面的认识该技术所解决的问题,认識它在学科发展中所处的地位对比技术发展各个阶段的特点,才能认清该技术的优劣同样,我们想要把握操作系统的特性还是先把操作系统放在时间轴上看看它的来龙去脉吧!

操作系统并不是计算机出现之初就有的,最初的计算机科学中并不存在操作系统这个概念所有任务都直接运行于硬件之上。那时的任务大多集中于科学计算领域系统硬件实现相对简单、直接,任务对I/O操作的要求也比较低将結果记录到磁带机之类的简单设备中足矣。老程序员们大多采用手工或是用打孔机的方式将将二进制数据和程序输入机器内存然后执行計算,最后将结果保存到磁带机上。一旦出现错误机器上的调试灯会将保存在寄存器中的错误代码反映出来,程序员们会据此去分析錯误所在

随着科学计算任务变得越来越复杂,计算机逐渐被应用到了科学计算以外的其它领域硬件设备比以前更加丰富和复杂了,I/O操莋要求大幅提高程序规模迅速扩大,需要调试的错误更是直线上升直接操作硬件,对程序员来说变得越发困难

于是出现了高级语言、编译系统,帮助程序员简化开发工作;出现了操作系统帮助程序员管理和操作硬件设备。程序员们可以将精力集中于开发需要的任务烦琐的如任务装载、分配/释放内存、内存寻址、设备驱动、数据存储等等硬件相关操作统统交给操作系统管理——真可以说是生产力的┅次解放。

时代继续发展多用户多任务时代的来临,使得系统管理更加强调资源共享性用户直接操作系统资源显然有悖于上述精神,洇此资源合理分配与保护更为操作系统发展提供了新的挑战和机遇同时奠定了操作系统不可或缺的地位,从此操作系统成为为软件体系中最基础,最重要的组成部分了

从操作系统的起源可以看出,操作系统的核心任务是作为硬件和应用程序之间的一个中间层或者说昰应用程序的一个操作平台,通过它应用程序和系统硬件隔离开应用程序利用它提供的服务完成硬件相关操作。

总而言之操作系统方便了应用程序运行,保护了系统资源具体地讲,操作系统为用户带来了几个方面的好处:

易操作性: 操作系统是用户和计算机之间的接ロ它大大简化了用户执行任务的复杂程度。

作为应用程序的执行环境:它为程序员建立应用程序提供了必要的编辑环境、编译环境调試工具;为程序的执行提供了载入服务和资源分配服务;为数据存取提供了I/O访问服务;为数据格式转化和定位提供了文件操作服务;为程序的安全运行提供了权限控制服务;为程序运行失败提供了错误报告服务等等系统服务从此,程序员和用户都不再需要关心那些令人生畏的计算机体系结构细节可以全心全意地开发应用程序了。

有效性:从另一个角度看待操作系统可以将它认为是一个计算机资源管理系统。

由于系统中资源种类各异用法也大不相同,如果直接由用户管理这些资源比如内存分配,时钟计时I/O驱动,存储维护势必要求用户具有丰富的软硬件知识,深刻把握计算机系统结构否则资源将难以合理使用,最终造成系统混乱甚至崩溃。而且现代的多用户操作系统更是要求系统资源共享资源必须合理分配给多用户、多任务,只有采用一定的调度策略和分配策略才能保证资源被公平有效嘚利用。所以配置资源成了提高性能的关键——如同资源配置是提高生产力的关键一样。

  安全性:安全性是操作系统为我们提供的另一個重要的特点它为我们提供了多层面的安全保障。

首先操作系统作为系统硬件和用户的中间平台,禁止应用程序直接操作硬件禁止應用程序直接访问内存,执行特权指令多数系统都将应用程序运行限制在用户空间(低特权级),而操作系统则运行于内核空间(高特權级)应用程序只有通过系统调用请求操作系统所提供的接口,才能通过操作系统间接执行和硬件相关的操作或是执行特权指令因此保护了系统不被恶意的应用程序破坏或非法操作。

其次多任务多用户操作系统必须保证,不同任务之间信息不能泄漏因此需要为任务劃分各自的私有空间和对其进行访问控制。对不同用户进行相应的授权和认证可以保护用户各行其是,互不侵犯

总之,操作系统安全涉及方方面面健壮的操作系统必须能多方位地保证任务安全执行。

易扩展:计算机技术的高速发展和计算机日益普及计算机硬件设备鈈断推陈出新,这要求操作系统提供的服务也能够日新月异因此要求操作系统具有良好的扩展性。

由于操作系统对系统资源和服务进行叻抽象屏蔽了底层细节,统一了上层接口添加设备或服务成了一件轻而易举的事,需要做的仅仅是在设备或服务规定的接口下完成噺的实现即刻。

资源概念在操作系统中使用得相当广泛内存、磁盘、文件、处理器、时钟等等软硬件都可以划归到资源范畴。资源的概念其实很好理解概括来讲,系统中的资源指的是系统提供给进程使用的特殊实体进程通过向操作系统请求获得这些实体,另外系统汾配这些实体给进程前,进程需要挂起等待凡是满足上述条件的实体就属于资源。

    和其它任何事务一样操作系统并非一成不变。迄今為止它已经经历了半个多世纪的发展,已经形成了一个庞大的家族从个人计算机到工作站,从通用系统到专用系统从嵌入式到虚拟機,可谓形式丰富多样我们难以将所有操作系统囊括,只希望提纲挈领地介绍在操作系统发展进程中具有代表性的几种系统理清它的演化脉络。

 最早的操作系统是简单的单道批处理系统它的功能相当简陋,只能串行执行预先组织好的任务组早先的系统一次只能运行┅个任务,每个任务必须先装入再等执行完后才能装入下一个任务,重复的装入浪费了大量的时间单道批处理系统的出现,大大的提高了系统吞吐率

 事情并非总如想象般顺利。

 由于数据存储时所消耗的时间——I/O操作时间——相比数据处理时间——CPU操作时间——要高出數倍(往往在20倍以上)所以程序运行到I/O操作期间,CPU总是需要停下来(挂起)等待数据传输完成无形中浪费了大量宝贵的时间,任务组Φ后续程序的执行也因此被延迟了如何避免数据传输等待带来的时间浪费呢?能否在进行传输期间解放CPU去执行别的任务呢?

为解决这個瓶颈单道批处理系统进化到了多道批处理系统

所谓多道就实际就是说处理器(当然现在谈到的都属于单处理器系统)可以交错运荇多个程序,某个任务挂起时运行另一个程序。这样一来 CPU等待数据传输造成的时间浪费问题得以解决,系统吞吐率又一次得到了提高

计算机的发展使得任务不再仅仅局限于科学计算,越来越多的应用于办公、生活等日常活动中科学计算中的任务多数执行路径都是固萣不变,预先定义好的只需要给定输入,得到结果期间程序执行中途不需要外界干预与之不同,办公生活中的许多任务都必须和用戶不断交互,任务结果随时都会因为用户的选择改变这时的系统变得更公开、更普遍,往往允许多个用户可以同时使用交互模式和共鼡模式需要任务响应时间尽可能的快(超过20秒的话,人的思维就容易被打断或变得很不耐烦)这样才能让多个用户都满意,于是操作系統开始采用分时技术处理器的运行时间分成数片,均分或依照一定权重派发给系统中的用户使用这种将处理器虚拟给多用户共同使用嘚方法,不但可以满足快速响应而且也可以使得所有用户获得计算机完全是在为自己服务的假象。

上面给出了操作系统发展的主流路线:单道批处理——多道批处理——分时系统除此以外现在还出现了许多分布式操作系统,嵌入系统不过总体技术思路都仍然脱离不了哆道、分时等概念。

操作系统的演化使得其功能变得愈来愈强大但结构也越来越复杂。在以方便用户(包括开发人员和终端用户)为宗旨的思想下操作系统不断集成新功能,新服务回忆从前大家使用的DOS系统仅仅只需要一张软盘,而如今的windows系统或Linux系统动辄就需要数张光盤可见已经从过去的麻雀变成了恐龙——虽然它们都有五脏六腑。

虽然变成了恐龙但是其结构还时相对稳定,清晰的和软件工程提絀的思想一致,操作系统也采取了分层结构越向上层抽象都越高,越接近用户;相反越向下层越靠近硬件,抽象也相对接近硬件而苴高层软件依靠下层软件提供的服务,再加上本身提供附加服务为更高层服务总体来讲呈现倒金子塔形式。

下面我们就简要分析一下操莋系统的体系结构然后再谈谈操作系统设计时需要主要考虑的问题。

在形形***的操作系统之中组成结构不尽相同。因为同样目的实現的手段可以自由选择所以其组成也有很大差异,我们选取最普遍的操作系统(UNIX)组成结构向大家揭示操作系统的体系结构的大致框架。对于各种操作系统之间的具体差异大家可以以下面讲述的结构对比认识。(注意我们这里所说的操作系统属于宏观概念接近于操莋系统发行版,不但包括了内核还包含了学多系统软件和基础应用软件。)

我们用一组简单的数学公式来描述操作系统的组成要素:

操莋系统 = 内核+系统程序

编译环境 编译程序+连接程序 装载程序

操作系统最底层的组件是内核其上层搭建了许多系统软件。系统程序包括三个部分这三个部分分别是:编译环境、应用程序接口和用户接口。编译环境包含汇编C 等低高级语言编译程序,连接程序和装载程序这些程序负责将文本格式的程序语言转变为机器能识别和装载的机器代码;应用程序接口(API)包含内核提供的系统调用接口和语言库,系统调用是为了能让应用程序使用内核服务语言库函数则是为了方便应用程序开发,所以将一些常用的基础功能预先编译以供使用仳如对C语言来说常用的C库有gun C等;用户接口(AUI)包括我们熟悉的shell(关于shell 应该专门写一个教程)、系统服务程序和常用的应用程序。

这些部分并非所有嘚操作系统都必须一个不少的包含不过其中大多数功能都应该提供,尤其内核系统调用,shell这些基本组件它们都属于操作系统必备组件,其它组件是否包含需要根据具体系统的要求和应用环境决定你也可以将其归为操作系统之外的附加部分。

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

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

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

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

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

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

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

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

文件系统存在不能保存创建、修改和访问时间信息;文件名长度限制在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设备重定向stdin、stdout和stderr到控制台,然后搜索文件系统中的init程序并使用 execve()系统调用加载执行init程 序。系统自此进入了用户态

为了装载文件系统,内核需要:1知道root文件系统位于那个存储介质上;2有访问该种介质的驱动程序最常见的情况是root是ext2文件系统,位于IDE硬盘上这种情况下需偠的操作很简单:将设备号作为参数给内核就可以了,IDE的设备驱动程序通常都会编译进内核的

如果内核没有相关介质的驱动程序,问题僦会变得更为复杂而这种情况并不罕见,比如Linux的***盘使用的“通用”内核一般都会碰到如果内核把所有支持的硬件的设备驱动程序嘟包含进来,就会变成一个庞然大物;而且一些驱动程序在检测硬件的时候会影响其它设备

这个问题可以通过initrd机制解决,它允许在装载實际的root文件系统之前先使用RAM文件系统除了上述两个原因,引入initrd还可以解决内核的动态合成问题(详见参考资料一。)

不过我们应该注意到init在整个启动过程中并不是从来就有的,它可以说是一个插件为了解决以上问题,而被加入启动过程象图一所示,Linux系统在启动时吔可以不选择它

为什么要引入initrd?

Linux启动过程中肯定要载入内核镜像在此过程中有些要素必须考虑:

首先,内核镜像不能太大由于受到各种硬件和兼容性的限制,Linux的内核镜像不能太大但是这并不容易做到。Linux内核的核心部分本身就不小了;而且还必须加入会使用到的驱动程序

其次,要支持尽可能多的硬件设备我们在启动过程中有一件重要工作:挂载root文件系统,因为进一步的数据和应用软件都在其上所以我们的内核必须能够访问root文件系统。对于一般用户如果他们使用IDE硬盘上的ext2文件分区作为root文件系统,不会有什么问题因为不管是IDE硬盤还是ext2文件系统,它们的驱动肯定会包含在内核镜像自身里面但是,确实存在一些特殊情况:比如说我们希望发行Linux系 统的***光盘那麼对光盘的驱动,就不一定包含在内核里面了(有人可能要奇怪了,咦光盘中的内核镜像不都已经读进来了吗,怎么内核还访问不了咣盘呢注意,读入内核镜像的是 Boot Loader 内核并不具备 Boot Loader 的功能。)如果没有光盘的驱动我们又怎么把光盘里的软件包***到用户的计算机里呢?把驱动程序预先编译到内核里听起来还不错,可是如果我们除了光盘还有一些其它的***介质那么所有这些驱动就会让内核镜像龐大不堪。

而且还有更严重的问题,各种不同的驱动程序很有可能会发生冲突特别是以前ISA设备占市场主导地位的时候,这种冲突简直難以避免

那时的解决办法是发行商提供预先编译好的支持各种设备的不同内核,把每个内核放进一张软盘随发行包一起交给用户,用戶自己选择装有合适内核的软盘进行引导或者给用户提供制作引导盘的工具,让用户在***前制作自己的启动盘当然,哪一种办法都鈈能让人满意

唯一的希望在于使用模块化机制。在内核启动的时候调用相应的模块加载驱动程序然后访问root文件系统。无论是通过内核對设备做进一步的分析还是直接从用户那里得到配置信息先配置再加载模块的办法,都能有效地避免冲突的发生

除了在***的时候需偠在挂载root文件系统之前调用相应的模块之外,在完成***的系统上我们可能仍然需要在挂载root文件系统之前调用一些模块。这主要是为给計算机进行配置——一般都要针对不同的计算机进行内核配置

理想情况下,用户按照自己的实际情况配置编译文件重新编译内核,一步步完成这种工作但是没有几个用户喜欢这种冗长并且极易出现错误的工作。而且编译和生成内核需要相应的工具可是大部分用户不需要这些工具。

在***的过程中可以直接编译一个整体式的内核但这并不能很好的解决问题:首先,所有的编译工具还需要其次,编譯过程中出现差错导致无法完成任务的概率太大了所以,我们仍然要使用模块机制:模块机制很可靠出了错误也只不过不加载对应的模块而已,不会使整个任务失败而载入模块,象前面说的也是在挂载root文件系统之前就要得到模块的。

基于以上理由Linux引入了initrd机制。

initrd允許系统在启动的时候载入一个RAM盘这个RAM盘可以被当作一个root文件系统,程序可以在其上运行(有两重含义,第一程序在上面;第二,程序的文件系统环境也在上面)在此之后,可以从别的设备上挂载一个新的root文件系统先前的root文件系统(initrd)就会被移动到一个目录上去,朂终被卸载掉

为什么要使用RAM盘呢?首先使用RAM盘能方便的支持以后可能发生的变化;另外,也是为了保持 Boot Loader 工作尽可能的简单在系统引導时,除了内核镜像之外Boot Loader把所有相关的信息作为一个文件读入内存,内核在启动中将该文件作为一段连续的内存块看待也就是把它当莋RAM盘来 使用了。正因为如此这种机制被称作“初始 RAM 盘 (initial RAM

initrd主要用来把系统的启动划分为两个阶段:初始启动的内核只需保留最精简的驱动程序最小集,此后在启动必须加载附加的模块时,从initrd中加载

使用initrd的时候,典型的系统启动的流程变为:

内核将initrd文件转成“普通”的RAM盘并且释放掉initrd文件占用的内存。

initrd被当作root文件系统以可读可写(read-write)方式***。

/linuxrc被执行(它可以是任何可执行文件包括脚本在内;它以uid0身份执行,基本上能完成所有init程序可以做的工作)

常用的启动流 程(比如调用/sbin/init)开始执行

卸载initrd文件系统。

注意这是一个典型流程。其實initrd机制可以通过两种方式使用:要么就是作为一个普通的root文件系统使用这样的话第5、第6两个步骤可以被略过,直接执行/sbin/init(我 们的试验系统僦是利用这种方法);要么作为一个过渡环境使用通过它内核可以继续装载“实际”的root文件系统。

参考资料

 

随机推荐