高通学习16--Kernel的编译

📅 2026/7/2 19:34:56 👁️ 阅读次数 📝 编程学习
高通学习16--Kernel的编译

目前,高通的编译系统已经是Android 14 + Kernel 6.1 + Bazel + GKI的新架构。

1 编译过程

整体过程是:

build_with_bazel.py

Bazel

Kernel Config

Kernel Build

DTBO

ABL

Boot Image

Dist

最终输出:

boot.img
vendor_boot.img
init_boot.img
dtbo.img

第一阶段生成Kernel Config

make vendor/neo_la-gki_defconfig

AR1平台对应neo_la,也就是

neo_la-gki_defconfig

此时,三个配置文件合并。

Google GKI
+
Qualcomm SoC Config
+
AR1 Product Config

生成最终.config。

第二阶段:ABI/KMI检查

Kernel Module Interface

现在Vendor Driver只能调用KMI白名单。

第三阶段:真正编译 Kernel

基于bazel封装,最终运行

bazel run

生成Image,vmlinux,modules。

第四阶段:编译 DTBO

生成dtbo.img

第五阶段:编译 ABL

生成UEFI,EDK2。

第六阶段:生成 Boot Image

最后生成

boot image-->GKI Kernel

vendor_boot.img-->Vendor Ramdisk

init_boot.img-->Init Ramdisk

第七阶段:Dist导出

把所有输出拷贝到out/msm-kernel-neo_la-gki/dist

在这个代码中,最后需要调用tools/bazel run或者build/build.sh。

最后用build_with_bazel.py完成构建。

2 GKI

GKI = Generic Kernel Image

以前boot.img
├── Qualcomm Kernel
├── Camera Driver
├── Audio Driver
├── WLAN Driver
├── DTS
└── Vendor Ramdisk

现在

boot.img
└── GKI Kernel(Linux Kernel+Google维护部分)

其余的部分,放在vendor_boot.img

通常包含了

Vendor Ramdisk
Vendor Init
Qualcomm Init
DTS/DTB
Vendor Kernel Modules

vendor_boot.img
├── Qualcomm Driver
├── DTS
├── Vendor Ramdisk
└── Vendor Init

vendor_dlkm.img

则是包含具体高通/ODM驱动模块(.ko)

也就是说后续驱动的修改,会放到vendor_boot.img和vendor_dlkm.img。

3 增加驱动

对于你现在这个AR1(Android 14 + GKI + Kernel 6.1 + Bazel)平台,增加一个驱动并最终打包成.ko,流程和老式 Qualcomm BSP 已经不一样了。

大致流程:

新增驱动源码 ↓ Kconfig ↓ Makefile ↓ CONFIG_xxx=m ↓ Bazel编译 ↓ 生成 xxx.ko ↓ 加入 Vendor Module List ↓ vendor_dlkm.img ↓ 刷机验证

第一步:增加驱动源码

例如:

kernel_platform/msm-kernel/drivers/my_sensor/ ├── Kconfig ├── Makefile └── my_sensor.c

Makefile:

obj-$(CONFIG_MY_SENSOR) += my_sensor.o

Kconfig:

config MY_SENSOR tristate "My Sensor Driver"

其中:

tristate

表示:

y = 编进内核 m = 编译ko n = 不编译

第二步:打开配置

在 AR1 Log 里你已经看到:

vendor/neo_la-gki_defconfig

因此通常修改:

kernel_platform/msm-kernel/arch/arm64/configs/vendor/neo_la-gki_defconfig

增加:

CONFIG_MY_SENSOR=m

第三步:编译

你们平台实际入口类似:

build/build.sh

或者:

build_with_bazel.py

Log里已经显示:

neo-la_gki

目标。说明是 Bazel 驱动构建。

编译后会生成:

out/.../my_sensor.ko

第四步:加入 Vendor Module 列表

这是 GKI 平台最容易漏的地方。

仅有:

CONFIG_MY_SENSOR=m

还不够。

Android 要知道:

这个ko要放到哪个分区

Google 官方要求通过:

BOARD_VENDOR_KERNEL_MODULES

控制 vendor_dlkm 镜像内容。(Android Open Source Project)

很多 Qualcomm 平台会有类似文件:

vendor_dlkm.modules vendor_boot.modules modules.load

例如:

my_sensor.ko

加入:

kernel_platform/msm-kernel/modules.vendor

(具体文件名每个平台不同)


第五步:决定放 vendor_boot 还是 vendor_dlkm

这一步很重要。


情况1:普通驱动

例如:

I2C Sensor GPIO SPI Device Touch

通常:

my_sensor.ko

进入:

vendor_dlkm.img

这是 Android 11+ 推荐模式。(Android Open Source Project)


情况2:启动阶段必须加载

例如:

UFS Storage Display Early Driver

系统还没挂载分区就要使用。

这类模块可能进入:

vendor_boot.img

因为 first-stage init 要加载。(Android Open Source Project)


第六步:验证镜像

编译后:

out/dist/

一般能看到:

boot.img vendor_boot.img vendor_dlkm.img dtbo.img

查看:

unpack_image vendor_dlkm.img

或者:

debugfs

确认:

/vendor/lib/modules/my_sensor.ko

已经存在。

Google 官方说明:

BOARD_VENDOR_KERNEL_MODULES 中的模块最终会安装到 /vendor_dlkm/lib/modules

并通过:

/vendor/lib/modules

符号链接访问。(Android Open Source Project)


第七步:系统启动加载

通常有:

modules.load

文件。

例如:

wlan.ko audio.ko camera.ko my_sensor.ko

系统启动:

modprobe

自动加载。(Android Open Source Project)


对 AR1 最可能的实际操作

结合你之前的编译日志:

neo-la_gki neo-la_gki_dist vendor_boot.img vendor_dlkm.img

我判断 Qualcomm AR1 大概率是:

kernel_platform/ ├── drivers/my_sensor/ ├── vendor/neo_la-gki_defconfig ├── modules.vendor └── build/

你需要:

1

新增:

drivers/my_sensor/

2

修改:

vendor/neo_la-gki_defconfig CONFIG_MY_SENSOR=m

3

修改:

modules.vendor

加入:

my_sensor.ko

4

重新执行:

build/build.sh

或者你们当前使用的:

build_with_bazel.py

5

最终得到:

vendor_dlkm.img

里面包含:

/vendor/lib/modules/my_sensor.ko

这就是 Qualcomm Android 14 BSP 增加新驱动最典型的流程。