参考链接

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

image-20220905220135721

Main—>Kernel hacking—>Sample kernel code—>Build kernel hardware breakpoint exammples – loadable module only

image-20220905220414549

有几个多选的,我也不知道用不用的上,反正先开着把。万一学习的时候需要呢

下面检查一下看是否开启成功

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选项的时候,就会出现指纹失灵的现象,关掉模块签名验证就恢复正常了。