从头编译linux内核2.6

1下载

https://www.kernel.org/

进入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文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值