0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何写一个Linux设备驱动程序

Wildesbeast 来源:嵌入式在左C语言在右 作者:嵌入式在左C语言在 2020-04-12 10:13 次阅读

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

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

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

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

写出first_drv_open、first_drv_write、first_drv_read和first_drv_ioctl等函数;

定义file_operations结构体并填充其成员函数first_drv_open、first_drv_write、first_drv_read和first_drv_ioctl等;

模块加载函数,通过register_chrdev将字符设备注册到内核中;

写驱动的入口函数;

写驱动的出口函数;

通过module_init()来修饰驱动入口函数;

通过module_exit()来修饰驱动出口函数;

声明模块许可证;

下面进行详细讲解

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

步骤二:编写Makefile脚本

值得提出的一点是,编写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 来创建设备节点。

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

测试的应用程序如下:

在这里我们可以发现测试程序里的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的设备驱动程序。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11295

    浏览量

    209348
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136709
  • 驱动程序
    +关注

    关注

    19

    文章

    834

    浏览量

    48026
收藏 人收藏

    评论

    相关推荐

    linux驱动程序的主要流程和功能

    驱动程序是用于控制和管理硬件设备的软件模块,它主要负责与设备进行交互,通过操作设备的寄存器和接口,实现对硬件的控制和访问。在Linux系统中
    的头像 发表于 12-08 14:56 2460次阅读

    如何写简单的字符设备驱动程序

    如何写简单的字符设备驱动程序
    发表于 12-23 06:26

    linux设备驱动程序pdf(第三版)

    linux设备驱动程序是经典著作《Linux 设备驱动程序》的第三版。该版本已针对
    发表于 09-10 11:42 0次下载

    设备驱动的入门教程 (教你如何写驱动)

    设备驱动的入门教程 (教你如何写驱动)
    发表于 03-28 09:44 61次下载

    Linux设备驱动程序开发

    本文主要讲述的是Linux设备驱动程序开发。
    发表于 04-22 16:37 41次下载

    Linux设备驱动程序的编写

    本站提供的Linux设备驱动程序的编写资料,希望对你的学习有帮助。 世界各地都有人在钻研Linux内核,大多是在
    发表于 05-25 16:24 108次下载

    Linux字符设备驱动程序的实现

    Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接
    发表于 10-21 09:54 0次下载

    Linux系统网络驱动程序的编写

    驱动程序编写 .Linux系统设备驱动程序概述 1.1 Linux
    发表于 11-07 10:40 0次下载

    可动态安装的Linux设备驱动程序

    为了增跟内核的灵活性和为了方便,设各驱动程序应被设计为可动态安装的内核模块。于是,典型的Linu
    发表于 04-04 10:56 1001次阅读

    Linux设备驱动程序的平台驱动程序和字符驱动程序介绍

    了解Linux设备驱动程序的基础知识,重点介绍平台驱动程序和字符驱动程序。 提出了简单的平台驱动程序
    的头像 发表于 11-27 06:32 4300次阅读

    如何为Linux编写用户空间设备驱动程序

    了解如何为Linux编写用户空间设备驱动程序。 用户空间驱动程序为某些设备提供内核空间驱动程序
    的头像 发表于 11-22 07:04 3754次阅读

    如何写linux pci设备驱动程序

    PCI总线应用领域及其广泛并且令人惊奇。不同的pci设备有不同的需求以及不同的问题。因此,在linux内核中pci层支持就非常重要啦。本文档就是想为驱动程序设计开发人员解决pci处理
    发表于 04-02 14:38 510次阅读

    米尔科技LINUX设备驱动程序教程

    本书是经典著作《Linux设备驱动程序》的第三版。
    的头像 发表于 11-25 09:10 2071次阅读
    米尔科技<b class='flag-5'>LINUX</b><b class='flag-5'>设备</b><b class='flag-5'>驱动程序</b>教程

    linux驱动程序如何加载进内核

    ,需要了解Linux内核的基本概念和API。以下是些关键概念: 1.1 内核模块:Linux内核模块是种动态加载和卸载的代码,可以在不重新启动系统的情况下加载和卸载。
    的头像 发表于 08-30 15:02 444次阅读

    Linux设备驱动程序分类有哪些

    Linux设备驱动程序是操作系统与硬件设备之间的桥梁,负责实现硬件设备与操作系统之间的通信和控制。Lin
    的头像 发表于 08-30 15:11 533次阅读