searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

关于“probe”语义

2024-12-11 08:57:52
1
0

在 Linux 驱动开发中,probe 是一个非常常见的术语,但它并不是某个单词的缩写,而是直接来源于英文单词 probe 的原义,意思是“探测”或“检查”。在驱动开发的上下文中,probe 函数的主要作用是“探测并初始化”硬件设备。


probe 的语义解释

  • 探测 (Probe): 在驱动加载时,probe 函数的主要作用是“探测”目标设备是否存在并且与当前驱动匹配,同时配置和启用设备。因此,它与单词“探针”(probe)对应的功能非常契合。
  • 检查与准备 (Test and Setup)probe 不仅用于检测设备是否存在,还负责初始化设备资源并为设备的后续操作做好准备。

为什么使用 probe

在设备驱动模型中,Linux 内核使用 probe 函数来处理设备的初始化。当某个硬件设备和驱动程序通过匹配机制(如 PCI ID 或设备树节点)被关联起来时,内核调用驱动程序的 probe 函数,以完成以下任务:

  1. 确认设备是否可以被该驱动支持。
  2. 初始化设备的硬件资源(如 I/O 内存、IRQ 等)。
  3. 注册设备相关的功能或接口(如 /dev 节点、sysfs 条目等)。

在设备驱动程序中,probe 函数是驱动与硬件设备初始化和绑定的关键步骤。简单来说,probe 是驱动用来探测和初始化硬件的函数。

probe 函数的含义:

  • 硬件检测与初始化:当一个设备驱动被加载到系统中,内核会通过匹配机制,检查驱动是否可以控制某个硬件设备。probe 函数就是在驱动和硬件匹配成功后,由内核调用的函数,用于执行设备的初始化操作。
  • 设备资源分配:通常在 probe 函数中,驱动会获取设备所需的资源(如中断号、I/O 内存等),并完成硬件的配置和必要的初始化操作。
  • 绑定驱动和设备probe 函数的调用标志着驱动程序已经“发现”并准备控制对应的设备。驱动会在 probe 中将自身与设备进行绑定,并为后续的操作(如读写、控制)做好准备。

典型的流程:

当一个设备插入系统或驱动被加载时:

  1. 设备和驱动匹配:内核会检查设备的描述信息(如 Device TreeACPI 信息、PCI/USB ID 等),与驱动中支持的设备信息进行匹配。
  2. 调用 probe 函数:如果匹配成功,内核就会调用该驱动的 probe 函数,传递一个结构体指针(通常是 struct platform_devicestruct pci_dev 等),该结构体中包含了设备的相关信息。
  3. 资源分配和初始化probe 函数中通常会进行内存分配、寄存器映射、设置中断处理、设备配置等初始化工作。
  4. 返回结果probe 函数会返回一个状态值(0 表示成功,负值表示失败)。如果返回失败,驱动将不会绑定到设备。

probe 在驱动模型中的具体作用

在 Linux 驱动框架(如 platform_driverpci_driveri2c_driver 等)中,probe 是一个约定的函数名称,由内核调用。其常见定义如下:

static int my_driver_probe(struct platform_device *pdev)
{
    // 检查硬件设备是否存在
    // 分配并初始化资源
    // 注册设备功能
    return 0; // 成功返回 0
}

例如:

  • 对于 PCI 驱动,probe 函数的参数是一个 struct pci_dev
  • 对于平台设备驱动,probe 函数的参数是一个 struct platform_device

相关的内核匹配机制

  1. 设备与驱动匹配
    • 内核通过设备树(Device Tree)、PCI ID 表、I²C ID 表等机制匹配设备和驱动。
    • 一旦匹配成功,内核就会调用驱动的 probe 函数。
  2. 工作流程
    • 驱动被加载后,内核调用 match 机制确定驱动是否支持某个设备。
    • 如果匹配成功,内核调用 probe 函数完成初始化。
  •  

probe 的典型实现例子

PCI 驱动:

static int my_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
    // 启用 PCI 设备
    pci_enable_device(pdev);

    // 请求并映射设备的 I/O 内存资源
    void __iomem *io_base = pci_iomap(pdev, 0, 0);

    // 注册其他必要的子系统或接口
    // ...

    return 0; // 成功返回 0
}

Platform 驱动:

 
static int my_platform_probe(struct platform_device *pdev)
{
    // 从设备树中获取资源信息
    struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

    // 映射资源
    void __iomem *base = devm_ioremap_resource(&pdev->dev, res);

    // 初始化硬件
    // ...

    return 0; // 成功返回 0
}

总结

probe 并不是某个单词的缩写,而是直接取自单词 probe 的本义,表示“探测”或“检查”。在 Linux 驱动开发中,probe 函数负责探测硬件设备、初始化资源并准备好设备的运行环境。这个术语形象且简洁,因此成为了 Linux 驱动开发中的约定名称。

 

 

 

 

 

 

 

 

0条评论
0 / 1000
木喳喳
9文章数
1粉丝数
木喳喳
9 文章 | 1 粉丝
原创

