1

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

因此,我移至pcmC0D0ppcmC0D0p_bak将我的驱动程序重命名为pcmC0D0p并通过每个命令MMAP,例如IOCTL等(但在转发 MMAPed 数据之前做其他事情)。

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

今天,我读到一篇关于Userspace device drivers.

现在我想知道:这真的可能吗?用用户空间代码编写一个“驱动程序”,实现 MMAP 和 IOCTL 等方法并将其放置在普通内核设备 (/dev/snd/pcmC0D0p) 的位置?

不是,不是吗?

如果可能的话,有人有一个简单的例子,一个参考吗?任何事情都非常受欢迎!

4

1 回答 1

0

可以编写用户空间设备驱动程序,但并不完全按照您的想法。

一个例子是uio_pci_generic模块,它可以使用 PCI 设备的 ID 进行编程(通过 /proc),并且可以通过mmap. read您可以通过阻止呼叫来接收中断。

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

于 2013-02-21T20:52:14.183 回答