在 Linux 驱动开发中,probe 是一个非常常见的术语,但它并不是某个单词的缩写,而是直接来源于英文单词 probe 的原义,意思是“探测”或“检查”。在驱动开发的上下文中,probe 函数的主要作用是“探测并初始化”硬件设备。
probe 的语义解释
- 探测 (Probe): 在驱动加载时,probe函数的主要作用是“探测”目标设备是否存在并且与当前驱动匹配,同时配置和启用设备。因此,它与单词“探针”(probe)对应的功能非常契合。
- 检查与准备 (Test and Setup): probe不仅用于检测设备是否存在,还负责初始化设备资源并为设备的后续操作做好准备。
为什么使用 probe?
在设备驱动模型中,Linux 内核使用 probe 函数来处理设备的初始化。当某个硬件设备和驱动程序通过匹配机制(如 PCI ID 或设备树节点)被关联起来时,内核调用驱动程序的 probe 函数,以完成以下任务:
- 确认设备是否可以被该驱动支持。
- 初始化设备的硬件资源(如 I/O 内存、IRQ 等)。
- 注册设备相关的功能或接口(如 /dev节点、sysfs 条目等)。
在设备驱动程序中,probe 函数是驱动与硬件设备初始化和绑定的关键步骤。简单来说,probe 是驱动用来探测和初始化硬件的函数。
probe 函数的含义:
- 硬件检测与初始化:当一个设备驱动被加载到系统中,内核会通过匹配机制,检查驱动是否可以控制某个硬件设备。probe函数就是在驱动和硬件匹配成功后,由内核调用的函数,用于执行设备的初始化操作。
- 设备资源分配:通常在 probe函数中,驱动会获取设备所需的资源(如中断号、I/O 内存等),并完成硬件的配置和必要的初始化操作。
- 绑定驱动和设备:probe函数的调用标志着驱动程序已经“发现”并准备控制对应的设备。驱动会在probe中将自身与设备进行绑定,并为后续的操作(如读写、控制)做好准备。
典型的流程:
当一个设备插入系统或驱动被加载时:
- 设备和驱动匹配:内核会检查设备的描述信息(如 Device Tree、ACPI信息、PCI/USBID 等),与驱动中支持的设备信息进行匹配。
- 调用 probe函数:如果匹配成功,内核就会调用该驱动的probe函数,传递一个结构体指针(通常是struct platform_device或struct pci_dev等),该结构体中包含了设备的相关信息。
- 资源分配和初始化:probe函数中通常会进行内存分配、寄存器映射、设置中断处理、设备配置等初始化工作。
- 返回结果:probe函数会返回一个状态值(0 表示成功,负值表示失败)。如果返回失败,驱动将不会绑定到设备。
probe 在驱动模型中的具体作用
在 Linux 驱动框架(如 platform_driver、pci_driver 或 i2c_driver 等)中,probe 是一个约定的函数名称,由内核调用。其常见定义如下:
static int my_driver_probe(struct platform_device *pdev)
{
    // 检查硬件设备是否存在
    // 分配并初始化资源
    // 注册设备功能
    return 0; // 成功返回 0
}例如:
- 对于 PCI 驱动,probe函数的参数是一个struct pci_dev。
- 对于平台设备驱动,probe函数的参数是一个struct platform_device。
相关的内核匹配机制
- 设备与驱动匹配:
- 内核通过设备树(Device Tree)、PCI ID 表、I²C ID 表等机制匹配设备和驱动。
- 一旦匹配成功,内核就会调用驱动的 probe函数。
 
- 工作流程:
- 驱动被加载后,内核调用 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 驱动开发中的约定名称。
