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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