如何开始编写设备驱动程序?

87

我想学习如何编写设备驱动程序,因为我认为这将是有趣的。我使用Mac OS X MacBook,但我还有一台Ubuntu机器(在Mac Min上运行)。我对C语言相当熟悉,目前正在阅读这本书。我在网上找到了一些链接,如Mac Dev Center。我做这件事是因为这将是一件有趣的事情。我认为看到硬件因我编写的软件而操作会让人真正感到满足。

我猜我想要的是一些技巧或建议和指导,还有谁知道没有驱动程序的设备列表,或者我能否为已经支持的设备编写驱动程序(更喜欢前者,这样我就可以提供真正的价值)。从哪个设备开始入手比较好?我是不是贪多嚼不烂了?我不怕底层编程或汇编语言,也不怕付出多少努力。我想要一个挑战!


1
既然你提到了OS XLinux,那么这些设备驱动程序是为哪个操作系统而设计的? - jschmier
2
没有驱动程序的设备... 这样的设备就无法使用! 设备制造商必须创建驱动程序,否则他们无法销售其产品。话虽如此,市面上也有一些非常简单的设备。 - jpaugh
1
在很多情况下,设备是按照已发布的硬件标准设计的。这意味着驱动程序可以由微软编写,而设备设计者不必提供驱动程序。 - Elisha Habinsky
“没有驱动程序的设备”-- 可能有各种SPI从设备(和I2C)(例如传感器,非易失性存储器),可能尚未拥有Linux驱动程序,尽管SPI协议驱动程序是一种特殊类别的驱动程序。显然@jpaugh主要是指PC硬件而不是工业硬件,后者发布时可能没有Linux驱动程序或任何软件,例如因为主要市场可能是微控制器应用。 - sawdust
@ElishaHabinsky 我所引用的问题背景非常关键。我的观点依然成立,无论是谁编写驱动程序,因此我没有详细阐述。 - jpaugh
显示剩余3条评论
4个回答

51

谢谢!编写设备驱动程序需要多少工作量?相比编写一个大型复杂应用程序,它的工作量是更多还是更少?我问了回答这个问题的每个人,因为我真的想要一个答案。再次感谢! - Bjorn
1
涉及的困难和工作量取决于设备的复杂性。tty设备驱动程序可能比usbpci设备驱动程序简单得多。 - jschmier
6
先编写一个内核模块作为驱动程序,使用基本的“Hello World”程序,并将其插入到Ubuntu/mac中。查看内核日志并了解发生了什么。然后尝试在总线上注册一个虚拟驱动程序(如PCI或USB),然后逐步添加更多功能,如读取、写入和IOCTL调用。最后可以移动到实现更复杂的电源管理钩子、睡眠、关机等调用。如果在嵌入式系统上工作,平台驱动程序和DMA也是一个有趣的阅读内容。 - Anirudh

40

编写设备驱动程序可以很简单,也可以非常复杂。例如,我曾参与过一个项目,我们花了近三年时间才解决了一个设备驱动程序中的问题,其中六个人都投入了工作。当然,在寻找问题时,我们清除了许多其他错误……代码得到了极大的改进。修复结果是一个八行的补丁,代价保守估计也达到了一百万美元。

但是,作为这个项目的副产品,我从芯片数据手册中编写了一个以太网驱动程序,只用了一周时间,并花了另外一周时间进行了调试。至今不需要再次修改。

总的来说,无法一般性地确定编写驱动程序需要多少工作量; GPU驱动程序可能会耗费数亿美元,而单个LED的驱动程序最多只需要几小时的工作时间。


22
可以分享更多细节吗?很想了解一下这个补丁,以及为什么它很难调试。驱动程序属于哪个设备类别? - Anirudh

8

谢谢!编写设备驱动程序需要多少工作量?相比编写一个大型复杂应用程序,它的工作量是更多还是更少? - Bjorn

3

对于Mac,您可能想看一下Mac OS X Internals这本书。它很厚,但很有趣。主要讲述基于PowerPC的Mac,但附录中也有关于基于Intel的内容。对于Linux,请查看Linux Device Drivers, 3rd Edition - 这本书更轻便(免费在线PDF可用 :)),并且真正面向设备驱动程序,可能更适合初学者。


谢谢!编写设备驱动程序需要多少工作量?相比编写一个大型复杂应用程序,它的工作量是更多还是更少? - Bjorn
2
嗯,在这两种情况下,你都需要知道自己在做什么,因此你需要理解周围的环境,而这来自于经验,而你只有尝试过才能获得经验 :) 从LDDv3中运行几个示例,源代码可以在线获取,但对于当前的内核来说有点过时了,你会感受到其中涉及的内容以及你想要学习的下一步内容。 - Nikolai Fetissov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接