[教程]在duo上编译内核模块

有人发过,但是sdk更新,现在已经用不了了->链接
重新发下教程:
新建个文件夹,在哪都行,内部放你的源文件和Makefile,
首先新建Makefile:输入以下内容

SDK_DIR = /home/kilo/Downloads/duo-buildroot-sdk
KERN_DIR = $(SDK_DIR)/linux_5.10
TEMP_PATH=/home/kilo/Downloads/duo-buildroot-sdk/host-tools/gcc/riscv64-linux-musl-x86_64/bin
TEMP_TOOL=${TEMP_PATH}/riscv64-unknown-linux-musl-

export CC=${TEMP_TOOL}gcc
export CXX=${TEMP_TOOL}g++
all:
	make ARCH=riscv CROSS_COMPILE=$(TEMP_PATH)/riscv64-unknown-linux-musl- -C $(KERN_DIR) M=$(PWD) modules

clean:
	make  -C $(KERN_DIR) M=$(PWD) modules clean
	rm -rf modules.order
prebuild:
	cp $(SDK_DIR)/build/boards/cv180x/cv1800b_milkv_duo_sd/linux/cvitek_cv1800b_milkv_duo_sd_defconfig $(KERN_DIR)/arch/riscv/configs/cvitek_cv1800b_milkv_duo_sd_defconfig
	make ARCH=riscv CROSS_COMPILE=$(TEMP_PATH)/riscv64-unknown-linux-musl- -C $(KERN_DIR) cvitek_cv1800b_milkv_duo_sd_defconfig
	make ARCH=riscv CROSS_COMPILE=$(TEMP_PATH)/riscv64-unknown-linux-musl- -C $(KERN_DIR) 

obj-m += helloworld.o

最后一行是你的源文件,第一行是你的sdk位置
注意,一定要改这些。

再新建helloworld.c

#include <linux/kernel.h>
#include <linux/module.h>

// 当驱动被加载的时候,执行此函数
static int __init hello_init(void)
{
    printk("welcome, hello\n");
    return 0;
}

// 当驱动被卸载的时候,执行此函数
static void __exit hello_exit(void)
{
    printk("bye, hello\n");
}

// 版权声明
MODULE_LICENSE("GPL");

// 以下两个函数属于 Linux 的驱动框架,只要把驱动两个函数地址注册进去即可。
module_init(hello_init);
module_exit(hello_exit);

建好之后在当前目录打开命令行,输入:

make prebuild

如果你编译过内核,不用输入上面那行,否则要预编译
然后输入:

make all

之后当前目录就有一个helloworld.ko文件,就是编译好的内核模块。
上传到开发板上

sshpass -p milkv scp 你的文件夹/helloworld.ko  root@192.168.42.1:~/

insmod加载模块,如下所示:

[root@milkv-duo]~# ls
helloworld.ko
[root@milkv-duo]~# insmod ./helloworld.ko
[root@milkv-duo]~# 

输入dmesg | tail查看内核信息:

[root@milkv-duo]~# ls
helloworld.ko
[root@milkv-duo]~# insmod ./helloworld.ko
[root@milkv-duo]~# dmesg | tail 
[    3.665545] dwc2 4340000.usb: new device is high-speed
[    3.743320] dwc2 4340000.usb: new address 7
[    3.828876] IPv6: ADDRCONF(NETDEV_CHANGE): usb0: link becomes ready
[   71.508843] bm-dwmac 4070000.ethernet eth0: Link is Up - 100Mbps/Full - flow control rx/tx
[   71.508888] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[ 1213.011595] random: crng init done
[ 1213.011611] random: 1 urandom warning(s) missed due to ratelimiting
[ 3574.752501] welcome, hello
[root@milkv-duo]~# 

可以看见printk(“welcome, hello\n”);语句已经正常执行了。
移除模块:

rmmod helloworld.ko

可以看见bye, hello正常打印。

5 Likes