#include <linux/init.h> #include <linux/module.h> static int __init hello_drv_init(void) { //一般做系统申请资源 printk("--------------------%s--------------\n",__FUNCTION__); return 0; } static void __exit hello_drv_exit(void) { //一般做系统释放资源 printk("--------------------%s--------------\n",__FUNCTION__); } module_init(hello_drv_init); module_exit(hello_drv_exit); MODULE_LICENSE("GPL");
ROOTFS_DIR = /home/linux/Level11
ifeq ($(KERNELRELEASE), )
#内核源码到路径,不同环境会不一样,内核源码一定要先编译
KERNEL_DIR = /home/linux/Level10/day6/linux-5.4.79
CUR_DIR = $(shell pwd)
all :
make -C $(KERNEL_DIR) M=$(CUR_DIR) modules -j6 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
clean :
make -C $(KERNEL_DIR) M=$(CUR_DIR) clean
install:
cp -raf *.ko $(ROOT_DIR)/drv_module
else
obj-m += hello.o
#用于指定到底编译哪个代码--hello.c
endif
[root@farsight ]# insmod hello.ko
[ 159.502981] hello: loading out-of-tree module taints kernel.
[root@farsight ]# lsmod
hello 16384 0 - Live 0xbf000000 (O)
[root@farsight ]# rmmod hello
[ 492.302296] --------------------hello_drv_exit--------------
如遇到找不到文件夹的情况 使用mkdir创建对应文件夹即可。
#include <linux/init.h> #include <linux/module.h> static int myvalue = 2077; static char* myname = "Peter"; static int __init hello_drv_init(void) { //一般做系统申请资源 printk("--------------------%s--------------\n",__FUNCTION__); printk("name = %s, value = %d\n",myname,myvalue); return 0; } static void __exit hello_drv_exit(void) { //一般做系统释放资源 printk("--------------------%s--------------\n",__FUNCTION__); } module_init(hello_drv_init); module_exit(hello_drv_exit); MODULE_LICENSE("GPL"); module_param(myvalue, int, 0644); module_param(myname,charp,S_IRUGO|S_IWUSR|S_IXUGO);
效果展示:
[root@farsight ]# insmod hello.ko [ 7149.375441] --------------------hello_drv_init-------------- [ 7029.636609] name = Peter, value = 2077 [root@farsight ]# rmmod hello.ko [ 7040.141788] --------------------hello_drv_exit-------------- [root@farsight ]# insmod hello.ko myname="Jessess" myvalue=1886 [ 7149.375441] --------------------hello_drv_init-------------- [ 7149.380802] name = Jessess, value = 1886
math.c 代码展示:
#include <linux/module.h> #include <linux/init.h> //不需要模块加载和卸载到入口声明,直接定义好一些封装的函数 int my_add(int a, int b) { return a+b; } EXPORT_SYMBOL(my_add); int my_sub(int a, int b) { return a-b; } EXPORT_SYMBOL(my_sub); MODULE_LICENSE("GPL");
hello.c 代码展示
#include <linux/init.h> #include <linux/module.h> #include "math.h" static int myvalue = 2077; static char* myname = "Peter"; static int __init hello_drv_init(void) { //一般做系统申请资源 printk("--------------------%s--------------\n",__FUNCTION__); printk("name = %s, value = %d\n",myname,myvalue); printk("33 + 22 = %d, 55 - 33 = %d\n",my_add(33,22),my_sub(55,33)); return 0; } static void __exit hello_drv_exit(void) { //一般做系统释放资源 printk("--------------------%s--------------\n",__FUNCTION__); } module_init(hello_drv_init); module_exit(hello_drv_exit); MODULE_LICENSE("GPL"); module_param(myvalue, int, 0644); module_param(myname,charp,S_IRUGO|S_IWUSR|S_IXUGO);
math.h 代码展示
#ifndef __MATH_H__ #define __MATH_H__ int my_add(int a,int b); int my_sub(int a,int b); #endif
makefile 代码展示
ROOTFS_DIR = /home/linux/Level11 ifeq ($(KERNELRELEASE), ) KERNEL_DIR = /home/linux/Level10/day6/linux-5.4.79 CUR_DIR = $(shell pwd) all : make -C $(KERNEL_DIR) M=$(CUR_DIR) modules -j6 ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- clean : make -C $(KERNEL_DIR) M=$(CUR_DIR) clean install: cp -raf *.ko $(ROOTFS_DIR)/drv_module else obj-m += hello.o obj-m += math.o endif
开发板端效果展示:
[root@farsight ]# insmod math.ko
[root@farsight ]# insmod hello.ko
[ 3490.894033] --------------------hello_drv_init--------------
[ 3490.899290] name = Peter, value = 2077
[ 3490.902968] 33 + 22 = 55, 55 - 33 = 22
[root@farsight ]# lsmod
hello 16384 0 - Live 0xbf000000 (O)
math 16384 1 hello, Live 0xbf008000 (O)
[root@farsight ]# rmmod hello
[ 3521.544330] --------------------hello_drv_exit--------------
[root@farsight ]# rmmod math
math.ko是依赖模块先来后走,hello.ko是调用模块迟到早退。