驱动模块开发下-作业

1,编写最简单的Hello驱动模块实验

#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");

2,编写驱动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  $(ROOT_DIR)/drv_module

else
obj-m += hello.o
#用于指定到底编译哪个代码--hello.c

endif

3,学会装载和卸载模块实验

[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创建对应文件夹即可。

4,驱动模块参数传递实验

#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

5,驱动模块符号导出实验

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是调用模块迟到早退。