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.rpm3、清除以前编译内核时留下的东西 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 bzImage3、编译模块 这个时间比较长,我用了大概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、重起机器,观看启动菜单,多了一项,说明成功!
七、致谢
在学习编译内核的过程中得到了水晶剑锋、刀子、苯熊、小二等饼子堂朋友的指点和帮助
,在此谢过。