我编写了一个可加载内核模块(LKM),它将音频驱动程序包装在/ dev / snd / pcmC0D0p下。
因此,我将pcmC0D0p
移至pcmC0D0p_bak
,将我的驱动程序重命名为pcmC0D0p
,然后通过MMAP
,IOCTL
等所有命令(但执行其他操作)转发MMAPed数据之前。
这很糟糕,我知道(但这是我在linux编程中的第一步),但它确实有效。
今天,我在article中阅读Userspace device drivers
。
现在我想知道:这真的可能吗?用用户空间代码写一个“驱动程序”,实现像MMAP& amp; IOCTL并用它代替普通的内核设备(/ dev / snd / pcmC0D0p)?
不是,不是吗?
如果有可能,有没有人举一个简单的例子,参考?真的很受欢迎!
答案 0 :(得分:0)
可以编写用户空间设备驱动程序,但不像你想的那样。
示例是uio_pci_generic
模块,可以使用PCI设备的ID对其进行编程(通过/ proc),并通过mmap
使您可以使用设备的内存。您可以通过read
来阻止来接收中断。
请注意,这不允许您伪装成驱动程序,只执行类似驱动程序的操作(直接与硬件设备通信,接收中断等)。在没有某些内核模块的帮助下,任何用户空间程序都无法为ioctl提供服务,或将自身暴露为字符设备。