这个教程显示了以下步骤:
该图托已经针对以下目标完成:
您的软件包管理器或遵循本指南的Downlad ADB和FastBoot 。
sudo apt-get install adb fastboot
启动ADB守护程序,验证您可以使用ADB查看手机,并以Bootloader模式(FastBoot模式)重新启动。
adb start-server
adb devices
adb reboot bootloader
验证您可以使用FastBoot看到手机并解锁Bootloader
fastboot devices
fastboot oem unlock
(or fastboot flashing unlock for newest phones)
您还可以遵循本官方指南,以快速启动模式手动启动并解锁引导加载程序。
您可以在此处找到其他FastBoot命令。
我首先尝试使用官方仓库中的最新稳定NDK。
(请勿下载!它不起作用)
export PATH=$PATH:/home/user/ndk/android-ndk-r17b/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/
export CROSS_COMPILE=arm-linux-androideabi-
但是我在编译时有非常奇怪的警告,这阻止了最后的念念。
因此,经过几次研究后,我在这里发现,最好使用ARM-EABI-GCC而不是ARM-Linux-androideabi-GCC 。
因此,我下载了最新版本的ARM-EABI-4.8。
==>将其提取到/home/user/ndk/arm-eabi-4.8
export PATH=$PATH:/home/user/ndk/arm-eabi-4.8/bin
export CROSS_COMPILE=arm-eabi-
注意:我可以确认ARM-EABI-4.8的选择,因为它是build.config中的内核图像中定义的跨编译器:
ARCH=arm
BRANCH=android-msm-shamu-3.10
CROSS_COMPILE=arm-eabi-
DEFCONFIG=shamu_defconfig
EXTRA_CMDS=''
KERNEL_DIR=private/msm-moto
LINUX_GCC_CROSS_COMPILE_PREBUILTS_BIN=prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin
FILES="
arch/arm/boot/zImage-dtb
vmlinux
System.map
"
为了将自己的内核模块插入Nexus 6内核中,我们需要让内核配置选项可加载模块支持激活。如果您已经扎根了手机,则可以验证录音,其他else相信我:
adb shell su -c "lsmod"
or
adb shell su -c "insmod /data/local/tmp/glitchmin.ko"
默认情况下,这些功能在Android内核中没有授权。因此,我们将启用启用选项可加载模块支持的新内核。
我们收到的Nexus 6(Shamu)的配置如下:
在此列表中,我下载了该官方的Google内核Android-MSM-SHAMU-SHAMU-3.10-MARSHMALLOWALLE。
==>将其提取到/home/user/images_kernel/mmsm-android-msm-shamu-3.10-marshmallow export mykernel =/home/home/user/user/use/images_kernel/msmmmmmmmmsm-android-msm-shamu-3.10-marshmalshmall
您还可以使用[Cyanogenmod kernel android_kernel_moto_shamu](https://github.com/cyanogenmod/android_kernel_moto_shamu)
然后,您可以按照下一步的步骤构建内核(本指南或本指南或[本指南](https://source.android.com/setup/build/devices或该最后一个))。
在$ mykernel/acch/arm/arm/configs/shamu_config中,替代
# CONFIG_MODULES is not set
经过
CONFIG_MODULES=y
然后
cp arch/arm/configs/shamu_config .config
make ARCH=arm SUBARCH=arm CROSS_COMPILE=arm-eabi- shamu_defconfig
验证该选项是否启用可加载的模块支持已得到很好的激活: make ARCH=arm SUBARCH=arm CROSS_COMPILE=arm-eabi- menuconfig
==>如果不选择启用可加载的模块支持,请按键盘上的空格,然后选择保存和退出
最后编译整个内核(花费大量时间...): make ARCH=arm SUBARCH=arm CROSS_COMPILE=arm-eabi- -j4
(注意:-jn表示它将在Parallele中使用N处理器)
最后,您必须获得类似的东西:
Kernel: arch/arm/boot/Image is ready
DTC arch/arm/boot/dts/apq8084-shamu-p2.dtb
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gzip
CC arch/arm/boot/compressed/misc.o
CC arch/arm/boot/compressed/decompress.o
CC arch/arm/boot/compressed/string.o
SHIPPED arch/arm/boot/compressed/hyp-stub.S
SHIPPED arch/arm/boot/compressed/lib1funcs.S
SHIPPED arch/arm/boot/compressed/ashldi3.S
AS arch/arm/boot/compressed/hyp-stub.o
AS arch/arm/boot/compressed/lib1funcs.o
AS arch/arm/boot/compressed/ashldi3.o
AS arch/arm/boot/compressed/piggy.gzip.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
CAT arch/arm/boot/zImage-dtb
Kernel: arch/arm/boot/zImage-dtb is ready
您可以在$ Mykernel/Arch/Arm/boot/boot/boot/boot/boot/boot/ttb中找到图像, zimage和zimage-dtb/ boot/
您可以在$ Mykernel/Arch/Arch/Arm/boot/dts/*。DTB上找到设备树blob .dtb
您已经准备好内核了。在大多数嵌入式系统上,这将是您工作的尽头。通常,您会将内核复制到SD卡或NFS位置,并且板将启动。但是在Android上是不同的。您需要准备特殊的引导分区,然后可以使用FastBoot启动。
有关此链接上的内核和启动图像的更多信息。
因此,您需要从Google站点下载手机的Android图像开始。转到Nexus Factory Images网站,然后下载与手机上的Android版本相匹配的工厂图像。
在此处下载Nexus6(Shamu)Android 6.0.1(MMB29K)的工厂图像。
==>将其提取到/home/user/factory/shamu-mmb29k
export FACTORY=/home/user/factory/shamu-mmb29k
cd $FACTORY
mkdir unziped_img
unzip ./image-shamu-mmb29k.zip -d unziped_img
cd unziped_img
或从此链接下载boot.img 。
灵感来自[本指南](http://rex-shen.net/android-unpackpackpack-factory-images/。
sudo apt-get install abootimg
进入未拉扎的工厂图像文件或下载的boot.img文件,
mkdir boot
cd boot
abootimg -x ../boot.img
# after the successful execution of the last command, we will have initrd.img (= ramdisk), zImage (= kernel) and bootimg.cfg (= kernel config)
# inside the boot folder.
如果您想从ramdisk检查根文件系统rootfs :
file initrd.img
# the output should be similar to the following line:
# initrd.img: gzip compressed data, from Unix
mkdir ramdisk
cd ramdisk
# "gunzip -c" means unpack to standard output, and "cpio -i" convert standard output in files
gunzip -c ../initrd.img|cpio -i
# to create an image:
abootimg --create boot.img -f bootimg.cfg -k $MYKERNEL/arch/arm/boot/zImage-dtb -r initrd.img [-s <secondstage>] -c bootsize=[SIZE_IT_WANTS]
# to update an existing image:
abootimg -u boot.img -f bootimg.cfg -k $MYKERNEL/arch/arm/boot/zImage-dtb -r initrd.img [-s <secondstage>] -c bootsize=[SIZE_IT_WANTS]
注意:选项“ -r” ,其中ramdisk是initrd.img,而不是ramdisk文件夹。
注意:我的情况,它仅适用于Zimage-DTB ,而不是Zimage和**图像
下载官方的Google工具。
==>将其提取到/home/user/bootimgtool
mkdir $FACTORY/unpacked_img
export BOOTIMGTOOL=/home/user/bootimgtool
cd $BOOTIMGTOOL
./unpack_bootimg --boot_img $FACTORY/unziped_img/boot.img --out $FACTORY/unpacked_img
cp $MYKERNEL/arch/arm/boot/zImage-dtb $ $FACTORY/unpacked_img/kernel
./mkbootimg --kernel $FACTORY/unpacked_img/kernel --ramdisk $FACTORY/unpacked_img/ramdisk -o $FACTORY/boot.img
下载此工具。
git clone https://github.com/bzyx/bootimg-tools
export BOOTIMGTOOL=/home/user/bootimg-tools
然后,您需要从工厂图像中解开.img。将其插入您的自定义内核并重新包装。
cd $BOOTIMGTOOL
make
cd mkbootimg
./unmkbootimg -i $FACTORY/unziped_img/boot.img
cp $MYKERNEL/arch/arm/boot/zImage-dtb $ $FACTORY/unpacked_img/kernel
./mkbootimg --base 0 --pagesize 2048 --kernel_offset 0x00008000 --ramdisk_offset 0x02000000 --second_offset 0x00f00000 --tags_offset 0x01e00000 --cmdline 'console=ttyHSL0,115200,n8 androidboot.console=ttyHSL0 androidboot.hardware=shamu msm_rtb.filter=0x37 ehci-hcd.park=3 utags.blkdev=/dev/block/platform/msm_sdcc.1/by-name/utags utags.backup=/dev/block/platform/msm_sdcc.1/by-name/utagsBackup coherent_pool=8M' --kernel kernel --ramdisk ramdisk.cpio.gz -o $FACTORY/boot.img
adb reboot bootloader或者按手动电源并降低声音几秒钟。
然后录制: fastboot devices
您的设备必须出现在列表中
如果您想快速测试您的新自定义boot.img功能良好,请尝试: fastboot boot boot.img
如果未返回您失败,则可以尝试使用以下方式在内存中刷新它。
fastboot flash boot boot.img
fastboot reboot
cd $FACTORY
zip -r ../image-shamu-mmb29k.zip boot.img
fastboot devices ==> device must appear in the list
./flash-all.sh或 fastboot -w update image-shamu-mmb29k.zip
fastboot reboot
如果您想了解有关不同分区,Android系统,FastBoot命令等的更多信息,请在此处浏览一下。
您可以为其使用自动脚本,例如CF-Auto-root。
或遵循本指南启发的下一步。
/*
* hello-1.c - The simplest kernel module.
*/
#include <linux/module.h> /* Needed by all modules */
#include <linux/kernel.h> /* Needed for KERN_INFO */
int init_module(void)
{
printk(KERN_INFO "Hello world 1.n");
/*
* A non 0 return means init_module failed; module can't be loaded.
*/
return 0;
}
void cleanup_module(void)
{
printk(KERN_INFO "Goodbye world 1.n");
}
ccflags-y += -fno-stack-protector -fno-pic -Wno-unused-function
obj-m += module.o
module-objs := hello-1.o hello-2.o hello-3.o
CROSS_COMPILE=/home/user/ndk/arm-eabi-4.8/binarm-eabi-
KERNEL_DIR=/home/user/images_kernel/msm-android-msm-shamu-3.10-marshmallow
TMP_BUILD ?= /tmp/build
MODULE_NAME = module.ko
mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST)))
current_dir := $(patsubst %/,%,$(dir $(mkfile_path)))
all:
mkdir -p $(TMP_BUILD)
cp ./*.c ./*.h ./Makefile $(TMP_BUILD)
make -C ${KERNEL_DIR} M=$(TMP_BUILD) ARCH=arm PLATFORM=shamu CROSS_COMPILE=${CROSS_COMPILE} modules V=1
cp $(TMP_BUILD)/$(MODULE_NAME) $(PWD)/$(MODULE_NAME)
rm -rf $(TMP_BUILD)
clean:
make -C ${KERNEL_DIR} M=$(PWD) clean
make
它应该创建模块
adb push module.ko /data/local/tmp
adb shell su -c "lsmod"
adb shell su -c "insmod /data/local/tmp/module.ko"
adb shell su -c "lsmod"
您可以提供更多信息:
adb shell su -c "cat /proc/kmsg"
有关内核模块编程的更多信息。