8

我正在尝试完成 PC 和操作系统如何交互的画面。而且我正处于这一点,当涉及到设备驱动程序时,我几乎没有猜到。

请不要写太复杂的东西,或者你不需要知道什么时候使用高编程语言和winapi函数。我想知道,这是为了学习。

因此,操作系统和 PC(我指的是 PC,当然是硬件)的基本结构是我所看到的,除了直接 CPU 命令之外,CPU 可以自行执行所有命令(算术运算、其寄存器访问和内存访问) ) 必须通过操作系统。主要是因为从第 3 级环开始,您不能使用用于对其他硬件进行访问的输入和输出指令。我知道有MMIO,但必须先通过端口通信设置。

并非一直都是这样。即使我还记得MSDOS,我还很年轻,我知道您可以直接访问HW,因为没有限制,没有响铃模式。所以你可以使用其他DOS函数写字符串来显示,或者直接访问显卡内存并自己写。

但是随着操作系统的发展,已经没有这种可能了。但这很好,因为操作系统现在处理所有硬件通信,坦率地说,它在多任务环境中更方便和更安全(我会说唯一的选择)。因此,现在您不再使用 int 指令来使用 BIOS 映射函数或 DOS 函数,而是调用 dll 在内部而不是处理您不需要知道的所有内容。

我明白这一点。我还理解设备驱动程序是在环级别 0 中运行的一段代码,因此它可以完成所有硬件交互。但我不明白的是操作系统和设备驱动程序之间的连接。举个例子——我想让声卡发出声音。所以我调用windows API来访问声卡,但是会发生什么呢?Windows会调用设备驱动程序吗?

但是如果它确实调用了设备驱动程序,是否意味着所有可以被winAPI函数调用的设备驱动程序都必须具有以某种特定方式命名的例程?我的意思是,当我有新的声卡时,它的驱动程序必须具有与旧声卡相同的功能吗?那么Windows实际上可以从它的角度调用相同的函数吗?但是,如果 Windows 已经预定义了设备驱动程序所需的功能集,那么它就不能使用在最新版本的操作系统出现之前不存在的新驱动程序。

请帮我理解这个烂摊子。我真的要生气了。谢谢。

4

2 回答 2

10

Windows 设备驱动程序有点像 DLL:除了不是应用程序动态链接/加载它,而是动态链接/加载它的是 O/S。

注册表项告诉 O/S 存在哪些设备驱动程序(以便 O/S 知道要动态链接/加载哪些设备驱动程序)。

设备驱动程序在环 0 中运行。在环 0 中,它们(设备驱动程序)无法访问(无法链接或使用)Windows API:相反,它们可以访问各种 NT 内核 API。

但是如果它确实调用了设备驱动程序,是否意味着所有可以被winAPI函数调用的设备驱动程序都必须具有以某种特定方式命名的例程?我的意思是,当我有新的声卡时,它的驱动程序必须具有与旧声卡相同的功能吗?那么Windows实际上可以从它的角度调用相同的函数吗?

基本上是的。给定类型或类中的所有设备驱动程序(例如,所有视频驱动程序或所有磁盘驱动程序)都有类似的 API,由 O/S 调用(和/或由更高级别的驱动程序调用,例如磁盘驱动程序是由文件系统驱动程序使用/调用)。

Windows 设备驱动程序工具包定义了各种 API,并包括各种类型设备的示例驱动程序。

但是,如果 Windows 已经预定义了设备驱动程序所需的功能集,那么它就不能使用在最新版本的操作系统出现之前不存在的新驱动程序。

O/S动态链接到设备驱动函数:因为设备驱动API是预定义的,所以就O/S而言设备驱动是可以互换的;可以编写新的设备驱动程序,只要它们支持(向后兼容)标准设备驱动程序 API。

动态链接机制与 COM 对象或 C++ 类实现任何预定义的纯抽象接口的方式非常相似:DDK 中的头文件声明纯抽象接口(如虚函数),设备驱动程序实现这些功能, O/S 加载驱动程序并调用这些函数。

于 2010-05-31T19:10:27.557 回答
1

基础知识: 请注意,这种解释是简化的,有时仅适用于大多数情况,而不是全部。

您将遇到的大多数硬件设备都具有以下基本操作: 写入它们的内存(或寄存器)。从它们的内存(或寄存器)中读取。

这足以控制硬件,为其提供所需的数据,并从中获取所需的数据。

这些内存区域由 BIOS 和/或操作系统映射到您 PC 上的物理内存范围(反过来可能由您的驱动程序访问。)

所以我们现在有了设备驱动程序知道要做的两个操作 READ 和 WRITE。

另外,驱动可以不涉及cpu的方式进行读写。这称为直接内存访问 (DMA),通常由您的硬件执行。

最后一种操作称为中断,旨在让您的硬件通知您的驱动程序刚刚发生的事情。这通常是通过硬件中断 CPU 并调用驱动程序以高优先级执行某些操作来完成的。例如:硬件中的图像已准备好由驱动程序读取。

于 2017-10-19T05:39:15.383 回答