博客
关于我
Linux设备模型(5)_device和device driver
阅读量:793 次
发布时间:2023-02-05

本文共 2411 字,大约阅读时间需要 8 分钟。

Linux设备模型深入分析

在Linux内核开发中,设备模型是构建系统基础的核心机制。device和device_driver是这一机制的核心数据结构,它们定义了设备和驱动的抽象、交互和管理方式。本文将从设备模型的基本概念出发,深入探讨struct device和struct device_driver的定义与使用方法,以及设备驱动开发的实践步骤。


struct device和struct device_driver的定义

在Linux内核源代码中,设备模型的核心数据结构是struct device和struct device_driver。这些结构定义了设备和驱动的基本属性,使其能够在内核中注册、管理并与其他模块交互。

struct device

struct device是设备模型的核心数据结构,它包含以下关键字段:

  • parent:设备的父设备,通常是设备所在的总线(bus)或控制器。
  • p:设备的私有数据指针,用于存储设备的私有信息,如子设备链表等。
  • kobj:对应的struct kobject,用于设备的K对象操作。
  • init_name:设备的初始化名称,用于设备的命名。
  • type:设备类型的结构体指针,用于描述设备的具体类型。
  • bus:设备所属的总线类型。
  • driver:设备对应的驱动模块。
  • platform_data:平台相关的数据指针,供驱动使用。
  • power:电源管理相关的数据结构。
  • pins:针(PINCTRL)相关的数据,暂不深入描述。
  • numa_node:NUMA节点信息,暂不深入描述。
  • dma_maskarchdata:DMA相关数据,暂不深入描述。
  • devt:设备号,用于sys文件系统中的设备节点。
  • class:设备所属的类别。
  • groups:设备的文件属性组。
  • release:设备释放回调函数。
  • struct device_driver

    struct device_driver是设备驱动的数据结构,定义了驱动的基本属性:

  • name:驱动的名称,非常重要,需与设备名称一致。
  • bus:驱动所驱动设备的总线设备。
  • owner:驱动的所属模块。
  • mod_name:用于内建模块的名称,暂不深入描述。
  • suppress_bind_attrs:抑制绑定和解绑属性的功能。
  • of_match_table:匹配设备树节点的匹配表。
  • acpi_match_table:匹配ACPITree节点的匹配表。
  • probe:驱动的初始化回调函数。
  • remove:驱动的移除回调函数。
  • shutdown:驱动的关闭回调函数。
  • suspendresume:驱动的挂起和恢复回调函数。
  • pm:电源管理的回调函数集合。
  • groups:驱动的文件属性组。
  • p:驱动的私有数据指针。

  • 设备驱动开发的基本步骤

    在设备模型框架下,设备驱动的开发主要包括以下步骤:

    步骤1:注册struct device

    在设备模型中,设备的注册过程包括:

  • 设备初始化:使用device_initialize函数初始化设备结构。
  • 设备注册:调用device_register函数将设备注册到内核中。
  • 设备创建:通过device_create函数创建设备实例,并指定设备名称和操作接口。
  • 步骤2:注册struct device_driver

    驱动的注册过程包括:

  • 驱动初始化:使用driver_initialize函数初始化驱动结构。
  • 驱动注册:调用driver_register函数将驱动注册到内核中。
  • 驱动绑定:在设备模型中将驱动与设备绑定,通常通过device_bind_driver函数实现。
  • 驱动的生命周期管理

    驱动的生命周期由以下回调函数控制:

    • probe:在设备绑定到驱动时调用,用于初始化驱动逻辑。
    • remove:在设备解绑或驱动卸载时调用,用于清理驱动资源。
    • shutdown:在系统关机或设备关闭时调用,用于驱动的关闭操作。
    • suspendresume:在电源管理状态变化时调用,用于驱动的挂起和恢复。

    设备驱动的probe时机

    驱动的probe回调函数是设备驱动开发的入口点,其触发时机主要包括以下几种:

  • 设备注册时:当设备通过device_registerdevice_create函数注册时,内核会自动触发驱动的probe操作。
  • 驱动注册时:当驱动通过driver_register函数注册时,内核会自动触发驱动的probe操作。
  • 手动绑定时:通过device_attachdriver_attach函数手动触发驱动的probe操作。
  • 自行调用:驱动可以通过device_bind_driver函数主动调用probe回调函数。

  • 其他杂项

    1. device_attribute和driver_attribute

    设备和驱动的文件属性是通过sysfs接口暴露到用户空间的。设备的文件属性由struct device_attribute定义,驱动的文件属性由struct driver_attribute定义。

    2. device_type

    device_type是设备类型的数据结构,用于描述设备的类型信息。它包括设备名称、文件属性组、 uevent回调函数、设备节点生成函数等功能。

    3. root device

    在sysfs中,/sys/devices目录下包含所有设备。通过__root_device_registerroot_device_unregister函数,可以注册和注销虚拟根设备。


    总结

    通过对struct device和struct device_driver的定义、设备驱动开发步骤以及设备模型的内部机制的分析,可以看出设备模型为Linux内核设备管理提供了强大的抽象和管理能力。设备和驱动的注册、生命周期管理以及文件属性的暴露,都依赖于这些数据结构和内核框架的完善。

    转载地址:http://dqkfk.baihongyu.com/

    你可能感兴趣的文章
    Linux安装KVM
    查看>>
    Linux安装Mysql5.7.23详细教程(CentOS7)
    查看>>
    Linux安装mysql:FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql
    查看>>
    Linux安装Oracle 11g和postgrepSQL数据库(附安装包)
    查看>>
    Linux安装pip没有权限,linux/unix没网环境下安装python、pip以及第三方库
    查看>>
    Linux安装postgresql及基础操作
    查看>>
    linux安装rabbitmq3.7.15教程
    查看>>
    Linux安装Redis 与 Redis基本语法
    查看>>
    Linux安装Redis及配置(超详细)
    查看>>
    Linux安装telnet - telnet不能用!提示:-bash: telnet: command not found
    查看>>
    Linux安装Tomcat
    查看>>
    Linux安装与配置
    查看>>
    Linux安装与配置SSH服务
    查看>>
    Linux安装卸载Mysql数据库
    查看>>
    linux安装卸载软件
    查看>>
    linux安装宋体
    查看>>
    LINUX安装源码软件经典三部曲
    查看>>
    linux安装目录
    查看>>
    Linux定时Job:crontab -e 与 /etc/crontab 的区别
    查看>>
    linux实用命令详解(新建删除复制文件夹,挂载) 转
    查看>>