2025-03-05
写简单的驱动,一般一个源文件就足够了。写复杂的驱动,不仅要按照不同的功能模块组织项目。而且还有可能在一个项目里构建几个驱动。所以源文件也会比较多。下面就带大家看看如何将多个文件编译成一个驱动程序?
├── add.c
├── include
│ └── add.h
├── main.c
└── Makefile
// main.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include "add.h"
static int __init mulfiles_init(void) {
pr_info("mulfiles_init\n");
pr_info("1 + 2 = %d\n", add(1, 2));
return 0;
}
static void __exit mulfiles_exit(void) {
pr_info("mulfiles_exit\n");
}
module_init(mulfiles_init);
module_exit(mulfiles_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("heng30");
MODULE_VERSION("v0.0.1");
MODULE_DESCRIPTION("A simple mulfiles kernel module");
// add.h
#pragma once
int add(int a, int b);
// add.c
#include "add.h"
int add(int a, int b) { return a + b; }
#!/bin/sh
top-dir = $(shell pwd)
kernel-version = $(shell uname -r)
kernel-dir ?= /lib/modules/$(kernel-version)/build
obj-m += mulfiles.o
mulfiles-objs = main.o add.o
cflags = -I$(top-dir)/include
all:
make -C $(kernel-dir) ccflags-y=$(cflags) modules M=$(top-dir)
clean:
rm -f *.o *.ko *.mod *.mod.c *.order *.symvers
make -C $(kernel-dir) clean m=$(top-dir)
编译脚本中要注意的是:mulfiles-objs = main.o add.o
。这里的是驱动名称-objs
。
安装驱动:insmod mulfiles.ko
移除驱动:rmmod mulfiles.ko
查看输出:dmesg