Linux内核/驱动开发新手入门

21

最近,我开始开发运行 Linux 的嵌入式设备的驱动程序。

到目前为止,我只是阅读了关于 Linux 内部的一些资料。
由于没有驱动程序开发的先前经验,我在迈出第一步方面感到有些困难。

  • 我已下载了内核源代码(v2.6.32)。
  • 我已经浏览了《Linux 设备驱动程序(第3版)》。
  • 我在 StackOverflow 上阅读了一些相关帖子。
  • 我了解 Linux 采用“单内核”方法。
  • 我已构建内核(包括在菜单配置中包含现有驱动程序等)
  • 我知道 kconfig 和 makefile 文件的基础知识,所以应该不会有问题。

有人可以描述一下内核源代码中各个目录的结构(即相互链接)吗?

换句话说,给定一个源代码文件,
它将引用哪些其他文件来获取相关的代码?

(“#include”提供了部分思路)

有人能帮我更好地理解吗?
任何帮助都将不胜感激。

谢谢。


这应该能澄清问题了。 - rh.
编写一个简单的“Hello World”内核模块。一旦你理解了“Hello World”内核模块,就按照以下链接编写并测试此驱动程序:http://www.freesoftwaremagazine.com/articles/drivers_linux。一直跟随上面的链接,直到你不理解为止。还要阅读我在这里发布的两篇文章:http://mail.nl.linux.org/kernelnewbies/2010-09/。我曾经在论坛上为了理解它而进行了激烈的争论。所以你也必须这样做。无论别人说什么,都要坚持到你理解为止。学习的最佳方法是选择一个项目并开始工作,最终你会获得很多收获。例如,决定修复一个问题。 - reality displays
内核中的无线驱动程序出现了一个bug。我知道在这个阶段听起来很奇怪,但是一定要追踪它直到解决。最终你会能够解决它的。 - reality displays
@realitydisplays,我知道这已经很久了,但我和原帖作者处于类似的情况。你分享的那两个链接已经失效了。你能提供最新的链接吗? - hago
2个回答

18

给定一个C文件,你需要查看它调用的函数和使用的数据结构,而不是担心特定的文件。

开发自己的设备驱动程序有两个基本方法:

  • 取一个类似于你的驱动程序;去掉与你的设备不适用的代码,并为你的设备填充新代码。
  • 从设备驱动程序的基本部分开始,逐步添加部件,直到你的设备开始运行。

当你完成这个过程时,组成驱动程序的文件将更加合理。考虑每个文件应该放置哪些内容,但在某种程度上,将驱动程序分成文件比科学更像艺术。较小的驱动程序通常只适合于一个或两个文件。

一些设计也可能是好的。考虑一下你的设备做什么以及你的驱动程序需要做什么。基于此,你应该能够绘制出设备驱动程序所需的功能。

我还相信《Linux设备驱动程序第三版》可以帮助你进入驱动程序开发的道路。

Linux文件本身包括基于它们执行的操作、它们所在的层和它们访问的调用堆栈层的文件。大局观确实告诉每个文件如何与下一个文件相关联。


谢谢推荐。今晚会仔细阅读这本书。还有别的建议吗?有没有实用的步骤指南?... - TheCodeArtist
2
一个真正的专家需要超过几页来深入了解内核...此外,许多内核的部分变化很快,因此一旦编写就已经过时了。你最好阅读和理解你感兴趣的子系统。 - WhirlWind

7

我曾经需要修复一个内核驱动程序。我的最大建议(如果你使用vim)是使用ctags进行设置,这样你就可以在遇到不理解的函数时使用ctrl-]跳转至内核源代码。


2
我已经做了一段时间了!它确实非常有帮助! - TheCodeArtist

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