您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

教你写第一个Linux设备驱动程序

时间:2020-04-10 10:13:32  来源:  作者:

首先说明:写这个第一个linux设备驱动程序的目的是熟悉Linux驱动的框架以及编程流程,所以是通过打印的信息来观察程序运行的情况,并不是真正的实现了某一个具体设备的驱动,可以类比于C语言编程中的“Hello World”。

Linux下的设备驱动架构如下图所示:

教你写第一个Linux设备驱动程序

 

在本篇文章中以first_device_driver为例进行介绍

一般来说,写出完整的设备驱动程序需要如下几个步骤:

  1. 写出first_drv_open、first_drv_write、first_drv_read和first_drv_ioctl等函数;
  2. 定义file_operations结构体并填充其成员函数first_drv_open、first_drv_write、first_drv_read和first_drv_ioctl等;
  3. 模块加载函数,通过register_chrdev将字符设备注册到内核中;
  4. 写驱动的入口函数;
  5. 写驱动的出口函数;
  6. 通过module_init()来修饰驱动入口函数;
  7. 通过module_exit()来修饰驱动出口函数;
  8. 声明模块许可证;

下面进行详细讲解

步骤一:在新创建的.c文件中编写如图例中的代码

教你写第一个Linux设备驱动程序

 


教你写第一个Linux设备驱动程序

 

步骤二:编写Makefile脚本

教你写第一个Linux设备驱动程序

 

值得提出的一点是,编写Makefile是Linux驱动工程师必备的基础,但是要明白我们并不需要完全的掌握Makefile的语法及编程,我们只需要能模仿着其他工程的Makefile文件写出我们自己想要的Makefile文件即可。

步骤三:在对应目录中执行make命令,生成.ko模块文件

这一步骤较为简单,只是在相应目录输入make命令即可。

步骤四:通过U盘或者nfs网络文件系统将该.ko文件加载到内核中

我们在加载驱动模块之前可以先通过命令:cat /proc/devices来查看字符主设备号是否已经被占用。proc文件系统是Linux在运行时存在于内存中的文件系统,它记录着系统运行的实时信息,当关闭系统时,proc文件系统也随之释放。

然后可通过命令:insmod first_drv.ko将模块挂载到内核, 通过命令:cat /proc/devices可以观察first_drv设备是否已经挂载成功;另外也可以通过modprobe来加载驱动模块,这两者的区别在于modprobe可以解决加载模块时的依赖关系,它是通过/lib/modules/#uname -r/modules.dep(.bb)文件来查找依赖关系的,而insmod不能解决模块间的依赖问题。

步骤五:创建dev/first_driver设备节点

通过命令:mknod /dev/first_driver 100 0 来创建设备节点。

步骤六:编写应用程序进行测试

测试的应用程序如下:

教你写第一个Linux设备驱动程序

 

在这里我们可以发现测试程序里的open()函数实际就是调用了驱动中的first_drv_open()函数,而write()函数实际调用了驱动中的first_drv_write()函数。本质上是这样的一个执行过程:用户空间的open()函数->文件系统的sys_open()函数->驱动的first_drv_open()函数。

另外很重要的一点,上文中图例中的程序是需要手动创建设备节点,从而提供给用户程序访问的,如此一来当驱动模块较多的时候就很麻烦,所以Linux也提供自动创建设备节点的接口,建议使用自动创建设备节点的机制。如下是自动创建设备节点的方法:

1、首先创建一个class设备类,然后在class类下,创建一个class_device,即在类下面创建类的设备;

2、在驱动入口函数中添加步骤:firstdrv_class= class_create(THIS_MODULE,"first_drv");irstdrv_class_devs=class_device_create(firstdrv_class,NULL,MKDEV(major,0),NULL,"first_drv");

3、在驱动出口函数中添加:class_device_unregister(firstdrv_class_devs);class_destroy(firstdrv_class);

这个自动创建设备节点的功能是基于Linux支持的热拔插功能,Linux内核中每当设备出现变动时,都会处理对应的信息,使用户程序对/dev目录下的设备进行操作。

最后,此驱动程序运行的实际效果就是打印信息,这个Linux设备驱动例程可以类比于C语言中的“Hello World”例程,希望可以帮助大家初步认识Linux的设备驱动程序。



