我一直在学习内核编程,并学习Eudyptula challenge,任务5要求我修改一个较早的任务的hello world模块,使其在插入USB键盘时自动加载,而在拔出键盘时自动卸载。

现在,为了这个目的,我不会在这里发布我的代码,因为这将严重破坏此任务,并会破坏其他人的乐趣。基本上,它的作用是:

  • 用一个条目创建一个struct usb_device_id数组,该数组将我的模块绑定(bind)到任何USB键盘
  • 创建一个struct usb_driver并初始化适当的字段;特别是,它引用了我先前创建的USB设备ID表数组
  • 使用宏MODULE_DEVICE_TABLE注册驱动程序。

  • 注册/注销例程正在运行。手动加载和卸载模块时,会收到预期的调试消息。

    我将模块复制到/lib/modules/$(uname -r)并运行depmod -a。该模块已添加到modules.aliasmodules.dep,但是当我插入/拔出键盘时什么也没有发生。

    进一步的研究表明,我应该有一个由modules.usbmap生成的depmod文件,其中内核保持要加载的设备和驱动程序之间的映射。我的文件夹树中没有该文件。我也没有modules.pcimap。我已经检查了内核配置,以确保启用了可加载模块支持以及热插拔支持。

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

    最佳答案

    您可能会缺少两件事:

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

    2.)modules.usbmap和modules.pcimap仅与module/pci/usb实用程序的某些较早版本一起存在。在现代版本中,等效于那些文件中的信息被包含在modules.alias中。您的研究 Material 可能已过时。

    关于c - 基于Ubuntu的发行版缺少modules.usbmap和modules.pcimap,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24832032/

    10-12 17:32