新建一个hello目录,写个hello world 驱动 hello.c
#include <linux/init.h>
#include <linux/module.h>
static int hello_init(void)
{
printk( "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk( "Goodbye, world\n");
}
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);
在写个Makefile
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KERNELDIR:=/work/sdk/linux/s700-3/owl/out/s700_debian_s700_cb7/kernel
PWD:=$(shell pwd)
default:
$(MAKE) ARCH=arm64 CROSS_COMPILE=/work/sdk/linux/s700-3/toolchain/aarch64-linux-gnu/bin/aarch64-linux-gnu- -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf *.o *.mod.c *.mod.o *.ko .*.cmd modules.order Module.symvers .tmp_versions
endif
注意:修改 KERNELDIR:= 后面应修改成自己的内核源码目录路径。obj-m:= 后面应为驱动名
字,后缀.o 。 $(MAKE) 前面为 Tab 缩进。
Makefile 脚本里已经将处理器的架构和交叉编译工具写上。
用 Make 命令来编译程序:
1)ARCH=arm64 表示 ARCH 给出了目标处理器的架构这里用的是 arm 处理器。
2)CROSS_COMPILE 给出了编译程序所用的交叉工具链的名称,比如:
CROSS_COMPILE=aarch64-linux-gnu-
3)-C $(KERNELDIR) 指明跳转到内核源码目录下读取那里的 Makefile
4) M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的 Makefile
最后make ,生成ko文件