字符设备驱动程序

本文介绍了Linux系统中字符设备的基础知识,包括设备驱动的分类,字符设备、字符设备驱动与用户空间程序的关系,以及设备号的主设备号和次设备号概念。详细阐述了字符设备在内核中的表示,如何通过cdev结构体和file_operations接口进行操作,并讨论了用户空间如何通过系统调用访问设备。同时,文章提到了设备文件在/dev目录下的表示及其设备号的用途。
摘要由CSDN通过智能技术生成

一、字符设备基础知识

1、设备驱动分类

linux系统将设备分为3类:字符设备、块设备、网络设备。
字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据。字符设备是面向流的设备,常见的字符设备有鼠标、键盘、串口、控制台和LED设备等。
块设备:是指可以从设备的任意位置读取一定长度数据的设备。块设备包括硬盘、磁盘、U盘和SD卡等。
每一个字符设备或块设备都在/dev目录下对应一个设备文件。linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备。
在这里插入图片描述

2、字符设备、字符设备驱动与用户空间访问该设备的程序三者之间的关系

在这里插入图片描述
在Linux内核中:

  • 使用cdev结构体来描述字符设备;
  • 通过其成员dev_t来定义设备号(分为主、次设备号)以确定字符设备的唯一性;
  • 通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open()、read()、write()等;

在Linux字符设备驱动中:

  • 模块加载函数通过 register_chrdev_region( ) 或 alloc_chrdev_region(
    )来静态或者动态获取设备号;
  • 通过 cdev_init( ) 建立cdev与 file_operations之间的连接,通过
  • cdev_add( ) 向系统添加一个cdev以完成注册; 模块卸载函数通过cdev_del( )来注销cdev,通过unregister_chrdev_region( )来释放设备号;

用户空间访问该设备的程序:

  • 通过Linux系统调用,如open( )、read( )、write( ),来“调用”file_operations来定义字符设备驱动提供给VFS的接口函数;

3. 字符设备驱动模型

在这里插入图片描述

二、设备号

1. 主设备号和次设备号

对字符设备的访问是通过文件系统内的设备名称进行的,那些名称被称为特殊文件、设备文件,或者简单称之为文件系统树的节点,它们通常位于/dev目录。字符设备驱动程序的设备文件可通过ls -l命令输出的第一列中的"c"来识别。块设备也出现在/dev下,由字符"b"标识。
在/dev/下执行ls -l ,可在设备文件项的最后修改日期前看到两个数(用逗号分隔),这个位置通常显示的是文件的长度,而对设备文件,这两个数就是相应设备的主设备号和次设备号,左边红框为主设备号,右边为次设备号
在这里插入图片描述

  • 主设备号标识设备对应的驱动程序。例如,/dev/sda和/dev/sda1由驱动程序8管理
  • 次设备号由内核使用,用于正确确定设备文件所指的设备,我们可以通过次设备号获得一个指向内核设备的直接指针,也可以将次设备号当做设备本地数组的索引。

cdev结构体中dev成员定义了设备号,而dev_t是4个字节,高12位表示主设备号,低20位表示次设备号。

设备号相关操作 :

/*通过主设备号和次设备号获取dev*/
dev =  MKDEV(int major,int minor);
#define MINORBITS    20
#define MINORMASK    ((1U << MINORBITS) - 1)
/*通过dev获取主设备号*/
#define MAJOR(dev)    ((unsigned int) ((dev) >> MINORBITS))
/*通过dev获取次设备号*/
#define MINOR(dev)    ((unsigned int) ((dev) & MINORMASK))
//通过major和minor构建设备号
#define MKDEV(ma,mi)    (((ma) << MINORBITS) | (mi))</span>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值