参考链接 eBPF on Android之打补丁和编译内核
修改Linux Kernel defconfig的标准方法
需求 最近打算重新做一版以前的工具,升级一下系统版本,在编译内核的时候碰到了一些问题,顺手记录一下。目标是编译aosp12的内核,修改配置开启硬件断点,开启kprobe。为后续学习bpf准备测试环境。
编译内核 首先找到对应我当前aosp12版本对应的内核,我们官网提供的描述 可以找到。由于我使用的手机是pixel3,所以对应的版本是android-msm-crosshatch-4.9-android12
1 2 3 // 拉取内核代码 repo init -u https://android.googlesource.com/kernel/manifest -b android-msm-crosshatch-4.9-android12 repo sync -j8
成功拉取代码后,可以先直接编译./build/build.sh
跑通编译,如果在编译过程中出现错误,有可能是缺少了一些环境,以下是我编译过程安装的缺少依赖
1 2 sudo apt install bc sudo apt install kmod
成功编译后,还需要让aosp使用我们自己编译的内核
1 2 3 vim ./build/envsetup.sh //在最后添加 export TARGET_PREBUILT_KERNEL=/root/android_src/android-kernel/out/android-msm-pixel-4.9/dist/Image.lz4
添加好配置后,我们编译aosp时就会自动使用编译好的内核了。
修改内核配置 最早先,我是直接修改arch/arm64/configs/xx_defconfig
,但是碰到了diff配置文件错误的问你题,后来又修改build.config.common文件,然后碰到了触摸失灵的问题。经过一番找资料,最后发现修改配置的方式得按照流程来才行。下面我贴上处理的过程
1 2 3 4 5 6 7 8 9 10 11 cd /root/android_src/android-kernel/private/msm-google // b1c1_defconfig是我的设备使用配置,第一步会在当前目录生成.config文件 make ARCH=arm64 b1c1_defconfig // 这个命令会打开一个图形化的界面,我们在里面可以勾选需要的配置,最后save保存回这个.config文件 // 如果我们清楚的知道修改什么配置,那么可以不用打开图形化界面,直接编辑.config,添加自己的配置即可 // 比如我在最后直接添加CONFIG_KPROBES=y make ARCH=arm64 menuconfig // 使用.config文件生成defconfig文件 make ARCH=arm64 savedefconfig 最后将生成好的配置文件替换 cp defconfig arch/arm64/configs/b1c1_defconfig
按照上面的步骤我手动在配置中添加了
1 2 3 4 5 6 CONFIG_IKHEADERS=y CONFIG_HAVE_KPROBES=y CONFIG_KPROBES=y CONFIG_KPROBE_EVENT=y CONFIG_HAVE_HW_BREAKPOINT=y CONFIG_HAVE_ARCH_TRACEHOOK=y
另外在图形化界面中添加如下
Main—>Enable loadable module support—>Module signature verification—>Require modules to be validly signed
Main—>Kernel hacking—>Sample kernel code—>Build kernel hardware breakpoint exammples – loadable module only
有几个多选的,我也不知道用不用的上,反正先开着把。万一学习的时候需要呢
下面检查一下看是否开启成功
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 zcat /proc/config.gz | grep PROBE CONFIG_GENERIC_IRQ_PROBE=y CONFIG_KPROBES=y # CONFIG_UPROBES is not set CONFIG_HAVE_KPROBES=y CONFIG_HAVE_KRETPROBES=y # CONFIG_NET_TCPPROBE is not set CONFIG_GENERIC_CPU_AUTOPROBE=y # CONFIG_CAMERA_PROBE_SPEC_CHECK is not set CONFIG_CLKSRC_PROBE=y CONFIG_KPROBE_EVENT=y CONFIG_PROBE_EVENTS=y # CONFIG_KPROBES_SANITY_TEST is not set # CONFIG_SAMPLE_KPROBES is not set zcat /proc/config.gz | grep HAVE_HW_BREAKPOINT CONFIG_HAVE_HW_BREAKPOINT=y
ps:最后测试的时候发现,当我开启CONFIG_KRETPROBES配置并且打开Require modules to be validly signed
选项的时候,就会出现指纹失灵的现象,关掉模块签名验证就恢复正常了。