通过运行注释了解设备驱动程序代码

时间:2013-03-05 03:59:51

标签: linux-device-driver

我对以下内容有基本的了解:

  • 如何阅读硬件设备数据表
  • 理论上硬件设备的工作原理
  • 设备驱动程序做什么
  • C编程的一般概念
  • Linux OS

我一直相信,如果我能理解给定设备驱动程序的所有代码,并且最终可以在上面的帮助下从头开始编写相同的代码(无需查看源代码),我将能够获得非常好地理解C语言以及设备驱动程序如何工作以及如何与OS交互。对我来说,这将是我职业生涯中的一个重要里程碑。

所以,在过去的几年里,我一直在想学习如何编写设备驱动程序(主要用于Linux操作系统)。我总是以极大的热情开始(这至少发生过6到7次)并选择一些好的在线资源并阅读它们。然后我从Linux内核中获取现有的驱动程序代码(比如一个以太网驱动程序代码),获取数据表并开始阅读驱动程序代码,但在阅读了几行之后我感到很困惑然后最终放弃,因为我无法遵循其余的代码。

我的问题:我知道这样的教程太好了,但我还是想问一下 - 有没有人知道一个很好的资源,它解释了如何编写Linux设备驱动程序,从详细的数据表参考开始,以及如何与之相关的现有代码行,然后解释每个函数/代码块,了解它为什么存在以及它究竟做了什么。

2 个答案:

答案 0 :(得分:2)

至少有两本关于Linux设备驱动程序开发的好书:

我亲自阅读LDD3并将其用作参考,但第二个也是非常好的其他开发人员。

当您(以及如果)阅读LDD3时,它会详细描述所有内容,并且在步骤#1的开发过程之后有一段代码片段。然而,这本书没有完整的代码本身(这是一件好事,或者它变得臃肿),但我建议你实际下载并查看示例。

绝对不仅可以让您入门,还可以编写任何设备。无论是以太网网络驱动程序,专用用户应用程序的精彩内核扩展,还是完整的内核绕过策略,DMA缓冲区都映射到用户空间。

但是,您可能无法完整地逐步了解任何真实设备驱动程序。这是因为有些事情 - 编写这样的书要困难得多,然后再写一个驱动程序就更难了。由于具有极端的设备特性,它很可能无法畅销。因此,当涉及到与某些设备的DMA引擎或以太网LSO良好协作的细节时,您将拥有相关经验,学习一些现有设备及其驱动程序,或者至少询问具体问题(此处或其他地方)

我想说,当你达到这一点时,最直接的方式是加入一个完全符合这一要求的团队,与人们密切合作,不断获得越来越多的经验。直到有一天你可以坐下来,从架子上拔下你的10G网卡,坐下来写一个工业级驱动程序(好吧,或直到你的兴趣发生变化)。

您也可以尝试一些开源项目。例如,查看PF_RING DNA或类似项目。这非常有趣,因为您可以使用现有的驱动程序,并且必须进行一些调整才能使其与PF_RING基础结构一起使用。但是我个人认为,开源项目在教学方面的效果通常不那么有效,并且可以帮助你获得真实有用的经验,因为在那里人们不会坐在你身边等等。

所以......就这样做!

答案 1 :(得分:0)

我和你以前有过相同的经历,虽然我现在不能说我是一名内核专家。但我可以和你分享一些东西。

(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)最后一个建议是,你的学习与项目有关,这会给你带来一些压力并推动你每天前进。