Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设备驱动程序和Windows_Windows_Drivers - Fatal编程技术网

设备驱动程序和Windows

设备驱动程序和Windows,windows,drivers,Windows,Drivers,我正在尝试完成PC和操作系统如何相互作用的图片。我正处在这样一个时刻,当涉及到设备驱动程序时,我几乎没有什么不可猜测的 请不要写太复杂的东西,或者你不需要知道什么时候使用高级编程语言和winapi函数。我想知道,这是为了学习 所以,OS和PC(我指的是PC,当然是硬件)的基本结构是,除了直接的CPU命令,CPU可以自己执行的所有命令(算术运算、寄存器访问和内存访问)都必须通过OS。主要是因为从环级别3开始,您不能使用用于访问其他硬件的in和out指令。我知道有MMIO,但必须先由端口通信设置 并

我正在尝试完成PC和操作系统如何相互作用的图片。我正处在这样一个时刻,当涉及到设备驱动程序时,我几乎没有什么不可猜测的

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

所以,OS和PC(我指的是PC,当然是硬件)的基本结构是,除了直接的CPU命令,CPU可以自己执行的所有命令(算术运算、寄存器访问和内存访问)都必须通过OS。主要是因为从环级别3开始,您不能使用用于访问其他硬件的in和out指令。我知道有MMIO,但必须先由端口通信设置

并不是一直都是这样。即使我还记得MSDOS,我知道你可以直接访问硬件,因为它没有限制,没有环模式。所以你们可以用DOS函数写字符串来播放,或者直接访问显卡存储器,自己写

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

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

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


请帮我理解这一团糟。我真的很生气。谢谢。

Windows设备驱动程序有点像DLL:只是不是应用程序动态链接/加载它,而是由O/s动态链接/加载它

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

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

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

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

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

但是,如果Windows具有设备驱动程序所需的预定义功能集,它就不能使用上一版本操作系统出现之前存在的新驱动程序

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


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

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

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

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

这些内存区域由BIOS和/或操作系统映射到PC上的物理内存范围(驱动程序可能会依次访问该范围)

所以我们现在有两个读写操作,设备驱动程序知道怎么做

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


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

谢谢,回答不错。我能再要一个吗?如果我正确理解的话,对于操作系统“已知”的设备,有一组预定义的函数名,因此操作系统可以调用例如“get_sector()”函数,而不管哪个控制器用于HDD访问(SCSI、SATA、ATA…)。但是,如果我有一个全新的设备,什么是操作系统无法操作的