分享

更多

   

Linux内核编译

2012-09-11  adkada
年纪大了,记性不好,这篇文档作为自学笔记,也算是积累,给自己一个交待。
 
Linux内核编译的大致流程如下:
 
一、获取内核代码:编译内核代码之前一定要获取到内核代码,到http://www.kernel.org/下载
查询当前系统的版本号的命令:uname
切换到root用户: su
 
二、配置内核:内核代码包括有很多功能,通过配置文件,选择编译选项,实现定制内核的目的。
 
1、内核的几种配置方式
1. 如果.config不存在,运行make config/menuconfig时,编译器找到每个子目录下的Kconfig文件,并使用其中的缺省值生成.config文件。
2. 如果.config存在,运行make config/menuconfig时的缺省设置即是当前.config的设置,若对设置进行了修改,.config将被更新。
3. arch/xxx/defconfig是一个缺省的配置文件,make defconfig时会根据这个文件生成当前的.config。
4. arch/xxx/configs文件夹中有许多命名为xxx_defconfig的配置文件,如果运行make xxx_defconfig,当前.config文件会由xxx_defconfig文件生成。
5. make oldconfig的作用和make config类似,但是它的作用是在现有的内核设置文件基础上建立一个新的设置文件,只会向用户提供有关新内核特性的问题,在新内核升级的过程 中,make oldconfig非常有用,用户将旧的配置文件.config复制到新内核的源码中,执行make oldconfig,旧的配置文件.config会被备份,同时用户只需要回答那些针对新增特性的问题。
 一般,就用make menuconfig。
 
2、内核编译选项
编译选项数量众多,详细请参考《Linux内核配置参考》,反正我是直接使用默认生成的.config就可以了。不过以下建议将避免您最终得出一个不能工作的内核:
  1. 除非您使用初始化 ramdisk (initrd),否则绝不要把挂载根文件系统必需的驱动程序(硬件驱动以及文件系统驱动)编译成模块!而如果您确实使用初始化 ramdisk,请为 ext2FS 支持选项选择 Y,因为 ramdisk 使用该文件系统。您还需要 initrd 支持。

  2. 如果您系统中有网卡,将它们的驱动编译成模块。这样,您就能够在 /etc/modules.conf 中用别名定义哪一块网卡第一,哪一块第二,等等。如果您将驱动程序编译进了内核,它们加载的顺序将取决于当初它们链接进内核的顺序,而这不一定是您想要的。

  3. 最后,如果您不清楚某个选项的含义,请阅读其帮助!而如果该帮助信息依然不能解决您的困惑,请保留该选项原来的样子。(在 configoldconfig 中可以按 ? 键访问帮助。)

配置最终结束后,请保存您的配置并退出。

三、编译内核
1、编译内核
make或make bzImage
编译好的内核文件名是bzImage,生成的文件放在arch/<cpu>/boot/目录下面。
 
2、编译内核模块
make moudles
 
3、安装内核模块
 make moudles_install
所谓安装,就是将编译好的内核模块从内核源代码目录copy到lib/modules/目录下,并根据被编译内核的版本号生成一个新的子目录。我们在做实验的时候,为了安全起见,最好备份好modules目录。
 
四、制作Ramdisk
首先要了解内核与ramdisk的关系:
Linux系统在启动的过程中,需要mount根文件系统,此时除非将根文件系统涉及的所有模块全部(各种文件系统、各种块设备驱动、IDE、SATA)编译到内核文件,否则内核无法完成根文件系统的mount操作,但是如果都编译的话,内核就太大了,所以一般来说驱动/模块都驻留在根文件系统本身上/lib/modules/xxx,那么问题就来了,现在要mount根文件系统却需要根文件系统上的模块文件,怎么办?于是,就想出ramdisk,内核总是能安装ramdisk的(注:这是因为ramdisk和内核一样都是一个内存文件,也是由bootloader通过低级读写命令(如uboot用nand read,而不用通过文件系统层提供的高级读写接口)加载进内存,因此内核可以挂载内存里ramdisk文件系统),然后把所有可能需要的驱动/模块都放在ramdisk上,首先,让内核将ramdisk当作根文件系统来安装,然后再用这个根文件系统上的驱动来安装真正的根文件系统,就将这个矛盾问题解决了。
 
1、重新制作内核映像
mkinitrd initrd-2.6.29  2.6.29
其中 2.6.29为/lib/modules下的目录名称
 
将内核文件bzImage和镜像文件initrd-2.6.29一起拷贝到/boot/目录下,并将内核改名为vmlinuz-2.6.29。
修改/etc/grub.conf文件
 
title MyZinux (2.6.29)
    root (hd0,0)
    kernel /vmlinuz-2.6.29 ro root=UUID=e7ff8cb4-6560-4c5e-99f3-9314e10ed40d rhgb quiet
    initrd /initrd-2.6.29
 
 
【相关知识】makefile文件:
内核版本号由 Makefile 的第一行决定:

$ head -4 Makefile
VERSION = 2
PATCHLEVEL = 6
SUBLEVEL = 8
EXTRAVERSION = -1mdkcustom

Makefile 后面,您会发现内核版本号的组成是:

KERNELRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)

所以我们可以自定义内核的版本号。做的就是更改这些域之一以定义您自己的版本号。一般只改变 EXTRAVERSION。例如您将其改为 -foo。新内核版本就会是 2.6.29-foo。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢

    0条评论

    发表

    类似文章 更多
    喜欢该文的人也喜欢 更多