如何从内核访问用户 space 中创建的节点?

How to access the node created in user space from kernel?

我正在做一个练习,我想从内核访问声卡的节点 /dev/snd/controlC0 以从内核 space 而不是用户 [=33] 设置 tinymix 控件=] 使用 tinymix 实用程序。现在,从 tinymix 实用程序的流程中,我发现在开始执行时,它将调用用户 space 的 mixer_open() 函数,该函数在内部调用 [=29] 的 snd_ctl_open() 函数=] 因为我必须从内核做同样的事情,所以我的模块需要调用相同的函数。我面临的问题是函数 snd_ctl_open() 有参数 struct inode *inode, struct file *file。那么如何获取我模块中节点的inode信息呢?

文件 mixer.c 位于 Android AOSP 代码 external/tinyalsa/mixer.csnd_ctl_open() 位于 Linux 内核中 sound/core/control.c

我在构建内核中找到了一个 API filp_open() 可以完成上述任务,但它只能在文件系统挂载后使用。我想在文件系统挂载前打开一个节点

简而言之,我的目标是了解如何在文件系统挂载之前从内核访问或打开设备节点。

感谢斯科特的回复。

我能够访问设备节点 /dev/controlC0 以及能够从内核模块设置混音器控制设置。我遵循了以下方法。

  1. sound/core/sound.c 中定义了一个全局结构“static struct snd_minor *snd_minors[SNDRV_OS_MINORS]”。该结构体包含所有声音设备的次要编号信息。
  2. 我找到了一种从设备次设备号中找到设备节点和文件指针结构的方法。所以我所做的是从我的驱动程序中调用一个函数 find_control_device(),该函数依次迭代所有设备并检查 SNDRV_DEVICE_TYPE_CONTROL(Sound Control Device) 设备类型。函数find_control_device() returns 控制设备的次编号
  3. 从设备minor no我可以得到设备节点和文件结构信息。
  4. 获得上述信息后,我调用 snd_ctl_open() 将打开一个设备节点进行操作。
  5. 作为用户 space 应用程序使用 IOCTL 与内核交互 space。要设置混音器设置,tinymix 调用 snd_ctl_ioctl() 函数。所以我制作了一个包装函数,它将在内部调用 snd_ctl_ioctl() 并设置混音器控制值。

我已经在 driver.So 的 module_init 功能部分完成了上述所有步骤,只要驱动程序在内核树中注册,就会根据要求设置所需的 tinymix 控件。

我引用了 AOSP 代码树中的 tinymix.c 代码来操作 IOCTL 的参数。

谢谢,

赫曼特