基于Ubuntu的发行版中缺少modules.usbmap和modules.pcimap

Fil*_*ves 5 c kernel-module linux-device-driver linux-kernel

我一直在学习内核编程并接受Eudyptula挑战,任务5要求我修改一个早期任务的hello world模块,以便在插入USB键盘时自动加载,并在拔下键盘时卸载.

现在,为了它,我不会在这里发布我的代码,因为这对于这项任务来说将是一个巨大的破坏者,并会破坏其他人的乐趣.基本上,它的作用是:

  1. 创建一个struct usb_device_id数组,其中包含一个将我的模块绑定到任何USB键盘的条目
  2. 创建struct usb_driver并初始化正确的字段; 特别是,它引用了我之前创建的usb设备id表数组
  3. 使用宏MODULE_DEVICE_TABLE来注册驱动程序.

注册/取消注册例程正在运行.当我手动加载和卸载模块时,我得到了预期的调试消息.

我将模块复制到/lib/modules/$(uname -r)并运行depmod -a.该模块被添加到modules.aliasmodules.dep,但是当我插入/拔出键盘没有任何反应.

进一步的研究表明,我应该有一个modules.usbmap文件,由depmod内核保存设备和驱动程序之间的映射来加载.我的文件夹树中的任何地方都没有此文件.我也没有modules.pcimap.我检查了内核配置以确保启用了可加载模块支持,以及热插拔支持 - 它们是.

这是Kubuntu 14.04,带有自编译的3.16.0-rc5内核.我错过了什么?我已经完成了内核配置并检查了最明显的选项.我有点被困在这里.有任何想法吗?

小智 4

你可能错过了两件事:

1.) USB 键盘通常不仅仅是通用 USB 设备,而且是 HID 类设备。Linux 将 USB HID 设备视为单独的子类。你考虑到这一点了吗?

2.)modules.usbmap和modules.pcimap仅存在于某些旧版本的module/pci/usb实用程序中。在现代版本中,与这些文件中过去相同的信息包含在 module.alias 中。您的研究材料可能已经过时。