1下载
进入linux内核官网,里面有各种linux内核版本,虽然官网界面看起来很简陋,但不用怀疑,这就是内核官网,在里面找到自己想要的内核版本,下载即可。这里顺便给出make和gcc的下载链接,方便后面下载使用。http://ftp.gnu.org/gnu/
2编译
2.1解压
下载的都是内核压缩包,首先进行解压缩
tar -axvf linux-xxx
tar是解包命令,以上命令会自动选择解压类型(你也可以用j解压bzip2,用z解压gzip,用J解压xz,不过用一个a代替这些显然简单得多)。当然你也可以在图形界面中双击对应的压缩包图标来解压。
2.2生成.config文件
一般来说在进行生成之前先用make mrproper命令清除一些垃圾
make mrproper命令会比make clean命令清除的更干净一些。
首先我们要生成对应你后面编译选项的配置文件.config。有多种方式来生成.config文件,比如你可以通过输入命令
//菜单配置方式
make menuconfig
//或者普通的配置方式
make config
//或者配置图形界面的配置方式
make xconfig
make gconfig
如果你现在电脑上运行的是过去一些老版本的内核,那么使用make oldconfig将会将你本机上的.config作为你现在要编译的内核配置文件,一般情况下你的本机内核和你要编译的内核版本不同,那么你还需要修改少数配置。
但是对于现在较新的内核,如果当前内核的.config可用,就会默认使用他的.config,所以你一般不会用到这个命令。
对于想偷懒的人可以直接使用make defconfig命令生成一些默认或者说经典的配置。
2.3编译
make > /dev/null
使用该命令忽略一些无效信息。
现在的linux发行版一般说来都自带gcc和make,所以这里就不介绍关于这两者的下载。
高版本的gcc和make对于编译2.6这样的老内核来说确实有些不适应,表现在许多过去的功能现在已经无法使用。
总结一下常见的问题及解决办法
2.3.1老的makefile语法不支持
解决该问题的办法是修改对应的makefile,根据错误输出的提示信息来修改对应的文件。
例如某个makefile中有这样的代码
config %config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
在过去的makefile中这样的语法是可以通过的,即两个目标写在一起。
但现在我们只能将他修改,将两个目标分别写出。
config : scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
将出现该类问题的makefile统统修改。
2.3.2 gcc: error: elf_x86_64: No such file or directory
该问题是由于gcc不再支持-m elf_x86_64编译选项,所以找到arch/x86/vdso/Makefile文件,然后搜索elf_x86_64,将-m elf_x86_64修改为-m64
2.3.3.size expression for copy_user_generic_c does not evaluate to a constant
这是一个汇编文件的错误,出现这样的错误也确实让人觉得奇怪。
我们找到/arch/x86_64/lib/copy_user.s文件,然后搜索copy_user_generic_c,然后将其修改为copy_user_generic_string
2.3.4undefined reference to '__mutex_lock_slowpath'
该问题是的意思找不到原型,无法链接。我们打开/kernel/mutex.c文件,然后在其中修改对应的两个函数
static void noinline __sched
__mutex_lock_slowpath(atomic_t *lock_count);
static noinline void __sched __mutex_unlock_slowpath(atomic_t *lock_count);
我们在这两个函数的static后面加入一个__used gcc选项.
一般来说解决这些问题即可实现编译,将在目录下面生成一个vmlinux文件。