C/C++教程

记录CentOS7下编写驱动模块

本文主要是介绍记录CentOS7下编写驱动模块,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

记录Centos7下编写驱动模块

参考自以下文章。

Linux驱动基础开发

Linux内核入门——驱动模块

《嵌入式应用程序设计》--华清远见

1.最简单模块

hello.c

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

int __init start(void)
{
	printk(KERN_INFO "this is module onl oad finish\n");//中间就是空格,一开始写的,,怎么也没有输出,还看了好久。
	return 0;
}
void __exit end(void)
{
	printk(KERN_INFO "this is module on close last\n");
}

module_init(start);
module_exit(end);
MODULE_AUTHOR("yyjeqhc");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("simple hello");

Makefile

obj-m :=hello.o
CONFIG_MODULE_SIG=n
all:
	make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules //注意都是Tab,不是空格
clean:
	echo "clean"

注意Makefile里面hello.o和文件hello.c是同名的,然后直接make即可

image

insmod hello.ko	//加载模块
rmmod	hello.ko //卸载模块
lsmod //查看所有模块
dmesg //查看系统输出,可以看加载和卸载模块的输出
dmesg -c 清除系统输出

image

2.带参数模块

hello.c

#include<linux/init.h>
#include<linux/module.h>
static int num = 1234;
static char *str = "this is default printstr";
static int __init start(void)
{
	printk(KERN_INFO "this is module onl oad finish\n");
	printk("<1> num is %d str = %s\n",num,str);
	return 0;
}
static void __exit end(void)
{
	printk(KERN_INFO "this is module on close last\n");
}

module_init(start);
module_exit(end);
module_param(num,int,S_IRUGO);
module_param(str,charp,S_IRUGO);
MODULE_AUTHOR("yyjeqhc");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("simple hello");

Makefile和上面一样。

image

之前已经清除系统输出了。

不带参数的加载/卸载模块。

image

不带参数,就输出的默认的值。

带参数的加载模块:

image

需要注意的是,参数的值和参数之间不能有空格;然后参数是字符串,中间也不能有空格。

image

3.导出符号。

hello.c

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

int addNum(int a,int b)
{
	return a + b;
}
int subNum(int a,int b)
{
	return a - b;
}
EXPORT_SYMBOL(addNum);
EXPORT_SYMBOL(subNum);
MODULE_AUTHOR("yyjeqhc");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("simple hello");

Makefile不变,直接make即可。

/proc/kallsyms //查看系统符号,添加grep过滤一下

image

可见这个导出符号已经装载了。

这时,编写其它模块就可以调用它,只需要extern即可。

test.c

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

extern int addNum(int,int);
extern int subNum(int,int);

static int __init start(void)
{
	printk(KERN_INFO "this is module onl oad finish\n");
	int a = 25;
	int b = 7;
	printk("<1> test add %d + %d = %d \n",a,b,addNum(a,b));
	printk("<1> test sub %d + %d = %d \n",a,b,subNum(a,b));
	return 0;
}
static void __exit end(void)
{
	printk(KERN_INFO "this is module on close last\n");
}

module_init(start);
module_exit(end);
MODULE_AUTHOR("yyjeqhc");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("simple hello");

Makefile改一下对应的名称即可。

image

重新make,然后装载,可以看见调用了上面hello.ko中的函数

本来以为普通的C程序也能调用呢,但是好像不太行。

这篇关于记录CentOS7下编写驱动模块的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!