Board logo

标题: 在x86_32环境下编译x86_64linux内核 [打印本页]

作者: 苹果也疯狂    时间: 2015-6-30 21:18     标题: 在x86_32环境下编译x86_64linux内核

开始之前,先简单唠叨两句。  编译并使用一个自定义的内核,若想得到官方的支持是非常困难的。然而你可以增加学习的经验,尽管如此,使用你自己编译的内核是不允许上报bug的。如果你这样做了,将会被官方无任何解释的拒绝。
  
  如果你是以下几种情况之一,那么你将有理由去编译自己的内核:
  相反,如果你是以下几种情况之一,那么你最好不要编译内核:
  感谢您耐心地看到了这里,下面让我们一起进入正题。
   由于在32位机器上编译生成64位内核镜像文件,所以需要交叉编译环境。可以通过crosstool脚本工具自

动化配置。下载该工具可以通过点击下面的连接

http://www.kegel.com/crosstool/#download
        
下载后,在使用该工具时,最好先看看使用说明。http://www.kegel.com/crosstool/crosstool-0.43/doc/crosstool-howto.html

这将会使你节省大量的时间,转而去做更多的工作^_^

                                                               
小提示:在使用crosstool工具时,需要创建数个目录,当然也可以自定义设置,但是如果你选择在/opt/目录或是其他具有root权限的目录中创建的话,那么这时为了减少对后续工作的不必要的麻烦,建议你可以使用如下命令设置一下上述目录的使用权限:
chown -R .
user为你当前用户的名称


   2. 编译内核
                                                                                               
   不管是交叉编译还是其他方式的编译,内核编译过程大体上可以分为以下几步(但这里主要讲解交叉编译,其余情况直接将make命令行编译选项去掉即可):

   第一步:产生配置文件和Makefile
         这里的配置文件是.config。可以通过命令:

make ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu- oldconfig/muneconfig

产生。在该命令执行过程中,需要用户参与内核参数的配置。这些配置最终将会决定你的内核所具有的特性。命令执行完成后,配置文件.config和规则文件Makefile将会被生成。

   第二步:编译并生成压缩内核镜像文件bzImage(该文件名也由.config文件来决定)

执行如下命令即可。

make ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu-

小提示:有些文章可能会建议你,在使用make编译内核时可以利用多核参数选项(-j2),可以加快编译速度。但这里根据我的编译经验来告诉你,最好不要使用该选项。因为目前阶段多核协同工作技术还不成熟,在编译时总是会出现编译不完全致使新内核无法正常引导的情况。

   第三步:编译内核模块(modules)
   
在.config文件生成过程中,你会看到很多'm'的配置选项。这些选项就是在这里起作用的。它来告诉编译器哪些部分以内核模块的方式进行组织。好了,下面就是目标模块的生成命令:

make ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu- modules

   第四步:安装内核模块

可以通过下面的命令,将第三步中生成的模块安装到modules/目录中。


make ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu- modules_install

   第五步:生成内核镜像文件

该镜像是系统在boot时使用的文件。可以通过下面的命令生成:

mkinitramfs ARCH=x86_64 CROSS_COMPILE=X86_64-linux-gnu- -o initrd.img-<your kernel version> <your kernel version>

   3. 配置新内核的启动引导环境

    对于刚编译生成的内核,若想让它成功引导系统需要完成下面的工作:


cp initrd.img-<your kernel version> /boot/
cp arch/x86_64/boot/bzImage /boot/vmlinuz-<your linux version>
cp
System.map /boot/System.map-<your linux version>

     最后,生成启动项配置文件

update-grub

OK! 到这里我们就可以


reboot

系统了。正常情况下,新内核会被顺利的加载并执行。但是如果编译内核时,你的配置不正确,或是使用的编译器过低,或是被链接入镜像文件的资源版本过低,就会出现引导失败的情况。这是你就要好好检查编译环境和配置文件了,然后重新进行2中的操作,修正new kernel中的bug.

提示:cross compile是非常困难的一件事情,除非你非常有兴趣或是有大量的时间,否则建议你还是去官方网站上下载64Bit镜像文件为好。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0