【问题标题】:kernel vs user-space audio device driver on macOSmacOS 上的内核与用户空间音频设备驱动程序
【发布时间】:2017-01-04 06:04:11
【问题描述】:

我需要为系统音频捕获(基于 Soundflower)开发音频设备驱动程序。
但很快出现了一个问题,似乎 IOAudioFamily 堆栈在 OSX 10.10 及更高版本中已被弃用。
查看IOAudioDeviceIOAudioEngine 头文件,苹果似乎建议现在使用在用户空间中运行的<CoreAudio/AudioServerPlugIn.h> API。但我找不到有关此用户空间设备驱动程序主题的大量信息。似乎唯一的资源是 Apple 提供的来自 https://developer.apple.com/library/prerelease/content/samplecode/AudioDriverExamples/Introduction/Intro.html
的示例设备 通过这些示例,我发现开发用户空间驱动程序而不是基于 I/O Kit 内核的工作要困难得多。
那么问题来了,在用户空间而不是内核空间开发设备驱动程序的动机是什么?

【问题讨论】:

    标签: c++ macos operating-system kernel core-audio


    【解决方案1】:

    关于这个主题有一本很棒的书,可以在这里免费在线获得:

    http://free-electrons.com/doc/books/ldd3.pdf

    请参阅第 37 页,了解您可能需要用户空间驱动程序的原因的摘要,为方便起见,在此处复制:

    用户空间驱动的优点是:

    • 可以链接完整的 C 库。驱动程序可以执行许多奇异的任务,而无需借助外部程序(实用程序 实现通常分发的使用策略的程序 以及驱动程序本身)。
    • 程序员可以在驱动程序代码上运行常规调试器,而无需通过扭曲来调试正在运行的内核。
    • 如果用户空间驱动程序挂起,您可以简单地杀死它。驱动程序的问题不太可能挂起整个系统,除非硬件 被控制真的是行为不端。
    • 与内核内存不同,用户内存是可交换的。一个不经常使用的设备和一个巨大的驱动程序不会占用其他程序可以占用的 RAM 正在使用,但实际使用时除外。
    • 设计良好的驱动程序仍然可以像内核空间驱动程序一样允许对设备进行并发访问。
    • 如果您必须编写闭源驱动程序,用户空间选项可以让您更轻松地避免不明确的许可情况和 更改内核接口的问题。

    【讨论】:

    • 这个问题专门针对 macOS CoreAudio 驱动程序,您链接到的书是关于 Linux 驱动程序的。
    【解决方案2】:

    “SimpleAudioDriver”示例的名称有些错误。它演示了 API 的几乎所有功能。如果您确实需要使用这些功能,这可以作为参考。它的结构也可能比必要的要复杂一些。

    对于虚拟设备,NullAudioDriver 可能是一个更好的基础,并且更容易理解(如果我没记错的话,单个源文件)。 SimpleAudioDriver 对于处理热插拔、相同设备的多个实例等问题更有用。

    IOAudioEngine 如您所说已被弃用,并且自 OS X 10.10 以来一直存在。预计它最终会消失,因此如果您使用它构建驱动程序,您可能需要比创建基于核心音频服务器插件的驱动程序更快地重写它。

    无论哪种方式,测试和调试音频驱动程序都很尴尬(因为对时间非常敏感),但我想说用户空间的驱动程序处理起来稍微不那么令人沮丧。您仍然希望在与您的开发 Mac 不同的机器上进行测试,因为如果 coreaudiod 崩溃或挂起,应用程序通常也会开始锁定,因此只需 ssh 进入、删除您的插件并杀死 coreaudiod 就很方便。肯定比重启要快。

    (FWIW,我已经发布了内核和用户空间 OS X 音频驱动程序,并且我花了很多时间在 kexts 上工作。)

    【讨论】:

    • 性能怎么样?由于服务器插件版本在用户空间中运行,它应该比内核版本更有效地与用户空间应用程序通信?不需要用户内核上下文切换?
    • 我想如果它是一个虚拟设备,可能会有如此微小的优势。对于一个真实的设备,无论如何你最终都会调用内核,所以它是相当无关紧要的。此外,很多事情,例如磁盘或网络 I/O 或 IPC 都会导致上下文切换。我会说总体而言它与性能几乎无关。
    • 在哪里可以找到您所说的 NullAudioDriver 示例?这个here 似乎是 SimpleAudioDriver 示例的现代版本,但我没有看到 NullAudioDriver 示例。
    • 我找到了 NullAudioDriver 示例的现代版本,即here
    • 我正在尝试录制系统音频。我从苹果文档下载了这些示例。男孩,我一个字都听不懂。有什么指南/博客可以做吗?-ps 我几乎看不懂c++
    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多