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

Learning to write low level drivers (Linux).

本文关键字:Linux 驱动程序 学习      更新时间:2023-10-16

所以我在摆弄树莓派,我突然想到"所有这些驱动程序来自哪里"。就像我专门用于它们使用的SNES控制器一样。到底有人是怎么想出怎么写的。

我了解C,C++...还行。但这一直是我思考的问题。这很酷,因为它的级别很低,足以理解硬件方面的情况......但也很高兴了解操作系统。

我从哪里开始这样的事情?我猜为窗口这样做会有所不同。

谢谢

在我看来,这里真的有两个问题彼此没有多大关系。

第一个是"Linux 对设备驱动程序有什么要求?这几乎总是可以通过阅读文档来回答。尽管设备驱动程序文档可能(可以说)比编写普通程序的文档更不彻底、完整、易于阅读等,但它仍然相当不错。与普通代码的最大区别可能是调试,这通常是通过简单地用printk打印东西来完成的。

另一个问题是:"你如何弄清楚SNES控制器等特定硬件使用的协议(或"协议")是什么。当您开发普通硬盘驱动器或键盘之类的东西时,您几乎可以按照文档进行操作。你可能会(经常这样做,至少根据我的经验)发现你需要补偿硬件中的一些错误,但除此之外,它(再次)是相当正常的编程。在相当多的情况下,最大的挑战是简单地决定如何将有问题的特定设备呈现给系统的其余部分。对于像硬盘驱动器这样通常很容易的东西,但对于像人机接口设备这样的东西,它可能更具挑战性(例如,你想把它呈现为它本身,还是你想模拟一些现有的设备类型,如键盘或鼠标?

对于没有真正记录的硬件,事情可能会变得更加困难。用于查看逻辑信号的真正通用工具是逻辑分析仪。如果你有使用众所周知的硬件接口(例如PS/2键盘/鼠标,USB,SATA)的东西,你可以找到更专业的工具(和/或逻辑分析仪的附加组件),使生活变得相当轻松。像NES或SNES控制器这样的东西几乎肯定使用专有接口,所以对于这些,你最终可能会使用逻辑分析仪。幸运的是,它们也可能是一个非常狭窄、缓慢的接口,因此逻辑分析仪不需要非常快或支持大量通道。

使用逻辑分析仪,您可以看到所有单独的信号,但对于专有接口,几乎可以由您来决定哪些信号做什么。在典型情况下,您至少会有一些相当明显的功能:电源,接地,很可能是时钟等等。在很多情况下,您很快就会发现,即使它没有公开记录,它也可能遵循一些众所周知的协议,如I2C,SPI等。

Linux Device Drivers是你想要的书。

在你等待这本书到来的时候,我可以告诉你,了解硬件是如何工作的,Linux内核是如何工作的,只是成功的一半。 您还需要了解特定设备的硬件级接口。 希望你能找到这方面的文档,但这可能很困难。

有关某人如何通过观察 Windows 驱动程序发出的命令来想出 Linux 驱动程序的示例,请参阅此相关问题:如何为 Linux 编写低级设备驱动程序?

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