在用户空间中包装内核驱动程序:它是真的吗?可能吗?

时间:2013-01-08 17:30:58

标签: linux-device-driver interceptor kernel-module

我编写了一个可加载内核模块(LKM),它将音频驱动程序包装在/ dev / snd / pcmC0D0p下。

因此,我将pcmC0D0p移至pcmC0D0p_bak,将我的驱动程序重命名为pcmC0D0p,然后通过MMAPIOCTL等所有命令(但执行其他操作)转发MMAPed数据之前。

这很糟糕,我知道(但这是我在linux编程中的第一步),但它确实有效。

今天,我在article中阅读Userspace device drivers

现在我想知道:这真的可能吗?用用户空间代码写一个“驱动程序”,实现像MMAP& amp; IOCTL并用它代替普通的内核设备(/ dev / snd / pcmC0D0p)?

不是,不是吗?

如果有可能,有没有人举一个简单的例子,参考?真的很受欢迎!

1 个答案:

答案 0 :(得分:0)

可以编写用户空间设备驱动程序,但不像你想的那样。

示例是uio_pci_generic模块,可以使用PCI设备的ID对其进行编程(通过/ proc),并通过mmap使您可以使用设备的内存。您可以通过read来阻止来接收中断。

请注意,这不允许您伪装成驱动程序,只执行类似驱动程序的操作(直接与硬件设备通信,接收中断等)。在没有某些内核模块的帮助下,任何用户空间程序都无法为ioctl提供服务,或将自身暴露为字符设备。