Loading... > 编译 Android 内核源代码并添加自定义内核模块。 > 采用的手机是 nexus 6p ,代号(codename)为angler,手机自带Linux 内核版本为3.10.73, Android 系统版本为 6.0.1。 # 下载编译内核 msm 内核项目是 Google 针对高通 msm 移动芯片组(骁龙处理器)而开发的内核项目。下载内核源码项目,检出内核分支代码。 ```sh $ git clone https://aosp.tuna.tsinghua.edu.cn/kernel/msm.git $ git branch -r --contains da330d0 origin/android-msm-angler-3.10-marshmallow-mr1 $ git checkout da330d0 ``` 并下载交叉编译环境。 ```sh $ export PATH=$(pwd)/arm-eabi-4.6/bin:$PATH $ export ARCH=arm64 //指明目标体系架构,arm、x86、arm64、 $ export CROSS_COMPILE=aarch64-linux-android- //指定使用的交叉编译器的前缀 $ cd msm $ make angler_defconfig $ make -j32 ``` # 更新 boot 编译完成后,在 arch/arm64/boot/ 目录下生成 Image、Image.gz、Image.gz.dtb 三个文件(如果是arm编译,会生成 zImage、zImage.gz、zImage.gz.dtb文件,我这里是arm64所以是Image文件),接下来我们就可以用生成的 .dtb去构建 boot.img镜像,然后刷机了。这里的 .dtb 文件就是打包boot.img用的 kernel 文件。 提取原 boot.img ,找到 boot ```sh angler:/ # su angler:/ # cd /dev/block/bootdevice/by-name angler:/dev/block/bootdevice/by-name # ls -la #导出boot.img angler:/dev/block/bootdevice/by-name # dd if=/dev/block/mmcblk0p34 of=/data/local/boot.img angler: cp /data/local/boot.img /sdcard $ adb pull /sdcard/boot.img ``` 对于更新 boot.img 里的 kernel 文件,有两种方法。 第一种是使用 make bootimage 命令,不过这种方法是基于你下载了全部的 Android 源码并编译过一次的基础上的,因为我修改boot.img里的的 Linux 内核,而且编译全部的 Android 源码是一件费力的事,需要150G以上的空间。 第二种是解包原版 boot.img 文件,将编译生成的内核文件 Image.gz-dtb 重命名为 kernel ,然后替换解包文件夹里的 kernel 文件,再将文件夹重新打包为 boot.img 。 - Windows 下的 bootimg.exe ,已经很久(3年多)未更新了。 - Linux 下的 bootimg-tools ,但 mkbootimg 工具需要复杂的参数 - mkbootimg_tools ,间接调用 mkbootimg 工具 ```sh [root@zjgcjy-hp mkbootimg]# ./unpackbootimg -i ../boot.img BOARD_KERNEL_CMDLINE androidboot.hardware=angler androidboot.console=ttyHSL0 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 boot_cpus=0-3 BOARD_KERNEL_BASE 0x00000000 BOARD_NAME BOARD_PAGE_SIZE 4096 BOARD_HASH_TYPE sha1 BOARD_KERNEL_OFFSET 0x00008000 BOARD_RAMDISK_OFFSET 0x02000000 BOARD_SECOND_OFFSET 0x00f00000 BOARD_TAGS_OFFSET 0x01e00000 BOARD_HEADER_VERSION 0 ``` 得到 ramdisk.gz 和 zImage 2个文件,然后将这些参数加进去重新。 ```sh ./mkbootimg \ --base 0 \ --pagesize 4096 \ --kernel_offset 0x00008000 \ --ramdisk_offset 0x02000000 \ --second_offset 0x00f00000 \ --tags_offset 0x01e00000 \ --cmdline 'androidboot.hardware=angler androidboot.console=ttyHSL0 msm_rtb.filter=0x37 ehci-hcd.park=3 lpm_levels.sleep_disabled=1 boot_cpus=0-3' \ --kernel ../new/Image.gz-dtb \ --ramdisk boot.img-ramdisk.gz -o bootnew.img ``` 生成新的 boot 文件。没有 fastboot 驱动的需要安装 Google 提供的 USB 驱动以识别 fastboot 。而且不要用新版的 fastboot 容易产生其他问题。 ```sh #重启手机进入fastboot模式 $ adb reboot bootloader #刷入boot镜像 $ ./fastboot flash boot bootnew.img #重启手机 $ ./fastboot reboot ``` # 添加 kernel 模块 设置 Enable Loadable module support 中的 3 项 - Forced module loading - Module unloading - Forced module unloading ```sh $ make angler_defconfig $ make menuconfig $ make -j32 ``` 这里会遇到一个代码 bug 。 ## 编写内核模块 首先测试一下在 pc 上怎么添加内核模块。写一个 hello.c 文件。 ```c #include <linux/module.h> #include <linux/kernel.h> int init_hello_module(void) { printk("Hello World! Start of hello world module!\n"); return 0; } void exit_hello_module(void) { printk("Hello World! End of hello world module!\n"); } MODULE_LICENSE("Dual BSD/GPL"); module_init(init_hello_module); module_exit(exit_hello_module); ``` 编写对应的 Makefile 。 ```makefile TARGET = hello CURRENT_PATH = $(shell pwd) KDIR = /usr/src/vmi obj-m := hello.o all: make -C $(KDIR) M=$(CURRENT_PATH) modules clean: make -C $(KDIR) M=$(CURRENT_PATH) clean ``` 然后加载内核模块即可。 1. modinfo 查看模块信息 2. make 进行编译链接 3. sudo insmod module.ko 加载模块 4. dmesg 查看结果 5. sudo rmmod module.ko 卸载模块 6. dmesg 查看结果 7. make clean 清理文件 然后就是修改 makefile 文件,进行交叉编译。 ```makefile TARGET = hello ARCH = arm64 CURRENT_PATH = $(shell pwd) KDIR = /home/user/android/msm TOOLCHAIN = /home/user/android/aarch64-linux-android-4.8/bin/aarch64-linux-android- obj-m := hello.o all: make ARCH=$(ARCH) CROSS_COMPILE=$(TOOLCHAIN) -C $(KDIR) M=$(CURRENT_PATH) modules clean: make ARCH=$(ARCH) CROSS_COMPILE=$(TOOLCHAIN) -C $(KDIR) M=$(CURRENT_PATH) clean ``` `EXTRA_CFLAGS="-D_CONFIG_ARM_ -fno-pic"` 选项可以不设置。编译成功后传入 sdcard 目录下, 加载测试。 ![[Snipaste_2020-11-16_20-19-14.png]] # 参考资料 https://www.jianshu.com/p/00602e083258 https://bbs.pediy.com/thread-219233.htm https://blog.csdn.net/mumuriyue/article/details/79583385 https://blog.csdn.net/qq1084283172/article/details/54880488 https://blog.csdn.net/FallingU/article/details/76166194 http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4258623 ``` ``` Last modification:January 16th, 2021 at 01:14 pm © 允许规范转载 Support 确定不打赏一下支持博主吗 ×Close Appreciate the author Sweeping payments Pay by AliPay
mkbootimg_tools具体的下载地址能提供下吗,找到很多个但是不知道那个才是。