【linux驱动】详细剖析第一个hello word驱动程序

news2024/11/27 20:25:30

文章目录

  • 驱动程序的框架
  • 驱动程序的使用示例

驱动程序的框架

Linux 驱动的基本框架主要由模块加载函数,模块卸载函数,模块许可证声明,模块参数,模块导出符号,模块作者信息等几部分组成,其中模块参数,模块导出符号,模块作者信息是可选的部分,也就是可要可不要。剩余部分是必须有的。

模块加载函数
当加载驱动模块时,内核会通过module_init(xxx_init);执行模块加载函数,完成模块加载函数中的初始化工作。一般模块加载函数形式如下:

static int __init xxx_init(void)
{
	//驱动加载需要完成的任务
	
	return 0;
}

其中xxx处可添加独有的函数名,而后面的_init是不能够更改的,函数参数也不用更改。

模块卸载函数
卸载某模块时,内核会通过module_exit(xxx_exit);执行模块卸载函数,完成模块卸载函数中的退出工作。卸载驱动模块的函数原型如下:

//驱动的出口函数
static void __exit xxx_exit(void)
{
	// 做卸载需要完成的任务	
		
}

与驱动加载一样,其中xxx处可添加独有的函数名,而后面的_exit是不能够更改的,函数参数也不用更改。

模块许可证声明

许可证声明描述了内核模块的许可权限,如果不声明模块许可,模块在加载的时候,会收到“内核被污染(kernel tainted)”的警告。可接受的内核模块声明许可包括GPLGPL v2。具体设置驱动的许可声明可使用函数MODULE_LICENSE(“GPL v2”);,函数参数为许可类型。

模块参数
模块参数是指模块被加载的时候传递给模块的值。通常使用函数:

  • module_param_array(name, type, nump, perm):传递数组给内核
  • module_param_string(name, string, len, perm):传递字符串给内核
  • module_param(name, type, perm):传递单个参数给内核

完成参数传递。详细说明可见此文

模块导出符号
内核模块可以导出的符号,如果导出,其他模块可以使用本模块中的变量或函数。通常使用EXPORT_SYMBOL()函数导出变量或者函数。

模块作者信息
作者信息主要说明该模块是谁创作的,可使用函数 MODULE_AUTHOR(“zxj”);来指明,其中参数就是作者。

除此之外,还可以使用MODULE_DESCRIPTION()函数通过传入参数描述驱动。

驱动程序的使用示例

下面的驱动是一个最佳单的驱动源码,能够完成在加载驱动时打印“hello word”,在卸载驱动时打印“baibai”

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

// 驱动的入口函数
static int __init hello_init(void)
{
	printk(KERN_EMERG"hello word!\r\n");

	return 0;
}

//驱动的出口函数
static void __exit hello_exit(void)
{
	printk(KERN_EMERG"baibai\r\n");
}


module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("zxj");
MODULE_DESCRIPTION("output hello when insmod ;output baibai when rmmod");

其中,printk()函数用于内核打印数据,而函数参数中的KERN_EMERG用来描述打印信息的优先级。

在将内核编译完成生成的.ko文件上传到开发板后:

  • 通过insmod + 驱动名.ko可加载驱动到内核。

  • 通过lsmod可查看当前已经加载成功的驱动。

  • 通过ls /dev/设备名可查看驱动加载成功后创建的设备名。

  • 通过rmmod + 驱动名可卸载驱动。

驱动加载卸载后的执行结果如下:

在这里插入图片描述

此处需要注意,加载驱动时驱动名后面需要加上.ko,而卸载驱动时直接是驱动名即可,不需要加后缀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1399437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

钉钉副总裁李智勇:AI超级助理,提升大模型时代生产力

微软比尔盖茨此前曾预言:“五年内&#xff0c;每个人都将拥有AI私人助理Agent&#xff0c;Agent将颠覆软件行业 。” 近日以来&#xff0c;在GPT store正式上线点爆情绪之后&#xff0c;无论国内外&#xff0c;Agent都是创业圈里炙手可热的新贵。一场关于Agent创业比拼大赛&am…

探索JAVA神秘运行机制:揭秘JVM内存区域

目录 1. 前文回顾 2.内存区域的划分 2.1 存放类的方法区 2.2 程序计数器 2.3 Java虚拟机栈 2.4 Java堆内存 2.5 其他内存区域 3. 核心内存区域运行流程 4. 总结 1. 前文回顾 上一篇我们一起探索了Java的整体运行流程&#xff0c;类加载器以及类的加载机制&#xff0…

手把手教你使用 VS Code 运行和调试 Python 程序

本文以 Ubuntu 系统为例&#xff0c;介绍如何在 VS Code 上配置 Python 的编程环境&#xff0c;并把 Python 程序运行、调试起来。由于 Python 是解释型语言&#xff0c;并且 VS Code 中提供了内置的调试器可用于调试 Python 代码&#xff0c;因此配置和操作流程比调试 C/C 代码…

【 Qt 快速上手】-①- Qt 背景介绍与发展前景

文章目录 1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt的应用场景1.7 Qt的成功案例1.8 Qt的发展前景及就业分析行业发展方向就业方面的发展前景 1.1 什么是 Qt Qt 是一个跨平台的 C 图形用户界面应用程序框架。它为应用程序开发者提供了建立…

8 python快速上手

总结 总结1. 代码规范1.1 名称1.2 注释1.3 todo1.4 条件嵌套1.5 简单逻辑先处理1.6 循环1.7 变量和值 2.知识补充2.1 pass2.2 is 比较2.3 位运算 3.阶段总结 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; 总结 1. 代码规范 …

