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

标签 c++ c linux driver

<分区>

所以我在摆弄 Raspberry Pi,突然想到“所有这些驱动程序都来自哪里”。就像专门针对我在其上使用的 SNES Controller 一样......到底有人想出如何编写它。

我对 C 和 C++ 都非常了解……好吧。但这一直是我有点想的事情。它很酷,因为它的级别很低,足以理解硬件方面可能发生的事情......但也很适合了解操作系统。

我从哪里开始做这样的事情?我猜想在 Windows 上执行此操作会大不相同。

谢谢

最佳答案

在我看来,这里确实有两个问题彼此之间并没有太多关系。

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

另一个问题是这样的:“你如何确定特定硬件(如 SNES Controller )使用什么协议(protocol)(或“协议(protocol)是”)。当你为普通硬盘驱动器或键盘等东西开发时,您几乎可以按照文档进行操作。您可能(经常这样做,至少以我的经验)发现您需要补偿硬件中的一些错误,但除此之外,它(再次)是相当正常的编程。相当大的挑战这些情况中的一些只是决定如何向系统的其余部分展示所讨论的特定设备。对于像硬盘驱动器这样的东西通常很容易,但是对于像人机界面设备这样的东西,它可能有点更具挑战性(例如,您想将其呈现为它本身,还是想模拟某些现有类型的设备,如键盘或鼠标?)

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

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

关于c++ - 学习编写低级驱动程序 (Linux)。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19760764/

相关文章:

c++ - 为什么 valgrind 说基本的 SDL 程序正在泄漏内存?

c++ - 调整 CMakeList.txt 以与 CUDA 一起运行

c++ - 在 OpenCv 中对 cv::Mat 进行排序

python - Crontab 正在运行同一 .py 的多个实例

linux - 需要删除与 iptables 建立的连接

c++ - ZXing 库 : Errors in iOS: private field 'cached_y_' is not used

c - PostgreSQL C 函数建议

c - 从正在用 C 修改的文件中读取

java - 在 Java 中保存大型静态类型安全字典的优雅方式 - 或者避免代码太大

java - 在 IntelliJ Idea 中,我的应用程序可以运行,但作为 jar 运行——不是因为 "Error: Could not find or load main class"