可以从用户空间直接访问硬件吗?

mat*_*975 7 linux drivers hardware

在工作中,我们有一些由 DOS 软件控制的嵌入式设备。我的任务是评估 Linux 作为下一代硬件上 DOS 的替代操作系统的使用。我的研究使我得出结论,DOS 只是一种完全不同类型的操作系统,如果您愿意,它可以让您做有潜在危险的事情。根据我的理解,如果您希望直接访问硬件,则必须编写自定义驱动程序。为了满足老板的好奇心,我需要知道以下几点:是否有可能直接从用户空间访问硬件

我的猜测是否定的,但我想请教那些比我知识渊博的人的意见。

Jam*_*man 5

是的,但很少有用。在 32 位 x86 系统上,您可以使用ioperm(2)系统调用来设置当前进程,以允许其直接执行端口 I/O。我相信这在 64 位系统上不起作用。你也可以进行lseek/read/write组合/dev/port,我认为这同样不太便携。有关更多详细信息,请参阅http://tldp.org/HOWTO/IO-Port-Programming-2.html 。当然,这两种方法都比编写设备驱动程序慢得多且灵活性差(/dev/port最慢)。当然,这些用户空间机制都不允许您处理中断或类似的事情。如果性能是一个问题,您最终将编写设备驱动程序。


Ban*_*uin 1

你的猜测是正确的。内核是唯一可以发送硬件请求的软件。这不仅适用于 Linux。事实上,没有比 DOS 更新的操作系统可以让您直接访问硬件,因为正如您所怀疑的那样,这非常危险。

不过,编写自己的驱动程序没有问题,并且有大量文档可用。例如,xatlantis 的这个教程似乎是最近的(这很重要!)并且是很好的来源。