线性规划案例分享

今天想写一个最优传输的简单实现&#xff0c;结果学歪了&#xff0c;学到线性规划去了&#xff0c;这里我发现了一个宝藏网站 虽然是讲计量经济的&#xff0c;但是里面提供的公式和代码我很喜欢&#xff0c;有时间可以好好读一下 https://python.quantecon.org/lp_intro.html …

Civil 3D安装教程,免费使用,带安装包和工具,一分钟轻松搞的安装

前言 Civil 3D是一款面向基础设施行业的建筑信息模型&#xff08;BIM&#xff09;解决方案。它为基础设施行业的各类技术人员提供了强大的设计、分析以及文档编制功能&#xff0c;广泛适用于勘察测绘、岩土工程、交通运输、水利水电、市政给排水、城市规划和总图设计等众多领域…

什么是比特币?

比特币 比特币 &#xff08;英语&#xff1a;Bitcoin&#xff0c;缩写&#xff1a;BTC &#xff09;是一种基于 去中心化&#xff0c;采用 点对点网络&#xff0c;开放源代码&#xff0c;以 区块链 作为底层技术的 加密货币。比特币由 中本聪&#xff08;Satoshi Nakamoto&…

vscode配置web开发环境(WampServer)

这里直接去下载了集成的服务器组件wampserver&#xff0c;集成了php&#xff0c;MySQL&#xff0c;Apache 可能会出现安装问题&#xff0c;这里说只有图上这些VC包都安装了才能继续安装&#xff0c;进入报错里提供的链接 在页面内搜索相关信息 github上不去可以去镜像站 下载…

机器视觉技术与应用实战(平均、高斯、水平prewitt、垂直prewitt、水平Sobel、垂直Sobel、拉普拉斯算子、锐化、中值滤波)

扯一点题外话&#xff0c;这一个月经历了太多&#xff0c;接连感染了甲流、乙流&#xff0c;人都快烧没了&#xff0c;乙流最为严重&#xff0c;烧了一个星期的38-39度&#xff0c;咳嗽咳到虚脱。还是需要保护好身体&#xff0c;感觉身体扛不住几次连续发烧&#xff01;&#x…

Redis 持久化之 RDB AOF

1、简介 Redis 是一个基于内存的 key-value 类型的 Nosql 数据库&#xff0c;经常用来做缓存操作&#xff0c;但是一旦Redis 宕机&#xff0c;重启之后数据会丢失&#xff0c;因此&#xff0c;需要将内存数据进行持久化&#xff0c;保证服务重启后数据能够恢复之前的状态。Redi…

淘金城镇新人赚钱攻略(定制开发·源码定制智创开发)

​ 在淘金城镇中&#xff0c;玩家可以通过完成任务、升级角色、参与活动等方式获得丰厚的奖励和经验值&#xff0c;这不仅可以提升角色的能力&#xff0c; 还可以让玩家在游戏中获得更多的乐趣。最重要的是&#xff0c;淘金城镇的玩法非常精致&#xff0c;玩家可以通过游戏中…

C++——vector的使用及其模拟实现

vector的使用及其模拟实现 文章目录 vector的使用及其模拟实现1. vector的使用1.1 构造函数construct1.2 获取当前存储的数据个数size()和最大容量capacity()1.3 访问1.3.1 operator[]运算符重载1.3.2 迭代器访问1.3.3 范围for 1.4 容量相关reserve()和resize()1.5 增&#xff…

软件测试的工作描述

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【算法练习Day50】下一个更大元素II接雨水

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 下一个更大元素II接雨水单调…

ESP32-CAM带摄像头的开发板使用-环境安装

首先是需要在开发板上搭建环境&#xff0c;其实就是将安装包给下载到开发板上&#xff0c;然后程序能在开发板上运行并控制开发板&#xff0c;这一下载过程也称为烧录。 首先我这里使用ESP32-CAM纯粹是因为便宜&#xff0c;所以买啦 哈哈哈 我买的是30多带摄像头的&#xff0c…

SpringMVC传递数据给前台

SpringMVC有三种方式将数据提供给前台 第一种 使用Request域 第二种 使用Model&#xff08;数据默认是存放在Request域中&#xff09; 与第一种方式其实是一致的 第三种 使用Map集合&#xff08;数据默认是存放在Request域中&#xff09;

虹科分享 | 汽车技术的未来:Netropy如何测试和确保汽车以太网的性能

文章速览&#xff1a; 什么是汽车以太网&#xff1f;汽车以太网的用途是什么&#xff1f;汽车以太网的测试要求是什么&#xff1f;流量生成如何帮助测试汽车以太网&#xff1f; 如今汽车不再是单纯的代步工具&#xff0c;把人从A点带到B点&#xff0c;同时还配备了车载信息娱乐…

深入数仓离线数据同步:问题分析与优化措施

一、前言 在数据仓库领域&#xff0c;离线数仓和实时数仓是常见的两种架构类型。离线数仓一般通过定时任务在特定时间点&#xff08;通常是凌晨&#xff09;将业务数据同步到数据仓库中。这种方式适用于对数据实时性要求不高&#xff0c;更侧重于历史数据分析和报告生成的场景…

大语言模型无代码构建知识图谱概述

2023年3月15日&#xff0c;ChatGPT4.0的横空出世&#xff0c;将人们对大语言模型的关注推到了风口浪尖。由于其在智能问答、翻译以及文本生成等工作任务上的卓越表现&#xff0c;业界一度出现了不再需要发展知识图谱相关技术的观点&#xff0c;知识图谱相关概念严重受挫。无可置…