交叉编译内核
交叉编译是指针对与正在执行编译的平台不同的其他平台生成二进制数据。例如,在x86_64环境下生成针对ARM的二进制数据的情形。这种编译器又称为“交叉编译器”。只要拥有交叉编译器,对Linux内核进行交叉编译就变得非常简单。这时还需要为make赋予两个变量,如表1-10所示。
举一个使用交叉编译器armv5tel-linux-gcc来交叉编译ARM内核的例子。在这种情况下,make命令变成如下所示的内容。
ARM内核的二进制映像较多使用的是uImage格式。第一行创建这个格式的二进制映像,第二行创建模块。
$make ARCH=arm CROSS_COMPILE=armv5tel-linux-uImage
$make ARCH=arm CROSS_COMPILE=armv5tel-linux-modules
创建的内核二进制映像作为源码树内的arch/arm/boot/uImage文件。
创建的内核和模块必须转移到对象机器上。如果在对象机器上可以使用源码包管理系统,则最简单的方法就是生成源码包并在对象机器上安装。然而,如果不能使用源码包管理系统,虽然内核映像转移起来很简单,但是模块就有一些问题。模块分散在源码树的各个目录下,想要手动查找这些模块并在/lib/modules下构建目录树,是不太现实的。
其实,通过modules_install安装模块的位置可以用变量INSTALL_MOD_PATH来指定。可以利用这一点,例如,当安装在主目录下时,可以用tar对每个目录进行整合,再转移到对象机器上。这一操作可以用下列命令来实现。
$make ARCH=arm CROSS_COMPILE=armv5tel-linux-INSTALL_MOD_PATH=~/armroot-2.6.38 modules_install
这样就会在主目录下生成一个标题为~/armroot-2.6.38/lib/modules的目录,模块就安装在这个目录下。
模块的目录下有标题为build和source的符号链接,这些都是指向编译过内核的源码树。如果在对象机器上完全不进行编译,就不需要进行修改,如有必要可以在对象机器上适当修改。