关于“probe”语义

2024-12-11 08:57:52
1
0

在 Linux 驱动开发中,probe 是一个非常常见的术语,但它并不是某个单词的缩写,而是直接来源于英文单词 probe 的原义,意思是“探测”或“检查”。在驱动开发的上下文中,probe 函数的主要作用是“探测并初始化”硬件设备。


probe 的语义解释

  • 探测 (Probe): 在驱动加载时,probe 函数的主要作用是“探测”目标设备是否存在并且与当前驱动匹配,同时配置和启用设备。因此,它与单词“探针”(probe)对应的功能非常契合。
  • 检查与准备 (Test and Setup)probe 不仅用于检测设备是否存在,还负责初始化设备资源并为设备的后续操作做好准备。

为什么使用 probe

在设备驱动模型中,Linux 内核使用 probe 函数来处理设备的初始化。当某个硬件设备和驱动程序通过匹配机制(如 PCI ID 或设备树节点)被关联起来时,内核调用驱动程序的 probe 函数,以完成以下任务:

  1. 确认设备是否可以被该驱动支持。
  2. 初始化设备的硬件资源(如 I/O 内存、IRQ 等)。
  3. 注册设备相关的功能或接口(如 /dev 节点、sysfs 条目等)。

在设备驱动程序中,probe 函数是驱动与硬件设备初始化和绑定的关键步骤。简单来说,probe 是驱动用来探测和初始化硬件的函数。

probe 函数的含义:

  • 硬件检测与初始化:当一个设备驱动被加载到系统中,内核会通过匹配机制,检查驱动是否可以控制某个硬件设备。probe 函数就是在驱动和硬件匹配成功后,由内核调用的函数,用于执行设备的初始化操作。
  • 设备资源分配:通常在 probe 函数中,驱动会获取设备所需的资源(如中断号、I/O 内存等),并完成硬件的配置和必要的初始化操作。
  • 绑定驱动和设备probe 函数的调用标志着驱动程序已经“发现”并准备控制对应的设备。驱动会在 probe 中将自身与设备进行绑定,并为后续的操作(如读写、控制)做好准备。

典型的流程:

当一个设备插入系统或驱动被加载时:

  1. 设备和驱动匹配:内核会检查设备的描述信息(如 Device TreeACPI 信息、PCI/USB ID 等),与驱动中支持的设备信息进行匹配。
  2. 调用 probe 函数:如果匹配成功,内核就会调用该驱动的 probe 函数,传递一个结构体指针(通常是 struct platform_devicestruct pci_dev 等),该结构体中包含了设备的相关信息。
  3. 资源分配和初始化probe 函数中通常会进行内存分配、寄存器映射、设置中断处理、设备配置等初始化工作。
  4. 返回结果probe 函数会返回一个状态值(0 表示成功,负值表示失败)。如果返回失败,驱动将不会绑定到设备。

probe 在驱动模型中的具体作用

在 Linux 驱动框架(如 platform_driverpci_driveri2c_driver 等)中,probe 是一个约定的函数名称,由内核调用。其常见定义如下:

static int my_driver_probe(struct platform_device *pdev)
{
    // 检查硬件设备是否存在
    // 分配并初始化资源
    // 注册设备功能
    return 0; // 成功返回 0
}

例如:

  • 对于 PCI 驱动,probe 函数的参数是一个 struct pci_dev
  • 对于平台设备驱动,probe 函数的参数是一个 struct platform_device

相关的内核匹配机制

  1. 设备与驱动匹配
    • 内核通过设备树(Device Tree)、PCI ID 表、I²C ID 表等机制匹配设备和驱动。
    • 一旦匹配成功,内核就会调用驱动的 probe 函数。
  2. 工作流程
    • 驱动被加载后,内核调用 match 机制确定驱动是否支持某个设备。
    • 如果匹配成功,内核调用 probe 函数完成初始化。
  •  

probe 的典型实现例子

PCI 驱动:

static int my_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
    // 启用 PCI 设备
    pci_enable_device(pdev);

    // 请求并映射设备的 I/O 内存资源
    void __iomem *io_base = pci_iomap(pdev, 0, 0);

    // 注册其他必要的子系统或接口
    // ...

    return 0; // 成功返回 0
}

Platform 驱动:

 
static int my_platform_probe(struct platform_device *pdev)
{
    // 从设备树中获取资源信息
    struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);

    // 映射资源
    void __iomem *base = devm_ioremap_resource(&pdev->dev, res);

    // 初始化硬件
    // ...

    return 0; // 成功返回 0
}

总结

probe 并不是某个单词的缩写,而是直接取自单词 probe 的本义,表示“探测”或“检查”。在 Linux 驱动开发中,probe 函数负责探测硬件设备、初始化资源并准备好设备的运行环境。这个术语形象且简洁,因此成为了 Linux 驱动开发中的约定名称。

 

 

 

 

 

 

 

 

文章来自个人专栏
现代操作系统原理及实现
9 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0