我对以下几点有基本的了解:
我一直相信,如果我能够理解给定设备驱动程序的所有代码,并且能够在上面(不看源代码)的帮助下从头开始编写相同的代码,我将能够非常好地理解C语言以及设备驱动程序是如何工作和与OS交互的。对我来说,这将是我职业生涯中的一个重要里程碑。
因此,在过去的几年里,我一直想学习如何编写设备驱动程序(主要用于Linux操作系统)。我总是以极大的热情开始(这种情况至少发生了6-7次),并挑选一些好的在线资源并阅读它们。然后,我从Linux内核获取一个现有的驱动程序代码(例如以太网驱动程序代码),获取一个数据表并开始读取驱动程序代码,但是读了几行之后,我有点困惑,最终放弃了,因为我无法遵循其余的代码。
我的问题是:我知道这样的教程太好了,不可能是真的,但我还是想问--是否有人知道一个好的资源,它解释了Linux设备驱动程序是如何从对数据表的详细引用开始编写的,以及现有的代码行是如何与它相关的,然后解释每个函数/代码块为什么会存在,以及它到底做了什么。
发布于 2013-03-05 19:23:48
至少有两本关于Linux设备驱动程序开发的好书:
我本人读过LDD3并将其用作参考,但其他开发人员认为,第二篇也很好。
当(和如果)您阅读LDD3时,它很好地详细描述了所有内容,并有代码片段跟踪从步骤1到结束的开发过程。然而,这本书本身并没有完整的代码(这是一件好事,否则它会变得臃肿),但我建议您实际下载并查看示例。
它肯定不仅能让你开始,你还能写任何设备。是以太网网络驱动程序,是专用用户应用程序的高级内核扩展,还是完全完善的内核旁路策略,将DMA缓冲区映射到用户空间。
但是,您可能无法一步步地了解任何真实的设备驱动程序。这是因为有几件事-写一本这样的书要困难得多,比写一个司机本身要难得多。很有可能,由于设备的特殊性,它的销量不会很好。因此,当涉及到某些设备的DMA引擎或以太网LSO很好地工作这样的细节时,您要么在这方面有经验,要么学习一些现有的设备及其驱动程序,或者至少问一些特定的问题(这里或其他地方)。
我想说的是,当你谈到这个问题时,最直截了当的方法就是加入这样一个团队,与人们紧密合作,不断积累更多的经验。直到有一天你能够坐下来,把你的10G NIC从货架上拿下来,坐下来写一个工业等级的司机(嗯,或者直到你的兴趣改变)。
您也可以尝试一些开源项目。例如,看看环DNA或类似的项目。这是非常有趣的,因为您可以使用现有的驱动程序,并且必须做一些调整才能使它与PF_RING基础结构一起工作。然而,在我个人看来,开源项目在教学和帮助你获得真实世界的经验方面通常会有些不那么有效,因为在那里,人们不会坐在你旁边,等等。
所以..。就这么做!
发布于 2013-03-05 05:50:40
虽然我现在不能说我是一个内核专家,但我有着和你以前一样的经验。但我可以和你分享一些东西。
(1)在开始研究/开发Linux设备驱动程序之前,应该熟悉linux内核中与特定Linux设备驱动程序相关的常见API。众所周知,不同类型的设备驱动程序具有完全不同的实现,并且使用不同的API。
(2)对内核实现和设备驱动程序开发有很好的了解,如: Understanding.the.Linux.Kernel.3rd.Edition;Linux.Kernel.Development.3rd.Edition;Linux.Device.Driver.Development.3rd.Edition;
(3)最后一个建议是,你最好把学习与项目联系起来,这样会给你一些压力,每天都能推动你前进。
https://stackoverflow.com/questions/15215582
复制相似问题