年纪大了,记性不好,这篇文档作为自学笔记,也算是积累,给自己一个交待。
Linux内核编译的大致流程如下:
一、获取内核代码:编译内核代码之前一定要获取到内核代码,到http://www./下载
查询当前系统的版本号的命令:uname
切换到root用户: su
二、配置内核:内核代码包括有很多功能,通过配置文件,选择编译选项,实现定制内核的目的。
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、编译内核
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 的第一行决定:
|
|
来自: adkada > 《Linux自学笔记》