2

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

  • 如何阅读硬件设备数据表
  • 硬件设备在理论上是如何工作的
  • 设备驱动程序有什么作用
  • C 编程的一般概念
  • 操作系统

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

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

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

4

2 回答 2

2

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

LDD3我亲身读过,作为参考,但其他开发者说第二个也很好。

当(如果)您阅读 LDD3 时,它会详细描述所有内容,并在从第 1 步到最后的开发过程中包含代码片段。然而,这本书本身并没有完整的代码(这是一件好事,否则它会变得臃肿),但我建议您实际下载并查看示例。

它绝对不仅可以帮助您入门,还可以编写任何设备。无论是以太网网络驱动程序、专门用户应用程序的精美内核扩展,还是将 DMA 缓冲区映射到用户空间的成熟内核绕过策略。

但是,您可能无法完整一步一步地了解任何真实世界的设备驱动程序。这是因为一些事情——写这样一本书要困难得多,比编写驱动程序本身还要难。由于设备特定,它很可能卖得不好。因此,当涉及到与某些设备的 DMA 引擎或以太网 LSO 完美配合等细节时,您要么有这方面的经验,要么学习一些现有的设备及其驱动程序,要么至少提出具体问题(此处或其他地方) .

我想说的是,当你达到这一点时,最直接的方法就是加入一个能做到这一点的团队,与人密切合作,不断获得越来越多的经验。直到有一天你可以坐下来,从架子上取下你的 10G 网卡,坐下来写一个工业级的驱动程序(好吧,或者直到你的兴趣改变)。

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

所以……就去做吧!

于 2013-03-05T19:23:48.727 回答
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)最后一个建议是,你的学习最好和项目有关,这样会给你一些压力,每天都在推动你前进。

于 2013-03-05T05:50:40.527 回答