首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

在x86_32环境下编译x86_64linux内核

在x86_32环境下编译x86_64linux内核

开始之前,先简单唠叨两句。  编译并使用一个自定义的内核,若想得到官方的支持是非常困难的。然而你可以增加学习的经验,尽管如此,使用你自己编译的内核是不允许上报bug的。如果你这样做了,将会被官方无任何解释的拒绝。
  
  如果你是以下几种情况之一,那么你将有理由去编译自己的内核:
  • 你是一个内核开发者。
  • 你需要已经编译好的内核的一个特殊的方面,并且官方网站上有没有将其编译进内核(例如,需要开启一些试验阶段的特性)。
  • 你试图调试并去除官方网站上已提供内核上的bug。
  • 官方网站上提供的内核不支持你的硬件体系结构。
  相反,如果你是以下几种情况之一,那么你最好不要编译内核:
  • 你仅仅需要编译一个特殊的驱动。为了这样做,你仅仅需要安装linux-headers源码软件包即可。
  • 你不知道你在做什么,并且如果你损坏了一些东西,想试图寻求帮助来修复它。依据发生错误时你所作的操作,你可能需要重新安装你的系统才可以修复损伤。
  感谢您耐心地看到了这里,下面让我们一起进入正题。
  • 背景知识
   由于在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镜像文件为好。
返回列表