Tags:驱动程序   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
菜单驱动程序简介菜单驱动程序是通过显示选项列表从用户那里获取输入并允许用户从选项列表中选择输入的程序。菜单驱动程序的一个简单示例是 ATM(自动取款机)。在交易的情况下...【详细内容】
2021-12-27  Tags: 驱动程序  点击:(4)  评论:(0)  加入收藏
对于计算机用户,基本都听过或者安装过驱动程序,每当我们将新硬件接入电脑主板上时,需要安装对应的驱动程序才能让硬件正常工作。有不少用户在安装驱动程序时出现驱动不匹配,或者...【详细内容】
2021-03-16  Tags: 驱动程序  点击:(127)  评论:(0)  加入收藏
英特尔DCH显卡驱动27.20.100.8336版本现已可用于Windows 10 1709及以后版本。新版显卡驱动唯一的主要变化是改进了对部分游戏的支持,除此之外就是常规BUG修复。在发布说明中,...【详细内容】
2020-06-28  Tags: 驱动程序  点击:(144)  评论:(0)  加入收藏
• Ubuntu 发行商 Canonical 将参加微软欧洲虚拟开源峰会 • 树莓派支持 Vulkan 最新进展:通过 70000 项测试 • 谷歌浏览器开始隐藏 URL 详细路径,未来地址栏...【详细内容】
2020-06-16  Tags: 驱动程序  点击:(53)  评论:(0)  加入收藏
首先说明:写这个第一个Linux设备驱动程序的目的是熟悉Linux驱动的框架以及编程流程,所以是通过打印的信息来观察程序运行的情况,并不是真正的实现了某一个具体设备的驱动,可以类...【详细内容】
2020-04-10  Tags: 驱动程序  点击:(37)  评论:(0)  加入收藏
这是一款免费的Mac应用程序,这款软件能够可以构建Mac,为自己的硬件平台创建的驱动程序来运行。有了这款软件大家就可以让计算机加载存储在其存储设备上的所有其他操作系统程序...【详细内容】
2020-01-16  Tags: 驱动程序  点击:(75)  评论:(0)  加入收藏
最受欢迎和最有用的是USB 3.0。它快速,通用,几乎可以在任何现代设备上找到,无论是PC台式机,MacBook还是智能手机。但是你需要合适的驱动程序才能使它工作,如果你的Windows PC或...【详细内容】
2019-07-17  Tags: 驱动程序  点击:(660)  评论:(0)  加入收藏
▌简易百科推荐
本文分为三个等级自顶向下地分析了glibc中内存分配与回收的过程。本文不过度关注细节,因此只是分别从arena层次、bin层次、chunk层次进行图解,而不涉及有关指针的具体操作。前...【详细内容】
2021-12-28  linux技术栈    Tags:glibc   点击:(3)  评论:(0)  加入收藏
摘 要 (OF作品展示)OF之前介绍了用python实现数据可视化、数据分析及一些小项目,但基本都是后端的知识。想要做一个好看的可视化大屏,我们还要学一些前端的知识(vue),网上有很多比...【详细内容】
2021-12-27  项目与数据管理    Tags:Vue   点击:(2)  评论:(0)  加入收藏
程序是如何被执行的  程序是如何被执行的?许多开发者可能也没法回答这个问题,大多数人更注重的是如何编写程序,却不会太注意编写好的程序是如何被运行,这并不是一个好...【详细内容】
2021-12-23  IT学习日记    Tags:程序   点击:(9)  评论:(0)  加入收藏
阅读收获✔️1. 了解单点登录实现原理✔️2. 掌握快速使用xxl-sso接入单点登录功能一、早期的多系统登录解决方案 单系统登录解决方案的核心是cookie,cookie携带会话id在浏览器...【详细内容】
2021-12-23  程序yuan    Tags:单点登录(   点击:(8)  评论:(0)  加入收藏
下载Eclipse RCP IDE如果你电脑上还没有安装Eclipse,那么请到这里下载对应版本的软件进行安装。具体的安装步骤就不在这赘述了。创建第一个标准Eclipse RCP应用(总共分为六步)1...【详细内容】
2021-12-22  阿福ChrisYuan    Tags:RCP应用   点击:(7)  评论:(0)  加入收藏
今天想简单聊一聊 Token 的 Value Capture,就是币的价值问题。首先说明啊,这个话题包含的内容非常之光,Token 的经济学设计也可以包含诸多问题,所以几乎不可能把这个问题说的清...【详细内容】
2021-12-21  唐少华TSH    Tags:Token   点击:(10)  评论:(0)  加入收藏
实现效果:假如有10条数据,分组展示,默认在当前页面展示4个,点击换一批,从第5个开始继续展示,到最后一组,再重新返回到第一组 data() { return { qList: [], //处理后...【详细内容】
2021-12-17  Mason程    Tags:VUE   点击:(14)  评论:(0)  加入收藏
什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How) 硬件配...【详细内容】
2021-12-16  软件测试小p    Tags:性能调优   点击:(20)  评论:(0)  加入收藏
Tasker 是一款适用于 Android 设备的高级自动化应用,它可以通过脚本让重复性的操作自动运行,提高效率。 不知道从哪里听说的抖音 app 会导致 OLED 屏幕烧屏。于是就现学现卖,自...【详细内容】
2021-12-15  ITBang    Tags:抖音防烧屏   点击:(25)  评论:(0)  加入收藏
11 月 23 日,Rust Moderation Team(审核团队)在 GitHub 上发布了辞职公告,即刻生效。根据公告,审核团队集体辞职是为了抗议 Rust 核心团队(Core team)在执行社区行为准则和标准上...【详细内容】
2021-12-15  InfoQ    Tags:Rust   点击:(25)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条