Linux字符设备驱动程序解析

Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得linux的设备操作犹如文件一般。在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,如open()、close()、read()、write() 等。

Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的形式进行;而块设备则以整个数据缓冲区的形式进行。字符设备的驱动相对比较简单。

下面我们来假设一个非常简单的虚拟字符设备:这个设备中只有一个4个字节的全局变量int global_var,而这个设备的名字叫做"globalvar"。对"globalvar"设备的读写等操作即是对其中全局变量global_var的操作。

驱动程序是内核的一部分,因此我们需要给其添加模块初始化函数,该函数用来完成对所控设备的初始化工作,并调用register_chrdev() 函数注册字符设备:

static int __init globalvar_init(void)
{
 if (register_chrdev(MAJOR_NUM, " globalvar ", &gobalvar_fops))
 {
  //…注册失败
 }
 else
 {
  //…注册成功
 }
}

其中,register_chrdev函数中的参数MAJOR_NUM为主设备号, "globalvar"为设备名,globalvar_fops为包含基本函数入口点的结构体,类型为file_operations。当globalvar模块被加载时,globalvar_init被执行,它将调用内核函数register_chrdev,把驱动程序的基本入口点指针存放在内核的字符设备地址表中,在用户进程对该设备执行系统调用时提供入口地址。

与模块初始化函数对应的就是模块卸载函数,需要调用register_chrdev()的"反函数"

unregister_chrdev():
static void __exit globalvar_exit(void)
{
 if (unregister_chrdev(MAJOR_NUM, " globalvar "))
 {
  //…卸载失败
 }
 else
 {
  //…卸载成功
 }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索驱动程序
, 函数
, 模块
, i2c设备驱动字符设备
, 字符
, static初始化模块
, 字符设备
, 设备
, 字符设备驱动
, linux驱动字符驱动
入口
linux字符设备驱动、linux3.0字符设备驱动、linux pcie驱动解析、linux 字符驱动、linux字符驱动程序,以便于您获取更多的相关知识。

时间: 2024-11-01 04:36:22

Linux字符设备驱动程序解析的相关文章

从零开始写linux字符设备驱动程序(二)(基于友善之臂tiny4412开发板)

上节,我们讲解了如何写第一个linux字符设备驱动程序,这节,我们将代码做一下修改. 如下: #include <linux/init.h> #include <linux/module.h> #include <linux/sched.h> #include <linux/kernel.h> #include <linux/cdev.h> #include <linux/kdev_t.h> #include <linux/fs

从零开始写linux字符设备驱动程序(三)(基于友善之臂tiny4412开发板)

这一节,我们再来看看新的知识点,这一次,我们将进一步完善这个字符设备的驱动程序. 首先,将上一节的代码做下修改: #include <linux/init.h> #include <linux/module.h> #include <linux/sched.h> #include <linux/kernel.h> #include <linux/cdev.h> #include <linux/fs.h> #include <li

Linux字符设备驱动程序总结(一)

在这之前我们已经把字符设备驱动框架和模型,包括一些机制我们都讲的非常清楚了,在这里我在给大家总结一下. 首先大家理解几个概念,像物理地址和虚拟地址,IO映射和内存映射,操作IO我总结了有以下三种方法: 第一种方法:用的时候加上 *volatile unsigned long  *adccon=NULL;volatile unsigned long  *adcdat=NULL; adccon=(volatile unsigned long *)ioremap(0x58000000,8);adcda

Linux字符设备驱动程序的框架(新写法)

这是老版本内核的的Linux驱动注册函数写法: major = register_chrdev(0, "hello", &hello_fops); /* (major,  0), (major, 1), ..., (major, 255)都对应hello_fops */ 新版本内核Linux驱动注册函数写法#define MAJOR(devid) ((unsigned int) ((devid) >> 20))  /* 主设备号 */ #define MINOR(d

Linux字符设备驱动编写流程

驱动程序编写基本流程: 1.首先是一些版本信息,没什么用,但是不能少 #define __NO_VERSION__ #include <linux/modules.h> #include <linux/version.h> char kernel_version[] = UTS_RELEASE; 2.为了把系统调用和驱动程序关联起来,需要一个非常关键的数据结构:struct file_operations.file_operations结构的每一个成员的名字都对应着一个系统调用.用

Linux字符设备驱动

1.预备知识: 应用程序.库.内核.驱动程序的关系 应用程序调用应用程序函数库完成功能应用程序以文件形式访问各种资源应用程序函数库部分函数直接完成功能     部分函数通过系统调用由内核完成   内核处理系统调用,调用设备驱动程序   设备驱动直接与硬件通信 设备类型 字符设备     对字符设备发出读/写请求时,实际的硬件I/O操作一般紧接着发生 块设备     块设备与之相反,它利用系统内存作为缓冲区 网络设备     网络设备是一类特殊的设备,它不像字符设备或块设备那样通过对应的设备文件节

linux驱动-linux字符设备驱动求助:设备号无法释放

问题描述 linux字符设备驱动求助:设备号无法释放 我在驱动中,资源释放时调用了unregister_chrdev_region函数,为什么用rmmod卸载驱动模块之后,/proc/devices里边仍能够显示我的驱动设备啊? lsmod中已经没有我写的驱动模块了. 是因为设备号没能正确释放么? 解决方案 当应用程序打开设备节点时,内核调用相应驱动程序的open()函数.可以在shell中执行以下代码来触发cmos_open()的执行: bash> cat /dev/cmos/0 当应用程序关

简单字符设备驱动程序

linux驱动程序开发步骤 1)查看原理图.数据手册,了解设备的操作方法. 2)在内核中找到相近的驱动程序,以它为模板进行开发,有时候需要从零开始. 3)实现驱动程序的初始化:比如向内核注册驱动程序,这样应用程序传入文件名时,内核才能找到相应的驱动程序. 4)设计所要实现的操作,比如open,read,write,close. 5)实现中断服务(不是必需的) 6)编译该驱动程序到中,或者用insmod命令加载. 7)测试驱动程序.    驱动框架 应用程序API接口read,open,write

Linux 字符设备驱动框架详细介绍_Linux

Linux 字符设备驱动框架 字符设备是Linux三大设备之一(另外两种是块设备,网络设备),字符设备就是字节流形式通讯的I/O设备,绝大部分设备都是字符设备,常见的字符设备包括鼠标.键盘.显示器.串口等等,当我们执行ls -l /dev的时候,就能看到大量的设备文件,c就是字符设备,b就是块设备,网络设备没有对应的设备文件.编写一个外部模块的字符设备驱动,除了要实现编写一个模块所需要的代码之外,还需要编写作为一个字符设备的代码. 驱动模型 Linux一切皆文件,那么作为一个设备文件,它的操作方