在 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
/USB
ID 等),与驱动中支持的设备信息进行匹配。 - 调用
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 驱动开发中的约定名称。