假设我想制作一个应用程序、一些硬件和一个与之通信的驱动程序。假设设备连接到主板或通过 USB 连接。该设备是一 block 带有 8 个 LED 的板。我想要的界面是
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”字符串移动到硬件设备。
步骤如下:
- 准备串行线(或gpio或其他)
- 在RAM中创建数据缓冲区以将数据放入
- 将硬件地址的内存映射到内核可访问的内存空间
- 将数据从 RAM 缓冲区复制到内存映射的硬件地址。
- 然后,硬件设备将对该数据执行其设计的任何操作:即调制和传输 RS232 数据或将 GPIO 设置为高或低。
Windows:
在 Windows 中,设备通常不表示为文件,因此这需要以编程方式完成。系统调用实际上是相同的,通常用户空间到内核空间的接口(interface)通常由以下类型的函数提供: open()、read()、write() 和 close()。
两者:
这些调用通常用于所有类型的驱动程序,包括图形和声音驱动程序。在我的 Linux 示例中,我描述了如何将字符串回显到字符设备,但我也可以将表示特定音调或频率的十六进制值回显到我的音频设备,该音频设备可以在/dev/audio0 中找到。
对于 GPIO,过程类似: 打开(随机文件或缓冲区),写入(1)或写入(0),copyfromuserspacetohwbuffer()。
同样对于 GPIO,Linux 提供了一种从用户空间访问和操作 GPIO 的简单方法。查找 proc 文件系统。它导出像/proc/gpio/gpio1/value 这样的路径,您可以在其中轻松地从 shell 或应用程序中 echo 0 或 echo 1。
希望这能解答您的疑问!
-维托里奥
关于windows - 驱动程序<->操作系统/应用程序它是如何工作的?一个例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9586442/