驱动程序<->操作系统/应用程序 它是如何工作的?一个例子



假设我想制作一个应用程序、一些硬件和驱动程序来与之通信。假设设备连接到主板或通过USB。该设备将是一块带有8LED的板。我想要的接口是

bool lock() //true if success
void unlock()
//each bit is matched up to an LED and set means the led is on. 
//Return value is <0 on error. 0 on success. >0 on noncritical error
int  set(char v)

假设非关键错误意味着您发送<200ms,所以它被忽略了,因为设备不想那么快地打开/关闭LED。

比方说,这个应用程序接收一系列文本,并使用该设备闪烁字母/单词的莫尔斯电码。操作系统不知道设备是如何工作的。应用程序如何与驾驶员通信?我不相信使用DLL/SO是因为驱动程序在自己的进程中。

在windows或linux中,应用程序如何与设备驱动程序通信?我对如何编写设备驱动程序不感兴趣。应用程序和内核是如何与之通信的。

既然您要求Windows和linux,我将回答您的两个问题。

Linux:

在linux世界中,几乎所有的东西都是一个文件。通过将输出从一个二进制源重定向到接收器(文件或设备文件),或将输出从某个二进制文件管道传输到另一个二进制文件,所有内容都可以从A到B。最简单的例子是字符设备,最简单的字符设备例子是串行驱动程序。

以下命令:

echo ciao > /dev/ttyS0

是如何将用户空间连接到内核空间的完美示例。

注意:/dev/ttyS0是串行端口的标准命名法,相当于Windows中的COM1。

我已经向字符设备/dev/ttyS0发送了至少4个字节。代码执行从内核空间开始,因此调用函数open()(在驱动程序中定义)来初始化串行端口,直到现在串行端口都关闭了

在linux中进行初始化,不仅准备了串行端口,还打开了TTY线路。TTY代表电传打字,它透明地管理将"ciao"字符串移动到硬件设备。

以下是步骤:

  1. 准备串行线路(或gpio或其他)
  2. 在RAM中创建数据缓冲区以将数据放入
  3. 将硬件地址的内存映射到内核可访问的内存空间
  4. 将数据从RAM缓冲区复制到内存映射的硬件地址中
  5. 然后,硬件设备将对数据进行任何设计:即调制和传输RS232数据或设置GPIO高或低

Windows:

在Windows中,设备通常不表示为文件,因此这需要用程序来完成。系统调用实际上是相同的,通常用户空间到内核空间的接口通常由以下类型的函数提供:open()、read()、write()和close()。

两者:

这些调用通常用于所有类型的驱动程序,包括图形和声音驱动程序。在我的linux示例中,我描述了如何将字符串回显到字符设备中,但我也可以将表示特定音调或频率的十六进制值回显到我的音频设备,该值可以在/dev/audio0中找到。

在GPIO的情况下,过程类似:打开(随机文件或缓冲区),写(1)或写(0),从用户空间复制到缓冲区()。

同样在GPIO的情况下,linux提供了一种从用户空间访问和操作GPIO的简单方法。查找proc文件系统。它导出像/proc/gpio/gpio1/value这样的路径,您可以非常容易地从shell或应用程序中回显0或回显1。

我希望这能澄清你的疑虑!

-Vittorio

最新更新