设备文件按主要和次要编号链接到驱动程序。那么驱动程序如何链接到设备???当我们插入一个设备时,内核如何知道它与加载了哪个模块一起工作
3 回答
关于供应商和设备 ID 以及 hotplug 和 udev 的答案是正确的,但他们没有解释主要和次要数字是什么。为将来的搜索者提供所有关键字,我将在此处执行此操作。
如 中所示,主要和次要设备号ls -l /dev
不有助于识别在检测到设备时要加载的驱动程序。它们是让内核在您打开设备文件时知道您正在访问的设备。
当一个驱动程序被加载时,如果它支持任何特殊文件/dev
,它会调用register_chrdev
(或一些类似的函数),通知内核它要使用的主设备号。一些驱动程序通过要求内核选择一个未使用的号码来动态选择一个主号码。注册过程将驱动程序及其主要编号放入一个表中,以后可以在其中找到它们。
永久分配的设备编号在中央机构注册,注册发布在Documentation/admin-guide/devices.*中。
中的文件/dev
具有与其驱动程序匹配的主要编号,以及标识特定设备或功能的次要编号。这些文件MAKEDEV
由 hotplug/udev 系统静态或动态创建。低级的“创建设备文件”操作称为mknod
.
当用户程序打开一个设备文件时,主要和次要编号用于在由 维护的表中查找驱动程序register_chrdev
,并调用驱动程序的方法来服务用户的请求。
对于 PCI 设备,它们在一致的位置公开供应商和设备 ID。内核模块可以向 pci 子系统提供它们支持的列表。
例如: http: //lxr.free-electrons.com/source/drivers/uio/uio_aec.c#L48