Linux设备模型(5)_device和device driver
发布日期:2025-04-10 12:30:30 浏览次数:8 分类:精选文章

本文共 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内核设备管理提供了强大的抽象和管理能力。设备和驱动的注册、生命周期管理以及文件属性的暴露,都依赖于这些数据结构和内核框架的完善。

    上一篇:Linux设备驱动开发学习(4):字符设备驱动(未完)
    下一篇:linux设备共享,Linux中的存储设备共享之target

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月28日 13时25分55秒