学习编写低级驱动程序(Linux)
Learning to write low level drivers (Linux).
所以我在摆弄树莓派,我突然想到"所有这些驱动程序来自哪里"。就像我专门用于它们使用的SNES控制器一样。到底有人是怎么想出怎么写的。
我了解C,C++...还行。但这一直是我思考的问题。这很酷,因为它的级别很低,足以理解硬件方面的情况......但也很高兴了解操作系统。
我从哪里开始这样的事情?我猜为窗口这样做会有所不同。
谢谢
在我看来,这里真的有两个问题彼此没有多大关系。
第一个是"Linux 对设备驱动程序有什么要求?这几乎总是可以通过阅读文档来回答。尽管设备驱动程序文档可能(可以说)比编写普通程序的文档更不彻底、完整、易于阅读等,但它仍然相当不错。与普通代码的最大区别可能是调试,这通常是通过简单地用printk
打印东西来完成的。
另一个问题是:"你如何弄清楚SNES控制器等特定硬件使用的协议(或"协议")是什么。当您开发普通硬盘驱动器或键盘之类的东西时,您几乎可以按照文档进行操作。你可能会(经常这样做,至少根据我的经验)发现你需要补偿硬件中的一些错误,但除此之外,它(再次)是相当正常的编程。在相当多的情况下,最大的挑战是简单地决定如何将有问题的特定设备呈现给系统的其余部分。对于像硬盘驱动器这样通常很容易的东西,但对于像人机接口设备这样的东西,它可能更具挑战性(例如,你想把它呈现为它本身,还是你想模拟一些现有的设备类型,如键盘或鼠标?
对于没有真正记录的硬件,事情可能会变得更加困难。用于查看逻辑信号的真正通用工具是逻辑分析仪。如果你有使用众所周知的硬件接口(例如PS/2键盘/鼠标,USB,SATA)的东西,你可以找到更专业的工具(和/或逻辑分析仪的附加组件),使生活变得相当轻松。像NES或SNES控制器这样的东西几乎肯定使用专有接口,所以对于这些,你最终可能会使用逻辑分析仪。幸运的是,它们也可能是一个非常狭窄、缓慢的接口,因此逻辑分析仪不需要非常快或支持大量通道。
使用逻辑分析仪,您可以看到所有单独的信号,但对于专有接口,几乎可以由您来决定哪些信号做什么。在典型情况下,您至少会有一些相当明显的功能:电源,接地,很可能是时钟等等。在很多情况下,您很快就会发现,即使它没有公开记录,它也可能遵循一些众所周知的协议,如I2C,SPI等。
Linux Device Drivers是你想要的书。
在你等待这本书到来的时候,我可以告诉你,了解硬件是如何工作的,Linux内核是如何工作的,只是成功的一半。 您还需要了解特定设备的硬件级接口。 希望你能找到这方面的文档,但这可能很困难。
有关某人如何通过观察 Windows 驱动程序发出的命令来想出 Linux 驱动程序的示例,请参阅此相关问题:如何为 Linux 编写低级设备驱动程序?
对于Windows,这个过程实际上并没有太大的不同。 所有概念仍然相同,因为它是相同的硬件。 当然,区别在于细节。
- Mongodb c++驱动程序:如何查询元素的数组
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 使用mongocxx驱动程序时包含头文件问题
- void*到驱动程序中的UnicodeString
- C++驱动程序看不到头文件
- 用于创建/注册虚拟存储设备的 IOKit 驱动程序
- 员工测试驱动程序数据结构
- 获取 OID(类型::b_oid)作为 MongoDB C++驱动程序中的字符串
- 如何在 c++ 中映射驱动程序?
- 如何在 cuda 中将 kd 树从主机复制到驱动程序
- Apache Ignite v2.7:无法构建 Linux ODBC 驱动程序 - 内联变量编译错误
- 如何修复在 Linux 内核 SPI 驱动程序中始终无法验证的 SPI 驱动程序
- 专有NVIDIA驱动程序的Linux上有多个OpenGLX渲染上下文
- SDL2硬件加速渲染器在Xubuntu上使用专有驱动程序时会崩溃Linux
- 我可以在 Linux CentOS 6 中安装没有驱动程序的 CUDA 吗(只有 cuda 工具包)
- 学习编写低级驱动程序(Linux)
- 在Linux上使用AMD驱动程序时,glDrawElements会发出GL_INVALID_OPERATION
- 如何在Linux上使用内置的Kinect驱动程序?
- 用MCA 8000A编写Linux驱动程序
- 安装Linux VMware 11 guestmesa驱动程序更新OpenGL