编写最小的linux驱动


今天我们就来编写一个最简的linux驱动。

一、最小驱动模块

在这里插入图片描述

二、驱动的处理方式

Linux内核针对驱动的处理有一下两种方式:

第一种方式:把所有需要的功能全部编译到内核中,这种方法会导致重新添加或者删除功能的时候,需要重新编译内核。
第二种方式:动态的添加模块,也就是以模块的方式添加驱动。

三、linux内核模块结构

一个linux内核模块主要由一下几个部分组成。

1.模块加载函数
当通过insmod命令加载内核模块的时候,模块的加载函数会自动调用到内核运行,完成模块的初始化工作。
2.模块卸载函数
当通过rmmod命令卸载内核模块的时候,模块的卸载函数会自动被调用到内核运行,完成模块的卸载工作,完成与模块卸载函数相反的功能。
3.模块的许可声明
LICENSE声明描述内核的许可权限,如果不声明LICENSE,模块加载的时候,会受到内核被污染的警告。
4.模块作者信息

四、编写mini_linux_module

1. 编写mini_linux_module.c

#include <linux/init.h>
/* 包含初始化宏定义的头文件,代码中的module_init和module_exit在此文件中*/
#include <linux/module.h>
/* 包含初始化加载模块的头文件,代码中的MODULE_LICENSE在此头文件中 */


MODULE_LICENSE("Dual BSD/GPL");
/* 声明是开源的,没有内核版本限制 */
MODULE_AUTHOR("luatao");
/* 声明作者 */

static int luatao_init(void)
{

	printk(KERN_EMERG"luatao world enter!\n");
	/* 打印信息,KERN_EMERG表示紧急信息 */
	return 0;
}


static void luatao_exit(void)
{
	printk(KERN_EMERG"luatao world exit!\n");
}

/* 初始化函数 */
module_init(luatao_init);
/* 卸载函数 */
module_exit(luatao_exit);



2.printk等级

打印函数 printk 是分级的,它的 8 个级别如下:

#define KERN_EMERG 0
/紧急事件消息,系统崩溃之前提示,表示系统不可用/
#define KERN_ALERT 1
/报告消息,表示必须立即采取措施/
#define KERN_CRIT 2
/临界条件,通常涉及严重的硬件或软件操作失败/
#define KERN_ERR 3
/错误条件,驱动程序常用 KERN_ERR 来报告硬件的错误/
#define KERN_WARNING 4
/警告条件,对可能出现问题的情况进行警告/
#define KERN_NOTICE 5
/正常但又重要的条件,用于提醒/
#define KERN_INFO 6
/提示信息,如驱动程序启动时,打印硬件信息/
#define KERN_DEBUG 7
/调试级别的消息/

3.脚本文件Makefile

#!/bin/bash
#通知编译器我们要编译模块的哪些源码
#这里是编译mini_linux_module.c这个文件编译成中间文件mini_linux_module.o
obj-m +=  mini_linux_module.o

#源码目录变量,这里用户需要根据实际情况选择路径
#作者是将linux源码拷贝到目录/home/luatao/4412_test/iTop4412_Kernel_3.0
KDIR := /home/luatao/4412_test/iTop4412_Kernel_3.0

#当前目录变量
PWD ?= $(shell pwd)

#make命令默认寻找第一个目标
#make -c就是指调用执行的路径
#$(KDIR)linux的源码目录
#$(PWD)当前目录变量
# modules 要执行的操作
all:
	make -C $(KDIR) M=$(PWD) modules
	
#make clean执行的操作时删除后缀为o的文件
clean:
	rm -rf *.o

五、编译驱动模块

在/home/luatao目录下新建文件夹mini_linux_module
执行命令

mkdir mini_linux_module

在这里插入图片描述
将前面编写好的mini_linux_module.c和对应的makefile拷贝到该文件夹下

sudo cp /home/samba/mini_linux_module.c  .
sudo cp /home/samba/Makefile  .

在这里插入图片描述
执行make命令
在这里插入图片描述
编译成功。
mini_linux_module.ko”,这个文件就是最后要加载到开发板中的文件。

六、开发板运行

使用tftp将这个文件下载到开发板上
先将这个文件复制到tftp文件夹下

sudo cp  /home/luatao/mini_linux_module/mini_linux_module.ko .

在这里插入图片描述
下载到开发板

tftp -g -l mini_linux_module.ko 192.168.1.6

在这里插入图片描述

七、加载卸载驱动

1.加载驱动

insmod mini_linux_module.ko

2.查看驱动

lsmod

在这里插入图片描述

3.卸载驱动

rmmod mini_linux_module

如果报错
在这里插入图片描述
需要新建目录

mkdir /lib/modules

在这里插入图片描述
又报错
在这里插入图片描述

mkdir /lib/modules/3.0.15

再次执行成功
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值