我正在阅读Linux设备驱动程序,第三版和第14章的“全部放在一起”部分,他们提到了“PCI核心,驱动核心和各个PCI驱动程序”之间的交互。而且他们多次使用“驱动核心”这个词。是个 “驱动程序核心”与“字符设备驱动程序”不同?
我的问题源于理解InfiniBand堆栈的意图。 IB堆栈跨越用户空间和内核空间。因此,如果我正在编写一个简单的乒乓InfiniBand程序以在Mellanox ConnectX-4网卡上运行,我的二进制文件将依赖于2个用户空间库:libibverbs和libmlx5,以及3个内核模块:ib_uverbs,mlx5_ib和mlx5_core。我知道ib_uverbs是一个字符设备驱动程序。但是我们可以将mlx5_ib和mlx5_core内核模块视为某种类型的驱动程序吗?或者他们的功能是否全局导出以便与它们接口?
答案 0 :(得分:2)
驱动程序核心是管理驱动程序,设备,总线,类等的通用代码。它不依赖于特定的总线或设备。我相信你所引用的章节为PCI总线驱动程序和驱动程序核心之间的分工提供了几个例子,例如,参见图14-3(设备创建过程)。
在你提到的三个内核模块中,有两个参与设备核心:ib_uverbs注册其角色设备以将RDMA功能导出到用户空间; mlx5_core注册一个PCI驱动程序来处理ConnectX网卡; mlx5_ib也可以被认为是驱动程序,但RDMA子系统不使用设备核心来注册驱动程序(它有自己的API - ib_register_device)。
答案 1 :(得分:0)
什么是驱动核?
在Linux Source中观察以下调用流程
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 ---->这里定义了驱动模型对象
司机/基地/ - >此处定义了对驱动程序模型对象进行操作的所有函数
我们可以将其称为驱动程序核心,并且是任何驱动程序框架工作的基础。
所有注册都来自高层。
任何驱动子系统..天气PCI / USB /平台都是基于此。
drivers / base / core.c - 是标准驱动程序模型的核心文件
命名有点混乱 - 但我们可以将drivers / base / - 称为驱动核心。
任何差异角色驱动与其他驱动?
/drivers/char/tlclk.c
tlclk_init - > register_chrdev - > register_chrdev - > cdev_add - > kobj_map(fs / char_dev.c ---> /drivers/base/map.c)。
使用文件系统驱动程序char_dev完成字符设备注册,该驱动程序再次使用驱动程序模型库的基础结构。
此外,它不仅基于驱动程序的类型,而且基于它是什么类型的设备以及如何处理设备。 这是一个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驱动程序的有效方法。