设备驱动程序中由主设备号和次设备号组成的设备子系统

本文深入解析字符设备驱动程序的工作原理,包括主设备号与次设备号的组合使用,设备结构体在内核中的作用,以及如何通过设备号查找特定设备。同时,详细介绍了设备子系统的创建过程,从注册主设备号到生成设备节点的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:一个字符设备驱动程序对应一组设备驱动程序的操作函数file_operations,但是一个设备可以有多个次设备,由次设备号代表。主设备号(高12位)和次设备号(低20位)组成的设备号指向一个具体的设备,该设备在内核中用一个结构体表示,里面保存自身特有的数据内容,打开设备文件时,在驱动的操作函数里面根据次设备号找到描述链表中的结构体。

 

在结构体链表中,保存了在probe中初始化好的该设备的结构体,在需要的时候根据次设备号在链表中获取。

创建设备子系统:

  1. 注册主设备号,register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
  2. 使用设备号(主设备号+次设备号)注册字符设备驱动register_chrdev_region(dev, VIDEO_NUM_DEVICES, VIDEO_NAME);
  3. 创建struct class,class_register(&video_class);
  4. 创建设备节点,vdev->dev.class = &video_class;和device_register(&vdev->dev);//注册设备

把class作为全局变量,在设备节点生成的函数中调用device_register函数生成设备节点文件。

struct class、struct device的区别

  1.  class 指的是 设备类(device classes),是对于设备的高级抽象
  2. device用于描述设备相关的信息设备之间的层次关系,以及设备与总线、驱动的关系。

一个 struct class 结构体类型变量对应一个类,内核提供了class_create() 函数,可以用它来创建一个类,这个类存放于 sysfs 下面。
    一旦创建了类,再调用 device_create() 函数在 /dev 目录下创建相应的设备节点。

注意:使用device创建设备节点,device的class需要初始化为class_create函数生成的class。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值