程序如何与设备驱动程序正确通信?


12

因此,我对程序员作为程序员与计算机上的设备进行通讯的方式感到困惑。现在我不是在谈论大创意。我知道有些设备驱动程序位于硬件之上,以便不同的程序可以使用这些功能。

但是总的来说,谁在和司机说话呢?程序员是否正在编写负责在驱动程序上调用函数的应用程序?还是程序员通过操作系统调用一个函数,然后由该函数处理对驱动程序的调用?



1
两者都有一点,并且因操作系统和设备类型而异。
whatsisname 2016年

Answers:


12

在涉及操作系统的地方,程序不会与设备驱动程序通信,至少不会直接与设备驱动程序通信。程序与抽象对话,而对于它们来说并不为人所知,最终最终通过一层或多层抽象与设备驱动程序对话。

我将跳过现代操作系统的复杂性,并以CP / M(45年前开发的微型计算机操作系统)为例。CP / M是一个三层的蛋糕:

程序。 顶层是一个程序,通过执行计算和I / O来做一些有用的事情(文字处理,播放“太空侵略者”)。假设某个时候程序要显示字母“ A”供用户查看。CP / M提供了一个称为console的抽象,与用户进行程序交互的地方应该在其中。发送字符的常规方法有一些汇编指令:

LD C,2   ; Load 2 into register C
LD E,65  ; Load the ASCII code for 'A' into register E
CALL 5   ; Call CP/M's routine for getting things done

(如果您不熟悉它们,寄存器可以看作是生活在处理器变量)。我们会得到神奇的数字是什么2以及5是所有关于一分钟。这里的要点是,程序只知道有一个控制台,并且有一种写入它的方法。它不知道或不在乎。这是CP / M用于I / O的两个抽象中的第一个。

BDOS5程序调用的地址是下一层(基本磁盘操作系统)BDOS的入口。BDOS提供了一系列带编号的功能,就像从餐厅菜单中按编号订购一样。通过将C功能编号的寄存器(2用于控制台输出)和E要发送的字符加载到寄存器中,可以告诉您想要控制台输出。控制台输出是一个非常简单的操作,BDOS除了调用下一层之外,实际上并不需要做很多事情。

BIOS。 BIOS(或基本输入/输出系统)是所有特定于硬件的代码所在的层。在现代系统中,这将被视为一组设备驱动程序。像BDOS一样,BIOS为BDOS用于开展业务的一组非常原始的标准操作提供了调用。这些操作之一称为CONOUT,它负责使程序要求的字符写到上面的两层,直到执行任何硬件操作为止。(与PC不同,那时的情况并不相同。每个人的系统都有不同的实现方式。)控制台输出是BDOS的简单传递方式,但是做一些更复杂的事情(如在磁盘上创建文件)可能需要BIOS调用以操纵媒体。同样,由于BIOS具有标准的抽象接口,因此BDOS始终知道如何获得所需的内容,而无需关心BIOS的工作方式。

您可能想知道为什么有两种抽象(从程序到BDOS和从BDOS到BIOS)而不是一个。答案是CP / M及其BDOS可以二进制形式提供给计算机制造商,他们会为其硬件编写带有设备驱动程序的自定义BIOS,将二者结合在一起,然后将其作为其系统的OS交付。这很重要,因为BDOS由一个组织维护,因此对于用户程序来说一直是个已知数目,这使得可以在非常广泛的(当时)硬件上运行相同的应用程序。这就是存在操作系统的原因,我们不只是编写直接缠绕硬件的程序

我在这里描述的所有内容也适用于现代操作系统。例如,Unix将所有内容抽象为文件。它使程序同一套系统调用(open()write()close()等)进行通信它是否是一个磁盘驱动器或串行端口。决策和抽象集要复杂得多,但最终还是归结为找出需要运行底层的设备驱动程序代码才能使操作发生。


我还没有真正看着CP / M代码之前(这是一个有点以前我的时间......我用CP / M电脑,但从来没有写过代码,他们的),但我宁愿通过使用惊讶call 5这里。会不会rst 8更有效(它会在目标地址上牺牲3个字节的内存,但是每次调用时节省2个字节...)?
Jules

@Jules:CP / M是为8080开发的,它只有一种中断模式,在这种模式下,中断设备会将单字节指令(通常是a RST)放在数据总线上。我不能肯定地说,但可能是因为没有足够的插槽来满足所有设备以及DDT(使用DDT使其产生断点)的需求,再加上使用其中一个进入BDOS的原因。 。
Blrfl

啊。是的,是的。我的8位开发经验仅限于仅具有单个中断源的计算机,因此不必担心太多此类事情... :)
Jules 16'6

快速提问,此过程与Windows OS和Windows内核有什么关系?还是我应该对此提出一个新问题。
杰森

@Jason:Wikipedia的页面描述了体系结构并提供了答案。自1993年以来,Microsoft生产的所有产品都使用此体系结构。这是一回事,只是蛋糕上有更多层。
Blrfl

0

有很多不同的可能性:

  • 对于常用设备,操作系统通常包含驱动程序实现的API,您的语言的标准库也将对此API进行适配。典型示例:文件系统,打印机,网络,MIDI乐器。
  • 对于更奇特的设备,设备制造商必须提供驱动程序,有时这些驱动程序还将包括流行语言的语言绑定。至少会有C绑定,并且几乎所有语言都有某种方法可以调用C库。
  • 在这两种情况之间的某种程度上,简单的设备可能只使用诸如串行端口之类的通用连接,而制造商仅发布协议,然后可以通过通用串行端口驱动程序使用该协议。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.