没什么好说的。
分类: LINUX
2009-10-13 17:27:33
ddt2000 | 2005-04-08 10:02 | ||||||||
摘要 出处: 前言之前言:谁是这篇文章的读者? 不习惯读英文资料的非LINUX高手 声卡不响光驱不转连不上网等等,只要有问题就行 开发嵌入式操作系统 现在流行的ODL(only disk linux)中做内核部分,那些文章不介绍此点内容。我正在做,完工后整理资料。 BY THE WAY ,想成为LINUX高手吗?你需要熟练掌握KERNEL COMPILE 、XCONFIGRATER 、LINUXCONFIG、 SAMBA四大利器,你随时可以找到后三者的大量相关资料,但内核编译就只好啃为数不多的英文了。 笔者耗时3月,搜集并整理大量资料,在儿童节前连续工作18个小时后,给小企鹅送了这份礼物。 笔者自信是目前为止KERNEL编译方面最完备的中文资料(将不断翻译补充),这可是毕业论文哪! 为什么要放网上呢?首先找这方面资料太难了,文章对各位LINUX爱好者会有所帮助。其次,取之于网用之于网。 欢迎使用这篇文章,请随便引用,这才符合LINUX自由软件的精神嘛,不过别忘了提提我的名字,就算为我的辛苦付了点稿酬。 介于内核方面资料较少,欢迎在这篇文章中添加和修改内容,但不要过多删除,笔者列表要加入你的名字,让我们为把它变成数百页的资料而努力。OK,交个朋友吧, 我是玉玉安,email : <> 目录 序言 第一章 内核编译的基础 第一节内核简介 第二节内核版本 第三节编译原因 第四节准备工作 第二章 内核编译的流程 第一节编译开始 第二节配置内核 {核心内容} 1.代码成熟等级 2..处理器类型和特色 3.对模块的支持 4.基本的选择 5.即插即用支持 6.块设备支持 7.网络选项 8.电话支持 9.SCSI设备的支持 10.I2O接口适配器 11.网络设备支持 12.配置业余无线广播 13.红外支持 14.ISDN的文件系统 15.旧型光驱类型(非IDE界面的光驱) 16.字符设备 17.USB支持 18.文件系统 19.控制台驱动 20.声卡驱动 21.Kernel hacking 第三节编译内核 第四节启用内核 附录:LILO分析 第三章 内核编译的应用 第一节嵌入式Linux技术 第二节你的Linux有多大(及实践结果) 结束语 参考文献 序言 近几年,linux大行其道,令不满windows蓝屏的使用者跃跃欲试,结果发现linux安装不及windows方便,界面不及windows友好,配置不及windows容易,软件不及windows丰富,以至浅尝辄止。 其实, Linux有windows无可比拟的两个优势:网络应用和嵌入式技术,这也正是未来最有前途的方向。同时此课题是从理论上设计具有嵌入式Linux操作系统器件的重要组成部分。 如要涉足这两个方面,就必须对内核有深刻理解。当然,您可以从源代码入手,但前提是您拥有程序设计和操作系统等多方面专业知识,否则, 就利用现成的Linux kernel从编译内核开始吧。不幸的是,内核编译方面的资料匮乏。以上两个原因使我写这篇论文成为必要。我可以自信得说,这是目前最详尽的内核编译方面 的中文资料。 值得一提的是,我在搜集翻译资料的过程中,获得了操作系统、程序设计、硬件设备、网络通信等各方各面的知识,极大的拓宽了视野,真正学有所获。 感谢所有为Linux发展作出贡献的人,感谢所有Linux中文网站为促进Linux在中国的发展作出的不懈努力,他们是我搜集资料的来源。 特别感谢我的指导老师——官伯然教授和高斌博士,正是他们的辛勤指导让我顺利完成毕业设计。 西电科大 :李玉元 2001/6/1 备注:#----------后跟小的选项 ##---------后还有更细选项 注意------上机实践结果 第一章 内核编译的基础 第一节 内核简介 内核,是一个操作系统的核心,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。 就好比DOS下的IO.SYS和MSDOS.SYS一体,我们可以把这两个文件叫做DOS的核心。Linux也有它的核心,通常在根目录下,一个叫 vmlinuz的文件。我们用这个文件来控制我们的整台PC,包括周边设备和软硬磁盘机、CD-ROM、声卡等。简单地说,核心就是操作系统本身。没有了 它,就像一个无人住的家,没有人去维持这个家的动作。一个安定的家需要一个很用心已能当机立断的主人:一部电脑也需要很有效率已稳定的核心,也就是操作系 统。因此,核心是整个系统维持下去的关键。 Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在/usr/src/linux下找到,大部分应用软件也都 是遵循GPL而设计的,你都可以获取相应的源程序代码。任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是 Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内核则是这些特点的最直接的代表。 想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工作的。通过通读源代码,我们就可以了解系统的工作原 理,这在Windows下简直是天方夜谭。其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内核。在Windows下是 什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。再次,我们可以对内核进行修改,以符合自己的需要。这意味着什么?没错,相当于自 己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要的功能。在Windows下,除非你是微软的核心技术人员,否则 就不用痴心妄想了。 先介绍一下编译核心的选项,希望能对大家消除对内核的神秘感有所帮助。 1.代码成熟等级 2..处理器类型和特色 3.对模块的支持 4.基本的选择 5.即插即用支持 6.块设备支持 7.网络选项 8.电话支持 9.SCSI设备的支持 10.I2O接口适配器 11.网络设备支持 12.配置业余无线广播 13.红外支持 14.ISDN的文件系统 15.旧型的光驱类型(非IDE界面的光驱) 16.字符设备 17.USB支持 18.文件系统 19.控制台驱动 20.声卡驱动 21.Kernel hacking 第二节 内核版本 由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。Linux的开发采用的是集市模 型(bazaar,与cathedral--教堂模型--对应),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。一个树是稳定树 (stable tree),另一个树是非稳定树(unstable tree)或者开发树(development tree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将 进行相同的改进。一旦开发树经过了足够的发展,开发树就会成为新的稳定树。开发数就体现在源程序的版本号中;源程序版本号的形式为x.y.z:对于稳定树 来说,y是偶数;对于开发树来说,y比相应的稳定树大一(因此,是奇数)。确定是以″ root ″的身份签入,然后cd 到 /usr/src 。uname -r 这个指令将会显示版本。内核版本的更新可以访问<>。 第三节 编译原因 Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。 通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是Linux使用者的必要操作内容。 为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要有下面四个考虑: ---自己定制编译的内核运行更快(具有更少的代码) ---系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中) ---不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞 ---将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些 以上是针对成熟的Linux套件如Redhat Linux而言,我的目的是为建造嵌入式Linux操作系统做准备,也是必由之路。 第四节 准备工作 第一部分 新版本内核的获取和更新 Linux内核版本发布的官方网站是<>, 国内各大ftp上一般都可以找到某些版本的内核。新版本的内核的发布有两种形式,一种是完整的内核版本,另外一种是patch文件,即补丁。完整的内核版 本比较大,比如linux-2.4.0-test8.tar.bz2就有18M之多。完整内核版本一般是.tar.gz(.tgz)文件或者是.bz2文 件,二者分别是使用gzip或者bzip2进行压缩的文件,使用时需要解压缩。patch文件则比较小,一般只有几十K到几百K,极少的会超过1M。但是 patch文件是针对于特定的版本的,需要找到自己对应的版本才能使用。 编译内核需要root权限。把需要升级的内核拷贝到/usr/src/下(下文中以2.2.16的内核的linux-2.2.16tar.gz为例),命令为
先查看当前/usr/src的内容,注意到有一个linux的符号链接,它指向一个类似于linux-2.2.14(对应于现在使用的内核版本号)的目录。首先删除这个链接:
现在解压下载的源程序文件。如果所下载的是.tar.gz(.tgz)文件,使用命令:
如果下载的是.bz2文件,例如linux-2.2.16tar.bz2,使用命令
现在再来看一下/usr/src下的内容,发现现在有了一个名为linux的目录,里面就是需要升级到的版本的内核的源程序。还记得那 个名为linux的链接么?之所以使用那个链接就是防止在升级内核的时候会不慎把原来版本内核的源程序给覆盖掉了。现在也需要同样处理:
如果还下载了patch文件,比如patch-2.2.16,就可以进行patch操作(下面假设patch-2.2.16已经位于/usr/src目录下了,否则需要先把该文件拷贝到/usr/src下):
第二部分 准备主机板和相关硬件的说明手册 其实也不用太详细,只要知道您的硬件是属于哪一类型就行了。例如:有一张SCSI卡,那就要知道这张卡的名字,有一台cd-rom,就 要知道这台光驱是哪一种牌子的,是否为标准的IDE/ATAPI界面,还是另有专属接口卡呢?或者,主机版是否有支持Triton芯片(通常586以上的 电脑常有),这些信息能帮助我们,使得设定变得清楚且容易。 因此,不管您有什么使用手册,准备好吧。即使现在不用,将来还是会用到的(设X-window system时要显示卡的手册)。 第三部分 检查声卡的IRQ设定和其种类 如果配有一张声卡,除了要知道卡的种类外(例如 Sound Blaster)还需要知道这张卡的IRQ地址。一般来说,卢卡的IRQ地址是5或7而IO地址则为220。DMA则l,不过,有时不同的声卡可能会有不同的设定。因为稍后的选项里,就会要填入这些数字。 第四部分 编译核心的硬件需求 在编译核心时,确定您的RAM最好在8MB以上, 否则可能会很慢而且问题会很多,记得查看swap有没有打开(用free指令)。此外,最好不要超频,不然很有可能会发生signal 11的错误,使得编到一半的核心停了下来,其实编译核心就好比编译程序一样,只是因为构成核心的程序太多了,因此我们能小心尽量小心。 第二章 内核编译的流程 概述编译的流程: 编译开始----- make mrproper;检查所需的连接 配置核心 编译核心 编辑/etc/lilo.conf 重新启动新核心 重新启动机器 发现并修理故障(仔细看我的文章,应该没多少问题了) 第一节 编译开始 通常要运行的第一个命令是:
该命令确保源代码目录下没有不正确的目标.o文件以及文件的互相依赖。如使用刚下载的完整的源程序包进行编译,本步可以省略。而如果多次使用了这些源程序编译内核,那么最好要先运行一下这个命令。 确保/usr/include/目录下的asm、linux和scsi等链接是指向要升级的内核源代码的。它们分别链向源代码目录下的 真正的、该计算机体系结构(对于PC机来说,使用的体系结构是i386)所需要的真正的include子目录。如:asm指向/usr/src /linux/include/asm-i386等。若没有这些链接,就需要手工创建,按照下面的步骤进行:
这是配置非常重要的一部分。删除掉/usr/include下的asm、linux和scsi链接后,再创建新的链接指向新内核源代码 目录下的同名的目录。这些头文件目录包含着保证内核在系统上正确编译所需要的重要的头文件。也是上面又在/usr/src下"多余"地创建了个名为 linux的链接的原因之一. 一旦万事俱备,转到/usr/src/linux。现在你也许想停下细读一下文档文件,实际上如果你有些特别的硬件,或几种光驱驱动程 需要自己动手设置,他们通常这样做,当引导时这些驱动程序将给出警告,这并不碍事他们照常工作少,阅读扩展名为.txt .h.c的文件。通常我发现他们具有共性且易于配置。如果你不想冒险,你没必要做。记住你照样可以解开tar文件(或再次安装.rpm文件)恢复前的文 件。 第二节 配置内核 核心内容 接下来的内核配置过程比较烦琐,但是配置的适当与否与日后Linux的运行直接相关,有必要了解一下选项的设置。 配置内核可以根据需要与爱好使用下面命令中的一个: #make config(基于文本的最为传统的配置界面,不推荐使用) #make menuconfig(基于文本选单的配置界面,字符终端下推荐使用,必须安装ncurses-dev和tk4-dev库) #make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用) #make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦) 如果不能使用Xwindow,那么就使用make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了。 选择相应的配置时,有三种选择,它们分别代表的含义如下: Y--将该功能编译进内核 N--不将该功能编译进内核 M--将该功能编译成可以在需要时动态插入到内核中的模块 在每一个选项前都有个括号, 但有的是中括号有的是尖括号,还有一种圆括号。 用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"。这表示前者对应的项要么不要,要么编译到内核里;后者则 多一样选择,可以编译成模块。而圆括号的内容是要在所提供的几个选项中选择一项。 在编译内核的过程中,最烦杂的事情就是这步配置工作了,不清楚到底该如何选取这些选项。实际上在配置时,大部分选项可以使用其缺省值, 只有小部分需要根据用户不同的需要选择。选择的原则是将与内核其它部分关系较远且不经常使用的部分功能代码编译成为可加载模块,有利于减小内核的长度,减 小内核消耗的内存,简化该功能相应的环境改变时对内核的影响;不需要的功能就不要选;与内核关心紧密而且经常使用的部分功能代码直接编译到内核中。下面对 选项分别加以介绍。 [ Last edited by ddt2000 on 2005-4-8 at 10:04 ] |
|
|
ddt2000 | 2005-04-08 10:06 | |||||||||||
出处: 第四节 启用内核 通常,核心安装叫做vmlinuz。过去Unix使用者共同起了这名字。"z"表示压缩,"v"和"m"意思是"virtual"(虚拟)和"sticky(粘性的)",各自属于内存和磁盘管理。建议保留vmlinuz核心,直到知道它工作。 为了能够使用新版本的内核,还需要做一些改动:
以上这两个文件是刚才编译时新生成的。下面修改/boot下的两个链接System.map和vmlinuz,使其指向新内核的文件:
注意:要保留vmlinuz核心,以下列步骤进行
现在#vi /etc/lilo.conf,增加如下一段: image=/boot/vmlinuz-2.2.16 是设定为已经安装的核心 label=linux2.2.16 则是由 lilo 用来告诉你现在要启动的是那个核心或作业系统, read-only root=/dev/hda2 则是这个特别的作业系统的根目录 / 其中root=/dev/hda2一行要根据需要自行加以修改。 运行:#/sbin/lilo -v 保存执行命令:lilo你将看到核心标签,第一个是星号。如果你没有看到新核心的标签或LILO出现错误,你需要重新对/etc/lilo.conf工作(看下面的LILO分析)。 确认对/etc/lilo.conf的编辑无误,现在重新启动系统:
不建议使用热启动或ctrl+Alt+del键。在一些情况下,文件系统不完全卸栽会损坏打开的文件。在LILO提示时,如果你需要启 动旧的核心或使用一些参数启动,如果你没看见启动提示,你可以试用shift或ctrl键,这样启动提示就出现了。一旦出现,按tab看核心标签。输入标 签和可选参数启动。通常,在/etc/lilo.conf文件指定的时间后自动启动核心。启动时,你可能看见一些出错信息就象SIOCADDR。这常常显 示模块(一般是网络模块)没有引导。处理这事很简单,如果有此一错,"VFS,cannotmount root",你就不要在核心中编译适当的磁盘或文件系统支持。 在机器重启后出现LILO时按TAB键,输入linux2.1.16,新内核发挥作用了。 附录:LILO分析(技术性强,仅供参考) 第一部分 LILO介绍 LILO(Linux Loader)是Linux自带的一个优秀的引导管理器,使用它可以很方便地引导一台机器上的多个操作系统。与其他常用的引导加载程序相比,LILO引导 方式显得更具有艺术性,对其深入的理解,将有助于我们方便地处理多操作系统、网络引导、大硬盘及大内存等诸多棘手的问题。 LILO的引导机制------众所周知,计算机的最初启动是由BIOS控制的,在对一些硬件(如:内存、键盘等)初始化之后,它会试 图加载硬盘的主引导记录(MBR)或软盘的引导扇区。MBR可通过两种方式运行,其一是定位到活动分区并加载相应的引导扇区,然后由引导扇区完成该分区内 操作系统的基本组件的加载;其二是直接从一指定分区中加载信息,并通过它装入任一分区的操作系统,诸如LILO、OS/2 boot loader及Partition Magic等引导加载程序都可以配置成这种方式。软盘的引导扇区相当于硬盘活动分区的引导扇区,它通常用于装入软盘上的操作系统。由此可见,只要把 LILO安装在MBR、活动分区或者引导软盘上,就能接管计算机的控制权,然后由LILO完成后继的引导过程。LILO中建有一个引导表地址编码,借此它 的引导程序就能定位到Linux的内核文件,这种地址编码既可以按照柱面/磁头/扇区(CHS)模式,又可以采用LBA的线性块号模式,因此,即使对某些 SCSI控制程序LILO也能运转良好。 当LILO定位到配置文件后,经过预引导过程,就显示提示符: LILO boot: 此时,系统允许选择引导不同的操作系统或者不同的内核配置,按Tab键显示可选项列表,然后输入可选项或者直接回车选择缺省配置,如果选择了引导Linux,还可以直接传递参数到系统内核。 和其他系统的引导加载程序相比,LILO具有更大的灵活性,其引导方式也更丰富多彩。 ●当LILO被安装在硬盘的MBR、活动分区或引导软盘上时,作为原引导程序的替身,它能引导任一硬盘任一分区上的Linux和其他操 作系统;除了引导扇区,它没有任何隐含文件,也不需要使用特定的分区,它的配置文件可以在任何分区、甚至是存放在与Linux毫不相干的DOS分区的某个 子目录下;它能引导几个不同的内核配置,甚至是几个不同的内核; 它能引导同一机程序上的多个Linux版本;可达16个。 ●它能从网络上引导Linux。 ●LILO的灵活性使得其配置变得相当复杂,当有多个系统共存时,建议先安装其他操作系统,最后再装Linux,这样,设置LILO对其他系统的引导会相对简单一些。 第二部分 LILO参数 通常我们谈到LILO,会涉及到两个方面——LILO引导程序和LILO安装命令/sbin/lilo。 为了不至于混淆这两个概念,本文将用LILO表示LILO引导程序,而lilo表示/sbin/lilo。一般地,LILO使用一个文 本文件/etc/lilo.conf作为其配置文件。lilo读取lilo.conf,按照其中的参数将特定的LILO写入系统引导区。任何时候,修改了 /etc/lilo.conf,都必须重新运行lilo命令,以保证LILO正常运lilo.conf使用的配置参数很多,配置起来也相当复杂。下面以 RedHat Linux为例作一些初步探讨,RedHat的lilo程序包版本为0.20,别的Linux发行版本可能会有所出入,但不会太大。 lilo.conf文件中的配置参数分为两部分,一部分是全局参数,另一部分是引导映像参数。引导映像参数作用于每一个引导映像区。如 果某一引导映像参数(例如:password与全局参数的定义相抵触,则以该引导映像参数的定义为准,但仅限于该引导映像区。LILO的引导参数有很多, 在此只对一些比较重要的参数作一介绍。与Linux系统其他的配置文件一样,“#”号后的一行文字表示注释。 1.“boot=”此参数指明包含引导扇区的设备名(如:/dev/had),若此项忽略,则从当前的根分区中读取引导扇区。 2.“root=”此参数告诉内核启动时以哪个设备作为根文件系统使用,其设定值为构造内核时根文件系统的设备名,可用的设备名有: (1)/dev/hdaN~/dev/hddN:ST-506兼容硬盘,a到d上的N个分区 (2)/dev/sdaN~/dev/sdeN:SCSI兼容硬盘,a到e上的N个分区 (3)/dev/xdaN~/dev/xdbN:XT兼容硬盘,a到b上的N个分区 (4)/dev/fdN:软盘,A:(N=0)或B:(N=1) (5)/dev/nfs:由网络取得根文件系统的标志 3.“nfsroot=”若需通过NFS提供根文件系统来引导无盘工作站,此参数为内核指定了网络根文件系统所在的机程序、目录及NFS,其格式为:nfsroot=(〈server_ip〉:)〈root_dir〉(,nfs_options)) 4.“nfsaddrs=”设定网络通讯所需的各种网络界面地址,如无此参数,则内核会试图用反向地址解析协定(RARP)或启动协定 (BOOTP)找出这些参数,其格式为:nfsaddrs=〈客户端IP〉:〈服务端IP〉:〈网关IP〉:〈子网屏蔽〉:〈客户端名称〉:〈网络设备名 〉:〈auto〉 5.“image=”指定Linux的内核文件。 6.“delay=”设定引导第一个映像前的等待时间。 7.“disk=”此参数为某一特殊的硬盘定义非标准参数。 8.“append=”为内核传递一个可选的参数行,其典型的应用是为不能完全由系统自动识别的硬盘指定参数,如:append = "hd=64,32,202" 9.“label=”此参数为每个映像指定一个名字,以供引导时选择。 10.“read-only”设定以只读方式挂入根文件系统,用于文件系统一致性检查(fsck)。 11.“install=”安装一个指定文件作为新的引导扇区,缺省为/boot/boot.b。 12.“loader=”说明所使用的链加载程序(chain loader),缺省为/boot/chain.b,如果不是从首硬盘或软盘启动,那么,此选项必须说明。 13.“table=”说明包含分区表的设备名,如果此参数忽略,引导加载程序将不能传递分区信息到已引导的操作系统。当此参数指向的分区表被修改时,必须重新运行/sbin/lilo。 14.“init=”内核初始化时执行的程序,通常过程为init、getty、rc和sh,版本1.3.43以来的Linux内核能够执行/sbin/init说明的命令行,若在引导过程中出现问题,则可设置init=/bin/sh直接跳到Shell。 15.“ramdisk_start=”由于内核不能放在压缩的内存文件系统映像内,为使内核映像能够和压缩的内存映像放在一张软盘内,加入“ramdisk_start=〈offset〉”,这样内核才能开始执行。 16.“mem=”此参数的目的之一是为Linux指定使用的内存数量:如mem=96MB,目的之二是指定mem=nopentium告诉内核不要使用4MB分页表。 17.“vga=”设置显示模式,如80×50、132×44等。 18.“linear” 产生用于替换硬盘sector/head/cylinder地址(硬盘几何参数)的linear扇区地址。linear地址在运行时产生并且不依赖于硬盘 几何参数。某些SCSI硬盘和一些以LBA方式使用的IDE硬盘可能会需要使用这个参数。注意:在将LILO安装到软盘上时不能使用“linear”参 数。 19.“prompt” 给出“boot:”提示,强制LILO等待用户的键盘输入,按下回车键则立即引导默认的操作系统,而按下Tab键则打印可供选择的操作系统。当 “prompt”被设置而“timeout”没有被设置时,系统会一直处于等待状态而不引导任何操作系统。不设置该参数时,LILO不给出“boot:” 提示而直接引导默认操作系统,除非用户按下了Shift、Ctrl、Alt三键中的任何一个。大多数情况下,如果你的硬盘上有多个操作系统,建议使用参 数,它留给用户一个选择的余地。 20.“timeout=” 设置等待键盘输入的时长,单位是0.1秒。超过这段时间没有输入则为超时,系统将自动引导缺省的操作系统。如果不设置本参数,缺省的超时时间长度为无穷大。 21.“other=” 设置包含非Linux操作系统,如DOS、SCO UNIX、Windows 95等系统引导映像的文件或设备。 22.alias=name 给当前操作系统起一别名。 第三部分 LILO典型配置方法 通常情况下,Linux的安装程序自身就可以完成LILO的安装配置,从而较好地解决多重系统的引导问题,如果系统不能自动完成这种配置,则可以通过手工修改配置文件/etc/lilo.conf来实现不同条件下的引导。 1.当系统能自动完成配置时 对于这种情况只有一个建议:将LILO安装到Linux分区的根上,而不是MBR这个多事地带。假设当前hda1中装有DOS/Windows,hda2中安装了Linux,则/etc/lilo.conf的内容大致如下:
2. 当系统无法自动完成配置时 系统无法自动完成配置的情况不外乎两种: (1) BIOS不能直接看到Linux的根分区; (2) BIOS只能读写标准IDE硬盘的前504MB。 这时,必须遵循一个最基本的原则:建立一个BIOS能存取的较小的Linux分区,其中包含内核文件、映射文件及链加载程序等必要内容,而根则可以是另外一个独立的分区。至于配置上的其他细节,我们通过以下实例来进行说明。 第四部分 lilo.conf配置实例 有了这些基础知识,我们可以很容易地按照自己的意图配置LILO。 例一.lilo.conf文件
这个例子中,LILO是作为主引导管理器来管理机器上所有操作系统的。LILO也可作为二级引导管理器,这只要将“boot”参数改为 根分区就可做到。例如: boot=/dev/hda1 以这种方式使用LILO时,Linux根分区必须用DOS或Linux的fdisk程序将其设置为活动分区,并且这种方式只对硬盘主分区(不是扩展或逻辑 分区)有效。 例二.一个标准的IDE大硬盘需安装Linux和DOS/Windows。 对于大硬盘问题,很多人只知道低于1024个柱面的限制,而不知为什么标准的IDE硬盘只能认前504MB。其实,BIOS的 int13调用是采用三个位元组的CHS编码,10位为柱面号,8位为磁头号,6位为扇区号。可能的柱面号码是0~1023,可能的磁头号码是 0~255,而磁道上可能的扇区号码是1~63,以这24位最多可以定址8455716864个位元组(7.875GB)。但不幸的是,标准的IDE介面 容许256个扇区/磁道、65536个柱面及16个磁头。它自己本身可以存取237= 137438953472(128 GB),但是加上BIOS方面63个扇区与1024个柱面的限制后只剩528482304(504MB)可以定址得到。 对策:在硬盘的前500MB中划分350MB(/dev/hda1)给DOS,150MB(/dev/hda2)给Linux,在相应的配置文件中应说明硬盘的参数。
例三.如果你有一块超过 8 G 的大硬盘, 并且需要把 Linux 安装在比较靠后的位置,可以在安装的时候, 选择 linear 模式, 并且给它加上硬盘参数. 安装时候的硬盘参数可以这样写: hd?=CYLs, HEADs, SECs 其中的大写字母需要用实际的硬盘参数来替换, 这些参数可以从硬盘的标签上查到, 也可以看看 BIOS 设置里硬盘参数对应 LBA 模式的那一行. 问号是根据硬盘确定的, 实际使用时, 它可以是 a, b, c, d 四个字母中的一个. 比如: hda=1869,63,255 这是 IBM 15.2G 硬盘的参数. 当然进入了 Linux 以后, 可以通过编辑 /etc/lilo.conf 加上这个文件, 然后运行一遍 lilo 达到同样的目的. 下面是本人未加参数前的 lilo.conf的内容:
按照 linear 方式加入参数以后是如下格式:
当再次起动 Linux系统的时候, LILO 就按照线性模式对系统进行引导.除了在硬盘上寻址定位的方式不同以外, 对其他方面没有什么影响. 第三章内核编译的应用 第一节嵌入式Linux技术 第二节你的Linux有多大?(及实践结果) 这可不是我写的,只是用来参考制造small kernel,效果还可以。 最小的 Linux kernel 我使用的是 Mandrake 内核的 2.2.15,我没有修改任何一行程序码,完全只靠修改组态档得到这些数据。 首先,使用 make xconfig 把所有可以拿掉的选项都拿得。 不要 floppy 不要 SMP,MTRR 不要 networking,SCSI 把所有的 block device 移除,只留下 old IDE device 把所有的 character device 移除 把所有的 filesystem 移除,只留下 minix 不要 sound 支援 相信我,我己经把所有的选项都移除了。这样做之后,我得到了一个 188K 的核心。不过这个核心恐怕很难发挥 Linux 的功能,因此我决定把网络加回去。把 General中的 network support 加回去,重新编译,核心变成 189 K。10K 换个 TCP/IP stack,似乎是很上算的生意。 不过有 stack 没有 driver 也是惘然,所以我把 embedded board 常用的RTL8139 的 driver 加回去,195K。如果你需要 DOS 档案系统,那大小成为 213K。如果 minix 用 ext2 换代,则大小成长至 222K。 不过大家要注意,那里的大小指的是核心档的大小。那和所需要的随取记忆体是二回事。这个数字代表的意义是你需要多小的 ROM 来存放你的核心。 Linux 所需的记忆体大约在 600~800 K 之间。1MB 可能可以开机了,但可能不太有用。因为可能连载入 C 程序库都有困难。2MB 应该就可以做点事了,但可能要到4MB 以上才可以执行一个比较完整的系统。 看到这里,是不是觉得 Linux 真的有点大。好吧! 那我们就来看看谁占用了这些空间,下面这个列表是从 222K 这个核心做出来的。
结果如下 :
先说明一下,这里的大小和最终的大小有点差别,但大致还是可以做个参考。这边显示 730K 实际上大约在 600K 左右。很显然的,filesystem 相当的大。大约在 230K 左右,占了 1/3 的体积。记忆体管理占了80K,和核心其它部份的总合差不多。TCP/IP stack 占了 65K,驱动程序占了 120K。SysV IPC 占了 21K,必要的话可以拿掉,核心档应该可以再小个 10K 左右。 所以如果要减核心大小,应该动那里呢? 答案应该很明显,当然是档案系统。Linux 的 VFS 减化了档案系统的设计,buffer cache, directory cache 增加了系统的效率。但这些对整个系统都在flash 上的 embedded 系统而言根本就用处不大。如果可以把它们对拿掉,核心可以马上缩小 20K 左右。如果跳过整个 VFS,直接将档案系统写成一个 driver 的型式,应该可以将 230K 缩减至 50K左右。整个核心缩到 100K 左右。 从上面的数据来看,ucLinux 所减小的 mm 部份反到省的不多,主要是 mm 除了 virtual memory 之外,也要处理 memory allocation 的部份,这部份是省不得的。如果二者齐做,则 100K 以下的 Linux 核心不是不可能的事。 实践:成功编译196k的核心,但不能用来启动redhat,它太庞大了。280k可以启动,正在向更小努力。 结束语 论文终于写完了,有必要回顾一下我的毕业设计过程。 对于一个非计算机专业的学生来说,这个课题更具有挑战性。在Linux大行其道的今天,系统及网管方面的资料随处可见,但内核资料匮 乏,让人不知所措。开始只要是Linux的书籍就看,一个月后觉得视野大开,逐渐明确了方向。搜集翻译资料成了重要内容,有时通宵在网上找资料,再在系统 上不断检验。论文核心------编译流程开始就得到老师指导,配置内核21大项数百个知识点可以说是一条一条积累起来的,让我很有成就感。 论文除了详细叙述怎么做,也说明了原因,甚至还有附录。我在突出重点的同时,又联系了我课题以外的内容------嵌入式Linux操 作系统,因为我知道我的课题是综合课题-----设计具有嵌入式操作系统的器件(理论)------的前期工作。论文集网络文章之大成,内容丰富,希望能 为继续深入研究Linux操作系统的同仁有所帮助。 参考文献 【1】Kernel-HOWTO 【2】Documentation 【3】Configure.help 【4】kernel-2.2.16-i686-smp.config 【5】Lilo.conf 手册文档中的 USER.TEX (thank ZEO) 【6】Linux 核心安装 by David A. Bandel 【7】嵌入式Linux技术 ---Traveller 【8】嵌入式系统以及如何构造一个嵌入式系统概览 JoelR.Williams 【9】relevant READMEs and HOWTOs in the help text 【10】 【11】中国Linux论坛 < 【12】 【13】清华大学大学bbs.net.tsinghua.edu.cn 【14】交通大学思源学 【15】西电科大BBS |