设备驱动程序和Windows

时间:2010-05-31 19:01:49

标签: windows drivers

我正在尝试完成PC和操作系统如何相互作用的图片。我就是这样,在设备驱动程序方面,我几乎没有猜测。

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

那么,操作系统和PC的基本结构(通过PC我的意思是当然是HW)是我看到的除了直接CPU命令之外的所有其他命令,CPU可以自行完成(算术运算,其寄存器访问)和内存访问)必须通过操作系统。主要是因为3级环,你不能使用进出其他硬件的入口。我知道有MMIO,但必须首先通过端口通信设置。

一直不是这样的。即使我有点年轻还记得MSDOS,我知道你可以直接访问HW,因为没有限制,没有响铃模式。所以你可以写字符串到diplay使用DOS函数,或直接访问显卡内存并自己编写。

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

我理解这一点。我还可以理解,设备驱动程序是在0级环中运行的代码段,因此它可以执行所有HW交互。但我不明白的是OS和设备驱动程序之间的联系。我们举一个例子 - 我想让声卡发出声音。所以我将Windows API称为访问声卡,但会发生什么? Windows是否会调用设备驱动程序?

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

拜托,帮我理解这个烂摊子。我真的生气了。感谢。

2 个答案:

答案 0 :(得分:8)

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

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

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

  

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

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

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

  

但是,如果Windows具有由设备驱动程序处理的预定义功能集,则它不能使用在最新版操作系统出现之前存在的新驱动程序。

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

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

答案 1 :(得分:1)

基础: 请注意,此解释已经过简化,有时仅适用于大多数情况,而不是全部。

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

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

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

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

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

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