我们正在一个团队中开发 android 内核驱动程序。驱动程序被开发为可加载模块,并与内核源代码分开编译。但是,我们需要首先构建 android 内核源代码才能构建驱动模块。每个开发人员从 git 中提取内核更改并构建内核二进制文件。由于每个开发人员的本地系统上的内核二进制文件都不同,因此我们每次都需要更换内核二进制文件和驱动程序模块。除了在通用系统上共享内核源之外,还有更好的解决方案来构建驱动程序吗?
1 回答
你们中的一个人应该在本地执行此操作。假设您的内核源目录是 $kern_dir,并且您将在新的暂存区域(内核源层次结构之外)构建以下工件。将此称为 $stage。
在暂存区域中,创建一个子目录层次结构: $stage/lib/modules/$kernel_version/build ($kernel_version 应该与内核 Makefile 中的 KERNEL_VERSION 匹配;生成的路径将与您当前将模块安装到的目录名称相同在目标系统上);将此称为 $build。
# Configure and build the kernel as you currently do.
cp <my-kernel-config> to $kern_dir
cd $kern_dir
make oldconfig # or whatever is needed to set your config
make
# Create the staging area and build directory
mkdir -p $build
# Copy updated kernel config to staging area:
cp .config $build
# Create necessary kernel configuration support (in staging area) to support out-of-tree modules
make O=$build modules_prepare
# Add Module.symvers to build directory
cp Module.symvers $build
您现在应该有一个完全配置的构建目录,每个人都可以安装在他们自己的系统上。这是一个目录,其中包含使用该内核构建所需的所有头文件,以及描述内核构建时使用的配置选项的信息以及描述内核导出符号的 Module.symvers 文件。
将其捆绑起来(“cd $stage; tar czf kernel-devel.tgz lib/modules/$kernel_version/build”)并将其分发给所有开发人员。
单独提交包含已构建内核和相关模块的“包”(即内核附带且您未修改的所有模块);为此,请使用您现在使用的任何机制。让每个人都将这个内核和构建目录安装到他们的目标(运行时)系统上。(这应该给每个人一个通用的 /boot/ 和 /lib/modules 层次结构。)
在他们的构建系统上,每个人都应该从上面安装您的 kernel-devel.tgz。假设构建系统运行与目标系统相同的内核,并且您安装了相对于 root 的 kernel-devel.tgz(即它实际上位于构建系统的 /lib/modules/$kernel_version/build 中),然后您可以使用“标准”模块 Makefile 模型来构建您的模块。应该是这样的:
obj-m := hello.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
如果您的构建系统没有运行相同的内核,那么只需将 KDIR 更改为您安装了 kernel-devel.tgz 压缩包的位置。
现在,您团队中的任何人都应该能够构建针对同一内核安装的模块。