写在前面的话:刚毕业,找的工作是嵌入式开发,在学校自学了几年Windows平台下的C/C++开发,可现在工作是在Linux平台下,所以一切都要从头开始(当然语言基础还是有用的)。从操作系统应用开始学,再到开发,经过几个月的学习,现在基本能胜任工作。在这个几个月之中,自己感觉大学里面荒废了太多时间。在学校时,总是认为学的东西没用(我想大概现在很多在校的学生还是这么认为吧),到现在才感觉自己基本功不够扎实。所以,决定好好研究一下linux内核,一方面是为了对操作系统有更深层次的理解,另一方面在研究内核的同时,学习linux底层编程。我用的教材是 浙江大学出版社《Linux内核情景分析》上下册还有就是现在看的这本。希望有相同兴趣的朋友多多交流。
第一章 了解Linux内核
这一章是对Linux内核的总体概括,我把我学会以及自己在实践过程中的理解并且觉得比较容易用的到东西分别叙述如下:
一、重新编译内核
1. 首先要确认你系统里面是否有linux的源代码,在Linux安装的时候有选项是否安装源代码。如果你在安装时没有选,不用担心,你可以到www.kernel.org/pub/linux/kernel去下载你的系统对应的内核源代码。
2. 下载以后当然是将源代码包解压到你所要放的目录下,书上用的是下面两个命令:
#mv linux-2.4…. your directory
#tar zxvf linux-2.4…
3.配置内核
配置内核的过程可以分为以下几步:
a. 清除目录下所有配置文件和先前生成核心时产生的中间文件,在你的源代码目录执行如下命令:
#make mrproper
注意:Kernel HOWTO对上面这个命令是这样解释的:
`make mrproper' 将会做更广泛的 `清除' 工作.这个动作有时候是必须的,所以你可能会希望在每次修补的时候执行它. `make mrproper' 还会将你的配置文件杀掉,所以如果你认为它重要的话应该先做一备份(在 .config).
b.对内核进行配置,有以下几种方法可供选择:
#make config(基于文本的传统界面)
#make menuconfig(基于文本的选单式配置界面,书中推荐的方式)
#make xconfig(基于图形的配置界面)
#make oldconfig(用于在原来配置的基础上作些小的修改)
注:我在我的机器上(redhat 9)执行make oldconfig这个命令的时候,系统根本没有让我配置内核,而是自动执行了配置,那我要怎么样用这个命令来配置内核呢,希望知道的朋友可以告诉我。在Kernel Howto中对这个命令的解释是:
make oldconfig' 会尝试由一旧的配置文件来配置你的核心.它会为你执行 `make config'。如果你还未曾编译过核心或没有旧的配置文件,那么你可能不该做这个,因为你几乎确定会更改缺省的配置。
c. 对每一个配置项,用户有三种选择:
“Y”——将该功能编译进内核;
“N”——不将该功能编译进内核;
“M”——将该功能编译成可以在需要时动态插入到内核中的模块。
d.编译内核和模块
接下来需要运行下面两条命令:
#make dep(对内核源代码文件的依赖性和完整性进行检验,确保关键文件在正确的位置)
#make clean(清除目标文件,自己写过makefile或通过源码包装过软件的,这个命令应该很熟悉了)
下面的命令将编译产生压缩形式的内核文件:
#make zImage 或 #make bzImage(压缩率更高)
编译后产生的内核文件的位置在:/usr/src/linux/arch/i386/boot目录下(假定你CPU的是Intel X86,内核源代码所在的目录为/usr/src/linux)
如果选择了可加载模块,编译完内核后需编译选择的模块:
#make modules
或用下面的命令编译模块并安装到标准的模块目录中:
#make modules_install
模块在系统中的标准目录位于/lib/modules/x.y.z,后面的x.y.z是版本号,为了安全起见在运行这个命令之前最好对/lib/modules进行备份(#lsmod 可以了解当前内核中已经装载了哪些内核)。
e. 配置启动文件
执行以下命令
#cp /usr/src/linux/arch/i386/boot/zImage /boot/zImage-2.4.18
#cp /usr/src/linux/System.map /boot/System.man-2.4.18
#ln –sf /boot/System.map-2.4.18 /boot/System.map (相当于Windows中创建一个快捷方式)
如果你是使用lilo启动Linux,请修改/etc/lilo.conf来加载新内核;
如果你是使用grub启动Linux,请修改/etc/grub.conf来加载新内核,具体的修改请参照这个两个文件的中的例子。
现在,你可以试试按照上面的方法,根据你的需求,编译内核啦。这就是Linux比Windows爽的地方——你可以很清楚的知道操作系统在干什么。