交叉编译内核

Posted

技术标签:

【中文标题】交叉编译内核【英文标题】:Cross Compile the Kernel 【发布时间】:2017-08-11 05:34:07 【问题描述】:

我正在尝试实现与此类似的目标 https://github.com/volatilityfoundation/volatility/wiki/android#initialize-the-android-build-environment。 下面是我使用的环境:

Ubuntu 14.04、Android Studio 2.3、Android NDK r14、模拟器-api22。

我在步骤遇到了困难。 我的目标是金鱼内核 3.10 以下是我遵循的步骤。任何帮助将不胜感激。

方法一

export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=~/android-ndk/android-ndk-r14/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-

教程建议我们必须运行下一个命令

make goldfish_armv7_defconfig

但是当我检查目录“android-source/arch/arm/configs/”时,那里没有这样的配置文件。一些教程建议我们可以从内核 2.6 复制和粘贴文件,所以我做了同样的事情,然后添加

CONFIG_MODULES=y
CONFIG_MODULES_UNLOAD=y
CONFIG_MODULES_FORCE_UNLOAD=y

还有

$ make

导致错误:

arch/arm/mm/mmu.c: In function 'build_mem_type_table':
arch/arm/mm/mmu.c:470:18: error: 'L_PTE_MT_VECTORS' undeclared (first use in this function)
   vecs_pgprot |= L_PTE_MT_VECTORS;
                  ^
arch/arm/mm/mmu.c:470:18: note: each undeclared identifier is reported only once for each function it appears in
arch/arm/mm/mmu.c: At top level:
arch/arm/mm/mmu.c:637:23: warning: 'early_pte_alloc_and_install' defined but not used [-Wunused-function]
 static pte_t * __init early_pte_alloc_and_install(pmd_t *pmd,
                       ^
make[1]: *** [arch/arm/mm/mmu.o] Error 1
make: *** [arch/arm/mm] Error

方法2

一切都和方法1一样,我只是改变了单个变量

export ARCH=arm64

然后运行

make ranchu_deconfig

但我遇到了同样的错误。

方法3

$ export ARCH=arm
$ export SUBARCH=arm
$ export CROSS_COMPILE=~/android-ndk/android-ndk-r14/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
$ make ranchu_defconfig
$ vim .config # added this to .config file

CONFIG_MODULES=y
CONFIG_MODULES_UNLOAD=y
CONFIG_MODULES_FORCE_UNLOAD=y

$ make

此命令运行成功:zImage found。

但是当我使用以下命令运行模拟器时

root@ubuntu:~/Android/Sdk/tools# ./emulator -avd Nexus5x22 -kernel ~/android-source2/android-source/arch/arm/boot/zImage -show-kernel –verbose

我收到“Linux kernel too old to run ram disk”的错误: ram disk error

【问题讨论】:

确保您的CROSS_COMPILE=arm-linux-androideabi- 和您的PATH 包含$HOME/android-ndk/android-ndk-r14/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin。 (这只是第一步) 【参考方案1】:

Google 的 Android 内核出现问题。他们在反向移植此 patch 时忘记定义 L_PTE_MT_VECTORS

解决方案是添加here。

【讨论】:

以上是关于交叉编译内核的主要内容,如果未能解决你的问题,请参考以下文章

怎么查看Linux下系统的内核,交叉编译,文件系统的版本?

加载交叉编译的内核模块时出错

Android 内核编译过程记录

树莓派3B交叉编译64位内核

ubuntu 交叉编译arm linux 内核小例子

内核编译(准备工作)