assembly - 超越抽象的好奇心 : how is bytecode executed? 设备驱动程序如何工作?

标签 assembly hardware abstraction device-driver

我在 *nix 上看到的一切都是对硬件的一组抽象,但我很好奇硬件是如何工作的。
我已经在汇编中进行了编程,但这仍然只是一组抽象。

处理器如何理解汇编操作码(作为字节码)?
设备驱动程序如何工作(在较低级别(抽象)进行解释)?

最佳答案

设备驱动程序形成操作系统的设备 API 和实际硬件寄存器之间的接口(interface)。

linux 设备 API 模型是更广泛的 linux 概念的延续,即一切都是文件,应用程序可以通过 open()、read()、write()、ioctl() 和 close( ) 界面。在后台,有一个 install() 例程,但操作系统决定何时调用它。

硬币的另一面是硬件。 CPU 使用特殊的 I/O 指令访问设备寄存器,或者使用普通的内存访问连接到硬件的特殊内存位置。虽然硬件寄存器可以像内存一样工作,但它们可以做内存不能做的事情。相当频繁地,写入设备的一个寄存器可以改变它的一些其他寄存器的值,并且可以通过连接硬件中的电事件来改变或改变。

设备驱动程序弥合了这一差距。由于设备类型的可能性几乎是无限的,因此很难概括出功能是如何映射的,除了几个点。 install() 例程在系统启动时触发,配置寄存器以进行正确操作,通常这包括设置中断服务和处理; open() 例程为应用程序提供与设备的逻辑连接;通常会努力使 read() 和 write() 以某种合理的方式移动数据,尽管有时您会看到这些实现为无操作;动态设备设置通过 ioctl() 操作。当然,close() 的主要工作是撤消 open() 的工作,特别注意释放 open() 获取的任何系统资源。

好吧,无论如何,这就是以 linux 为中心的观点。 Windows 模型,至少是我熟悉的模型(可能已经过时),倾向于提供特定于设备的函数调用库。

关于assembly - 超越抽象的好奇心 : how is bytecode executed? 设备驱动程序如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2845648/

相关文章:

assembly - 我无法理解 ARM : SBC, RSC 中的一些指令

c - 如何在不使其成为全局的情况下共享硬件抽象结构

python - 如何在python脚本中获取方波的频率

hardware - 今天是否有任何微处理器使用记分板或 Tomasulo 算法?

hardware - "Embedded"是什么意思?

java - 如何使用泛型在抽象类中注入(inject)服务

ruby - ruby 中的过程和数据抽象

c - MIPS 中的错误寻址 - 矩阵乘法

c++ - 在特定地址反汇编程序中的 x86 代码

assembly - 使用 Llvm pass 插入内联汇编表达式