学习编写低级驱动程序(Linux)。

6
所以我正在玩树莓派,突然想到“所有这些驱动程序从哪里来”。特别是对于我正在使用的SNES控制器...到底有人怎么想出来写这个的。
我懂得C语言还不错,C++也可以...但这一直是我考虑的事情。这很酷,因为它足够低级以理解可能发生了什么硬件方面的问题...但也很适合学习操作系统。
从哪里开始呢?我猜在Windows上做这个肯定会非常不同。
谢谢

4
LDD3是一本关于Linux设备驱动程序的书籍,该书介绍了如何编写Linux设备驱动程序。该书由三部分组成,第一部分介绍了设备驱动程序的基础知识,包括驱动程序的结构、编译和加载。第二部分介绍了字符设备驱动程序的编写,讨论了字符设备驱动程序的各个方面,例如打开和关闭设备、读取和写入数据以及控制设备行为的ioctl接口。第三部分介绍了块设备驱动程序的编写,讨论了块设备驱动程序的各个方面,例如请求队列管理、块设备I/O和缓存管理。此外,该书还介绍了与设备驱动程序相关的话题,例如中断处理程序、定时器和内核同步机制。 - Mark Plotnick
rml的《Linux内核开发》(http://www.amazon.com/Linux-Kernel-Development-3rd-Edition/dp/0672329468)也是值得一读的。 - hobbs
2个回答

4
我觉得这里实际上有两个问题,它们并不是很相关。
第一个问题是“Linux需要设备驱动程序的什么?” 这个问题通常可以通过阅读文档来回答。尽管设备驱动程序文档可能(可以争论)比编写普通程序的文档略微不够详尽、完整、易读等,但它仍然相当不错。与正常代码最大的区别可能是调试,通常是通过使用printk简单地打印输出来完成的。
另一个问题是:“如何确定特定硬件(如SNES控制器)使用的协议是什么?当您为像普通硬盘或键盘这样的东西开发时,您几乎可以只需遵循文档。您可能会(至少在我的经验中经常会)发现需要弥补一些硬件中的错误,但除此之外,它基本上就是正常的编程。在许多这样的情况下,最大的挑战就是决定如何向系统的其余部分呈现特定设备。对于像硬盘这样的东西来说,这通常非常容易,但对于像人机界面设备这样的东西来说,可能会更具有挑战性(例如,您想将其呈现为自己,还是想模拟键盘或鼠标等现有类型的设备?)
对于没有真正记录的硬件,事情可能会变得更加困难。查看逻辑信号的通用工具是逻辑分析仪。如果您有使用众所周知的硬件接口(例如PS/2键盘/鼠标、USB、SATA)的东西,则可以找到更多专门的工具(和/或逻辑分析仪的附件),这样生活就会变得容易得多。像NES或SNES控制器这样的东西几乎肯定使用专有接口,因此您可能最终使用逻辑分析仪。幸运的是,它们也可能是一个相当狭窄、缓慢的接口,因此逻辑分析仪不需要非常快或支持大量通道。
通过逻辑分析仪,您可以看到所有单独的信号,但对于专有接口,基本上取决于您确定哪些信号是做什么的。在典型情况下,您至少会发现一些相当明显的信号:电源、地面、很可能是时钟等。在许多情况下,您很快就会发现即使它没有公开记录,它也可能遵循某些众所周知的协议,如I2C、SPI等。

使用逻辑分析仪难吗?有著名的好资源可以学习吗? - user475353
@Mercfh:我觉得逻辑分析仪并不难使用,但很多取决于你在触发器等方面决定使用多么复杂。你可以在EE网站上查找更多相关信息。 - Jerry Coffin
1
理想情况下,我们应该使用逻辑分析仪来查看从控制器(例如我正在使用SNES控制器示例)发送的每个按钮的信息,然后将其适配到您编写的设备驱动程序中。 - user475353
@Mercfh:是的,那基本上就是这个想法。 - Jerry Coffin

2

Linux设备驱动程序是你想要的书。

在等待书籍到达的同时,我可以告诉你,了解硬件工作原理和Linux内核工作原理只是战斗的一半。你还需要了解特定设备的硬件级接口。希望你能找到相关文档,但这可能很困难。

参见这个相关问题,了解有人如何通过观察Windows驱动程序产生的命令来为Linux编写驱动程序: 如何为Linux编写低级设备驱动程序?

对于Windows,实际上过程并没有太大的区别。所有概念仍然相同,因为它是相同的硬件。当然,差异在细节上。


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