Linux 内核 版本 2.0.xx
以下是linux2.0版本的发布说明。请仔细的阅读,你将会知道如何安装内核以及如果出现错误如何解决的全部内容。
Linux 是从何而来?
Linux是Linus Torvalds本人偶然通过互联网在自由组合的骇客团队的帮助之下写的Unix的同系版本。它的目标是遵循 POSIX(Portable Operating System Interface for Computer Environment——计算机环境的可移植操作系统界面)标准。
Linux具有你所期望的在一台现代的完全整合Unix的机器上的所有功能。其中包括:真正的多任务(执行),虚拟内存,共享库,按需装载(内核),共享‘拷贝-写’的可执行性,独特的内存管理以TCP/IP协议下的网络协作。
Linux是被分配给GNU普通公众许可证发行的。要得到更多细节信息请参考附加拷贝文档。
运行于何种硬件之上?
Linux首先是在基于386/486体系结构发展起来的。近些日子Linux也同样能够运行于DEC Alphas, SUN Sparcs, M68000 machines (类似 Atari and Amiga), MIPS and PowerPC之上。
文档资料:
在互联网上有大量的能够得到的电子形式的关于Linux特定的文档资料和关于Unix问题的附属文档资料,并且从书本中也能获得。我个人建议去查询任意Linux ftp站点下的关于LDP(Linux Documentation Project)书籍的文档目录。这篇README并不代表真正的文档资料也是如此:在那里有更好的可以参考的资源。
在LDP中有各种各样的内核文档的readme文件/子文档目录:这些东西很有代表性地包含了特定的关于内核安装的说明文件例,如驱动程序等。参考./Documentation/00-INDEX作为每一文件中所包含的需要做的列表。
内核安装:
如果你要安装全部源代码,请按照以下步骤进行:
cd /usr/src
gzip -cd linux-2.0.XX.tar.gz | tar xfv –
将全部源文件解压至适当位置。用内核的最新版本号替换“XX”。
你也可以使用增补方式更新不同的2.0.XX内核版本。每一份增补程序仅包含了针对已经发布的2.0.xx版本bug的补丁。并不会有新的功能添加至Linux内核,除非2.1.xx版本开始进行正式开发。想要通过增补方式安装,首先要获得全部的最新增补文件然后进行操作:
cd /usr/src
gzip -cd patchXX.gz | patch -p0
(重复 xx 全部比你当前所拥有的源码树版本值大的)最后你应该就已经ok了。你也可能想要删除备份的文件,请确定全部成功安装了补丁程序。但是如果有安装失败的补丁程序那么一定有什么错误发生了。
你也可以选择脚本程序方式的内核补丁安装,则安装过程就会自动地进行。这种方式由当前内核的版本以及所提供的任意补丁程序所决定。
cd /usr/src
linux/scripts/patch-kernel
内核源代码的默认目录是/usr/src/linux,但是可以被作为第一个参数而指定。补丁程序从当先目录提供,但是可以指定所选择的目录而作为第二个指定的参数。
请确认你的/usr/include/asm, /usr/include/linux和/usr/include/scsi目录已经链接到内核源代码:
cd /usr/include
rm -rf asm linux scsi
ln -s /usr/src/linux/include/asm-i386 asm
ln -s /usr/src/linux/include/linux linux
ln -s /usr/src/linux/include/scsi scsi
确认一下已经不存在陈旧的.o文件和互相依赖关系:
cd /usr/src/linux
make mrproper
现在你应该已经正确配置完安装了。
配置内核:
运行“make config”命令形成基本的内核。“make config”命令需要在bash下工作:它会在$PATH变量中搜索bash,是否有/bin/bash 和/bin/sh,所以希望它们中的某一个已经正确被配置。
另外可选择的构造命令有:
“make menuconfig” 基于彩色菜单、选择列表和对话框的文本配置工具。
“make xconfig” X界面下的配置构造工具。
NOTES on "make config":
- having unnecessary drivers will make the kernel bigger, and can
under some circumstances lead to problems: probing for a
nonexistent controller card may confuse your other controllers
- compiling the kernel with "Processor type" set higher than 386
will result in a kernel that does NOT work on a 386. The
kernel will detect this on bootup, and give up.
- A kernel with math-emulation compiled in will still use the
coprocessor if one is present: the math emulation will just
never get used in that case. The kernel will be slightly larger,
but will work on different machines regardless of whether they
have a math coprocessor or not.
- the "kernel hacking" configuration details usually result in a
bigger or slower kernel (or both), and can even make the kernel
less stable by configuring some routines to actively try to
break bad code to find kernel problems (kmalloc()). Thus you
should probably answer 'n' to the questions for a "production"
kernel.
为进一步的位置依赖配置检查一下顶级的Makefile。
最后,运行命令“make dep”正确地建立所有的依赖关系。
内核编译:
确认拥有gcc-2.6.3或者更高的版本。经验显示使用更低版本的gcc会在编译更新linux内核时产生一些问题。如果你更新了编译器同时请记住也要确保得到了新的二进制实用工具包。
使用命令“make zImage”产生压缩的内核镜象文件。如果你想要制作一张引导盘的话(不带有引导文件系统或lilo),插入软盘,运行命令“make zdisk”。如果你用lilo安装到了适当的内核makefiles,也可以运行命令“make zlilo”,但是在做此之前最好首先检查你专门的lilo安装程序。
如果你的内核过于庞大可以使用“make bzImage”命令代替“make zImage”。
如果你已经以“modules”配置了内核任意的一个部分,你接下来要做的是依次运行“make modules”和“make modules-install”命令。可以阅读Documentation/modules.txt
以获得更多相关信息。比如,在其中有关于如何使用modules的解释。
制作内核的一份备份,以便在发生错误时候使用。对于开发版本这样做具有相当意义,因为每一新版本中的代码都没有被测试过。
想要启动你的新内核,你还需要拷贝一份内核镜象文件(在编译之后可以在/usr/src/linux/arch/i386/boot/zImage找到)到内核可以找到的正常引导内核的地方。对于某些情况,这个存放在软盘上,这种情况下可以使用命令"cp /usr/src/linux/arch/i386/boot/zImage /dev/fd0" 去制作一份引导软盘。注意,对于Linux内核2.0.0,内核会占用720k双面3.5英寸软盘。对于这种情况,强列建议你安装LILO在你的双面存储的启动软盘或者更大容量的软驱。如果你使用硬盘作为引导Linux,/etc/lilo.conf文件记录了你所使用的LILO所引导的专门内核镜象。内核镜象文件通常可能是/vmlinuz, 或 /zImage, 或 /etc/zImage。为了使用新内核,复制新的镜象覆盖掉原先的(为原先的镜象做一备份)。重安装LILO是通常情况下启动/sbin/lilo的方法。你还可以编辑/etc/lilo.conf引导你的原先内核镜象(如, /vmlinux.old),这样新的内核就不会工作了。请查阅LILO文档获得更多信息。
重新更新了LILO之后,你应该做的都已结束。关闭系统,重新启动然后体验新内核。
如果你需要改变内核中默认的引导设备,视频模式,随机盘的大小等,使用'rdev'编程(也可以在启动时选择LILO引导选项)。不需要改变这些参数也不需要重新编译内核。重新启动机器后体验一下新内核吧。
如果有错误发生:
如果你直接去查看内核的臭虫有困难,请查阅MAINTAINERS文件确认是否已经有人整理、解决过了跟你所遇到的臭虫一样的情况。如果列表中不存在相关方面,另外非常好的途径是直接写信把情况告诉我(Linus.Torvalds@Helsinki.FI)和有可能关联的邮件列表或者是新闻组都可以。由于我不可能一一测试那些具体的个人SCSI 和 NETworking,因此邮件列表的方式对解决特定的关于SCSI 和 NETworking问题相当管用。
请在所有的臭虫报告中详细告知内核版本,如何可以重现错误,以及你是如何安装(根据你自身的体验)。如果问题是最近的也要告知我,如果是很久以前的问题,请尝试告诉我第一次发生的时间。如果臭虫列表显示信息以如下格式所示:
unable to handle kernel paging request at address C0000010
Oops: 0002
EIP: 0010:XXXXXXXX
eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx
esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx
ds: xxxx es: xxxx fs: xxxx gs: xxxx
Pid: xx, process nr: xx
xx xx xx xx xx xx xx xx xx xx
或者屏幕上显示类似的内核调试信息或者记录在的系统日志之中,请呈现给我准确的信息。输出内容对你可能是完全不理解其中的内容,但是其中包含了可以帮助调试错误的信息。内容还显示了一些重要东西:它能告诉为什么内核会出现这些代码(上面的例子中说内核产生了错误的指针)。更多可以解释代码的含义的内容存在于Documentation/oops-tracing.txt。
你可以使用“ksymoops”程序解决出现的问题。在scripts/目录之下手工寻找C++源代码防止再出现类似的提示代码:在如上给出的调试信息提示中,可以极大的帮助你查找EIP值所表示的含义。十六进制的值如上所示是不会对我或者其他任何人有多大帮助:因为它依靠你的特定的内核安装过程。你应该做的是从EIP行(忽略“0010:”)找到十六进制代表的具体含义,然后在内核名字列表中寻找内核函数所代表的绝对内存中的物理地址。
为了能查询到内核具体函数名,你需要结合内核显示出来的征兆查找系统二进制内容。这个文件就是'linux/vmlinux'。尽量在名字列表中进行匹配失败中EIP的具体内容,按照如下方式:
nm vmlinux | sort | less
提供给你的是一份按照升序排列的内核具体地址的列表文件,通过它的内容何以简易的查处函数所包含的具体物理内存地址。注意内核提供的调试信息中的地址并不一定完全匹配函数的地址(事实上,只是有很大不同),所以你不能使用“grep”命令在列表中查询:虽然列表提供的给你的是每一个内核函数的起始点,但是使用查询到的函数起始地址会低于真正想要查找的,因为对应的地址会更高些。事实上,有一个比较不错的主意,那就是在你的问题报告中包含一些具体“内容”,同时给出感兴趣的问题附近的相关行的提示信息。
如果因为某些原因你不能按照上述内容完成(可能因为你得到的是预先编译的内核镜象文件或者其他类似的),有可能的话请尽量告诉我关于你的具体安装的信息,这样做会有很大帮助。另外,你也可以在运行级别上使用gdb。(只读;比如你不能改变变量值或者设置断点。)可以这样做,首先使用-g参数编译内核;正确编辑arch/i386/Makefile,然后运行命令“make clean”。你也需要编辑CONFIG_PROC_FS文件(通过 “make config”)。
在你重新以新内核启动之后,运行“gdb vmlinux /proc/kcore”。现在你就可以使用所有的所有一般的gdb命令。这个命令可以查找系统溃败时打印的例如"l *0xXXXXXXXX"信息的断点。(用EIP的具体值替代有xx的位置。)因为错误地gdb过程不理会在编译之后出现地开始地址,所以当前运行于级别外内核的gdb过程会导致失败。