Linux 单独编译驱动模块(ko文件)

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