linux内核编译学习笔记
作者:laomai
主页:http://blog.csdn.net/laomai
一、实验环境
一台工控机,带有光驱。装有redhat linux es3操作系统。最小安装,
即在选择软件的时候什么都不选.
本文参考资料:
http://www.uplinux.com/www/sys/01/77.shtml
http://tristones.viaspeip.com/archives/000209.html
二、查看当前的系统配置
1、查看内核版本号
#uname -a
2、查看目前已装入的模块
#lsmod
3、安装编译时所需工具(gcc、make和ncurse)
cpp-3.2.3-20.i386.rpm
glibc-devel-2.3.2-95.3.i386.rpm
glibc-headers-2.3.2-95.3.i386.rpm
glibc-kernheaders-2.4-8.34.i386.rpm
gcc-3.2.3-20.i386.rpm
make-3.79.1-17.i386.rpm
ncurses-devel-5.3-9.3.i386.rpm
三、编译前准备
1、获得内核源代码。有几种方式
⑴我实验用的是as3第三张安装光盘的 kernel-source-2.4.21-4.EL.i386.rpm
⑵最新的内核版本到http://www.kernel.org/下载
2、安装内核代码
rpm -ivh kernel-source-2.4.21-4.EL.i386.rpm
3、清除以前编译内核时留下的东西
cd /usr/src/linux-2.4 #进入内核源码所在目录
make mrproper #进行清理
四、设置内核选项
执行 #make menuconfig
1、选项的配置办法
执行make menuconfig以后,会出现一个主菜单,用方向键选择菜单项,如果选择了某一个还有子菜单的项(以-->结尾),按回车键回进入下级子菜单.
选项的配置形式:
按Y,表示以build-in的方式包含,也就是把选项集成到内核里.
对应的图标为[*]或<*>,
按N,表示不包含。对应的图标为[ ]或< >
按M,表示以模块的形式包含,对应的图标为<M>. 注意不是所有的选项都可以用模块形式加载的
2、选项的状态图标
每个选项设完之后会显示一个状态图标,只能是下面5种之一
[*] - built-in表示这个选项被集成在内核里了
[ ] - excluded 表示这个选项被内核排除了
<M> - module 表示这个选项以模块的形式放在内核里,
用户用到这个选项的时候要执行insmod命令.
要注意不是所有的选项都可以以模块的形式加载的。
所以当你按了m键,图标仍然是[*]而不是<M>时,就要
明白这个选项只能要么集成在内核里,要么被内核排除。
< > - module capable,表示这个选项虽然被排除了,但
可以以模块的形式被重新加载,比如,一个图标为<M>的
选项,按N键以后状态就会变成< >.
<*> - 这个图标帮助没写,当实际上会出现,比如,按某个选项状态为<M>
或者< >时,按Y键,图标就会变成这个,意思和[*] 一样,把可以用模块
加载的选项变成build-in方式加载。
归纳一下就是: 括号里如果为空白,则该选项未被加载;
如果括号里是*,是以build-in的方式加载;
如果中间是m(此时只能是尖括号),就是以模块的形式动态加载.
3、选项的具体含义
每个具体选项的含义可以按H键得到帮助,本文的主要是讲清楚实验步骤,
所有选项均取默认值。
4、保存设置
设置完需要的选项后按ESC键退出menuconfig,此时会提示是否保存,选yes.
五、开始编译
1、设置关联文件
#make dep
2、编译内核(也就是编译build-in的东西),我的机器用了大概10分钟(奔4+512内存)
#make bzImage
3、编译模块 这个时间比较长,我用了大概1个小时
#make clean
#make modules
4、安装模块
#make modules_install
5、检查结果
#depmod –a
检查内核中有没有未解析的symbol,它是生成模块间的依赖关系,
这样启动新内核之后,使用modprobe命令加载模块时就能正确地定位模块。
假如输入这个命令后看不到没有任何返回信息的话,那说明编译过程已经成功了。
6、安装完整新内核
#make install
六、用新内核启动
1、检查/etc/lilo.conf文件
可以看到新编译的内核已经增加到启动菜单了。
2、执行 /sbin/lilo 使新的启动设置生效
3、重起机器,观看启动菜单,多了一项,说明成功!
七、致谢
在学习编译内核的过程中得到了水晶剑锋、刀子、苯熊、小二等饼子堂朋友的指点和帮助
,在此谢过。