Linux 单独编译驱动模块(ko文件)
0 背景调试内核模块时,不想每次都要整个工程一起编译,只想编译单独的ko文件,也不影响模块间的依赖关系(会修改mod.depend信息)。1 确认必要的环境变量创建env.sh文件,并chmod +x env.sh#!/bin/bashfunction runcmd(){if [ $# -ne 1 ];thenecho "Usage: runcmd command_string"exit 1fie
·
0 背景
调试内核模块时,不想每次都要整个工程一起编译,只想编译单独的ko文件,也不影响模块间的依赖关系(会修改mod.depend信息)。
1 确认必要的环境变量
创建env.sh文件,并chmod +x env.sh
#!/bin/bash
function runcmd()
{
if [ $# -ne 1 ];then
echo "Usage: runcmd command_string"
exit 1
fi
echo "$1"
$1 || {
echo "failed"
exit 1
}
}
function cpfiles()
{
if [ $# -ne 2 ];then
echo "Usage: cpfiles \"sourcefiles\" \"destdir\""
exit 1
fi
mkdir -p $2 || {
echo "mkdir -p $2 failed"
exit 1
}
for f in $1
do
if [ -a $f ];then
cp -af $f $2 || {
echo "cp -af $f $2 failed"
exit 1
}
fi
done
echo "cpfiles $1 $2"
}
export N=$(( ($(cat /proc/cpuinfo |grep 'processor'|wc -l)) ))
export BUILD_OUTPUT_PATH=$(pwd)/out
export TARGET_MODULES_PATH=${BUILD_OUTPUT_PATH}/_modules
export TARGET_BOOT_PATH=${BUILD_OUTPUT_PATH}/_boot
export TARGET_BOOT_EXT4_PATH=${BUILD_OUTPUT_PATH}/_boot_ext4
export KERNEL_DEFCONFIG=stm32mp1_mmc_defconfig
export CC_GCC=arm-none-linux-gnueabihf-gcc
这样只需要source env.sh,便可将环境变量直接导入当前bash窗口。
2 整个编译内核
make O=${BUILD_OUTPUT_PATH} -j${N}
指定将编译过程输出至BUILD_OUTPUT_PATH,-j是多核编译
至此,BUILD_OUTPUT_PATH里面就已经有了完整的内核文件及编译过程文件+编译结果文件。
3 单独编译某个驱动文件为ko
在当前c文件目录下创建Makefile:
ARCH := arm64
CROSS_COMPILE := aarch64-linux-gnu-
KERNELDIR := $(BUILD_OUTPUT_PATH)
CURRENT_PATH := $(shell pwd)
obj-m := c文件名.o
build: kernel_modules
kernel_modules:
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KERNELDIR) M=$(CURRENT_PATH) modules
rm *.mod*
clean:
$(MAKE) -C $(KERNELDIR) M=$(CURRENT_PATH) clean
运行make命令,便可在当前目录下生成ko文件。
通过scp传输至板端,即可insmod
更多推荐
已为社区贡献2条内容
所有评论(0)