用户空间程序如何与内核模块交互?

Posted

技术标签:

【中文标题】用户空间程序如何与内核模块交互?【英文标题】:How do userspace programs interact with kernel moduels? 【发布时间】:2014-04-18 09:08:06 【问题描述】:

这个问题的动机是我试图弄清楚aplay sound.wav 与哪个内核模块进行通信以播放实际的音频文件。如果它使用了库函数,则追踪到库函数”。

我目前的理解是内核模块通过/dev中的设备文件提供了一个到用户空间的接口。因此,我希望在源代码中的某处识别一个来自 sound.wav 的流,该流被发送到/dev/something

这是对真实情况的过度简化吗?

【问题讨论】:

【参考方案1】:

ALSA 的设备节点位于/dev/snd。打开单个设备节点的逻辑在 libasound 中,并遵循(可选)/etc/asoundrc~/.asoundrc 中设置的规则。

我不确定这是否有助于您找到特定的内核模块。我会使用aplay -L 来识别所使用的硬件,然后使用lsmod 来查看它是哪个模块。

【讨论】:

【参考方案2】:

用户空间与内核交互的方式主要是你提到的设备文件和系统调用。还有其他的,例如 netlink、/sys 中的文件等等。

播放音频将通过设备文件完成,是的。但是,设备文件可能无法直接在应用程序中打开,它可以使用库来执行此操作。在这种情况下,程序确实会打开 /dev 文件,但您不会在源代码中找到它。

另一种可能性是它使用了声音服务器。在这种情况下,它根本不会打开 /dev 文件,它只是连接到声音服务器以让它完成这项工作。

【讨论】:

以上是关于用户空间程序如何与内核模块交互?的主要内容,如果未能解决你的问题,请参考以下文章

Linux用户与内核空间交互—ioctl

Linux用户与内核空间交互—ioctl

linux内核空间与用户空间信息交互方法

Linux用户与内核空间交互—debugfs

Linux用户与内核空间交互—debugfs

Linux用户与内核空间交互—sysfs