我应该如何开始编写设备驱动程序? [关闭]

Posted

技术标签:

【中文标题】我应该如何开始编写设备驱动程序? [关闭]【英文标题】:How should I get started on writing device drivers? [closed] 【发布时间】:2011-01-14 10:21:39 【问题描述】:

我想学习如何编写设备驱动程序,因为我认为这会很有趣。我使用 Mac OS X Macbook,但我也有一台 Ubuntu 机器(在 Mac Min 上运行)。我对 C 非常熟悉,目前正在阅读 this book。我在网上找到了一些链接,例如Mac Dev Center。我这样做是因为它会很有趣。我认为看到硬件由于我编写的软件而运行会非常令人满意。

我想我想要一些提示或建议和指导,有没有人知道没有驱动程序的设备列表,或者我可以为已经支持的东西编写驱动程序(更喜欢前者,所以我'我实际上提供了价值)。什么是入门的好设备?我咬得比我能咀嚼的多吗?我不害怕低级编程或组装或任何需要付出的努力。我真的很想挑战!

【问题讨论】:

既然您提到了 OS XLinux,那么这些设备驱动程序适用于什么操作系统? 任何一个,我想我更喜欢 OS X,因为那是我使用的笔记本电脑。 "没有驱动的设备..." 任何这样的设备都不能使用!设备制造商必须创建驱动程序,否则他们将无法销售其产品。话虽如此,还是有一些非常非常简单的设备。 eudyptula-challenge.org 和 github.com/agelastic/eudyptula(readme 有任务,不要马上看解决方案;)) @jpaugh “在许多情况下,设备是根据已发布的硬件标准设计的。这意味着驱动程序可以由 Microsoft 编写,而设备设计人员不必提供驱动程序。”来自 docs.miscrosoft.com 【参考方案1】:

对于 Linux,您可能会考虑阅读 O'Reilly Linux Device Drivers 书籍或在线阅读 PDFs。在我看来,这是关于这个主题的更好的文本之一。

The Linux Kernel Module Programming Guide 是另一个很好的资源。

您可能还想买一本专门介绍 Linux 内核的书。为此,我拿起了一份 Robert Love 的Linux Kernel Development (2nd Edition)(3rd Edition 在路上)。

【讨论】:

谢谢!编写设备驱动程序需要做多少工作?与编写大型复杂应用程序相比,它是否工作更多或更少?我问了所有回答这个问题的人,因为我真的很想要一个答案。再次感谢! 所涉及的工作难度和数量取决于设备的复杂程度。 tty 设备驱动程序可能比 usbpci 设备驱动程序复杂得多。 首先编写一个内核模块作为驱动程序。基本的 hello world 程序。并插入你的 Ubuntu/mac。查看内核日志并了解正在发生的事情。然后尝试在总线(如 PCI 或 USB)上注册一个虚拟驱动程序,然后继续添加更多功能,如读写和 IOCTL 调用。最后可以转向实现更复杂的电源管理挂钩、睡眠、关机调用。此外,如果在嵌入式、平台驱动程序和 DMA 上工作,这也是一本有趣的书。【参考方案2】:

编写设备驱动程序可以非常简单,也可以几乎任意复杂。例如,我参与了一个项目,我们六个人花了将近三年的时间来解决设备驱动程序中的一个错误。当然,我们在寻找它的同时清除了许多其他错误……代码得到了极大的改进。修复结果是一个 8 行补丁,保守地说,花费大约 100 万美元。

但是,作为一个附带项目,我在一周内从芯片数据表中编写了一个以太网驱动程序,然后又花了一周时间进行调试。从那以后就不需要碰它了。

一般来说,没有办法说司机会做多少工作;一个 GPU 驱动程序可能要花费数亿美元,单个 LED 的驱动程序最多需要几个小时的工作时间。

【讨论】:

你能分享更多细节吗?很想了解补丁以及为什么调试如此困难。哪类设备是驱动程序?【参考方案3】:

对于 Mac,您可能想看看 Mac OS X Internals 书。它的思考和沉重但有趣的阅读。它主要是关于基于 PowerPC 的 Mac,但有一个关于基于 Intel 的 Mac 的附录。对于 Linux,请查看 Linux Device Drivers, 3rd Edition - 它更轻巧(在线免费 PDF :) 并且真正面向设备驱动程序,可能是一个更好的开始。

【讨论】:

谢谢!编写设备驱动程序需要多少工作量?与编写大型复杂应用程序相比,工作量更大还是更少? 嗯,在这两种情况下,您都需要知道自己在做什么,因此您需要了解周围的环境,而这来自经验,直到您尝试才能获得:) 解决来自 LDDv3 的几个示例,源代码是在线的,但对于当前内核来说有点过时了,您将了解其中涉及的内容以及您接下来想学习的内容。【参考方案4】:

如果您想从事 Linux 设备驱动程序开发,免费提供的 O'Reilly 书籍Linux Device Drivers, Third Edition 是必读的。

为了找到您可以为其编写驱动程序的不受支持的硬件部件,请在Linux mailing lists 上提问。也许是一些 USB 3.0 设备? ;)

【讨论】:

谢谢!编写设备驱动程序需要做多少工作?与编写大型复杂应用程序相比,工作量更大还是更少?

以上是关于我应该如何开始编写设备驱动程序? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何开始编写 Windows minifilter 驱动程序? [关闭]

如何从 iOS 应用程序更改 RFDuino 设备名称?

如何为 Raspberry Pi 编写简单的 UART Linux 设备驱动程序?

查找可启动笔式驱动器是不是连接到 Windows [关闭]

如何编写程序可以检测 C++ 中游戏手柄按钮的信号? [关闭]

我应该使用 Sencha Touch 还是 Native 来编写我的应用程序? [关闭]