"driver core" 在 Linux 内核设备驱动程序的上下文中是什么意思?

What is the meaning of "driver core" in the context of Linux kernel device drivers?

我正在阅读 Linux 设备驱动程序,第三版这本书,在第 14 章的 "Putting It All Together" 部分,他们提到了 "PCI core, driver core and the individual PCI drivers." 之间的交互,他们使用了 [= =18=] 多次。是个 "driver core" 不同于 "character device driver"?

我的问题是出于理解 InfiniBand 堆栈的目的。 IB 堆栈跨越 user-space 和 kernel-space。因此,如果我在 Mellanox ConnectX-4 NIC 上为 运行 编写一个简单的乒乓 InfiniBand 程序,我的二进制文件将依赖于 2 个用户-space 库:libibverbs 和 libmlx5,以及 3 个内核-模块:ib_uverbs、mlx5_ib 和 mlx5_core。我知道 ib_uverbs 是一个字符设备驱动程序。但是我们可以将 mlx5_ib 和 mlx5_core 内核模块视为某种驱动程序类别吗?或者它们的功能只是全局导出以便与它们交互?

驱动核心是管理驱动程序、设备、总线、类等的通用代码。它不依赖于特定的总线或设备。我相信你提到的章节提供了几个PCI总线驱动程序和驱动核心之间分工的例子,例如,见图14-3(设备创建过程)。

在您提到的三个内核模块中,有两个参与设备核心:ib_uverbs 注册其字符设备以将 RDMA 功能导出给用户-space; mlx5_core 注册一个 PCI 驱动程序来处理 ConnectX NIC; mlx5_ib 也可以认为是一个驱动程序,但 RDMA 子系统不使用设备核心来注册驱动程序(它有自己的 API - ib_register_device)。

what is driver core ??

在 Linux 源中观察以下调用流程。
tps65086_regulator_probe---> devm_regulator_register--> regulator_register-->device_register(/drivers/regulator/tps65086-regulator.c--->/drivers/regulator/core.c---> drivers/base/core.c ).
tps65086 驱动程序调用调节器内核,调节器内核又调用驱动程序内核。 该驱动程序遵循标准驱动程序模型。

include/linux/device.h ----> 驱动程序模型对象在此处定义。
drivers/base/ --> 所有操作驱动程序模型对象的函数都在这里定义。
我们可以将其称为驱动程序核心,它是任何驱动程序框架工作的基础。 所有注册都来自更高层。 任何驱动子系统 ..weather PCI/USB/Platform 都基于此。
drivers/base/core.c -- 是标准驱动模型的核心文件。
命名有点混乱 - 但是我们可以参考 drivers/base/ - 作为驱动程序核心。

Any difference character driver vs other driver ??

/drivers/char/tlclk.c tlclk_init-->register_chrdev -->register_chrdev --> cdev_add --> kobj_map (fs/char_dev.c ---> /drivers/base/map.c).
字符设备注册是使用文件系统驱动程序 char_dev 完成的,它再次使用驱动程序模型库的基础结构。

whare 作为非字符驱动程序,如 tps65086-regulator.c,可以按如下方式向驱动程序内核注册。 tps65086_regulator_probe---> devm_regulator_register--> regulator_register-->device_register-->device_add-->kobject_add (/drivers/regulator/tps65086-regulator.c--->/drivers/regulator/core.c---> drivers/base/core.c )

此外,它不仅基于驱动程序的类型,还基于它是什么类型的设备以及需要如何处理设备。 这是一个注册字符设备的 pci 驱动程序。 tw_probe-->register_chrdev --> cdev_add --> kobj_map ( /drivers/scsi/3w-xxxx.c -->fs/char_dev.c ---> / drivers/base/map.c)

驱动程序是否应该调用驱动程序核心没有标准规则。
任何堆栈/框架都可以有自己的核心来管理设备,驱动程序就是这种情况 mlx5_ib (drivers/infiniband/core/).
但最后它主要会使用 Kobject 基础设施和驱动模型对象,比如 struct device。
引入驱动程序模型基础结构以消除冗余内核代码和数据结构。
所以大多数驱动程序都是基于此的,这是编写 linux 驱动程序的有效方法。