令我感到惊讶的是,全能的Google尚未对“什么是VCHIQ?”这个问题给出现成的答案。我是一个长期的内核极客,不是Broadcom的雇员,也不是BCM283 *专家,但这是我为(也许)后代所发现的:
从Raspberry Pi内核分支:
BCM2708系列产品的内核到VideoCore通信接口。
这里值得注意的是,VideoCore是Pi运行的SoC的视频控制器(让您感到惊讶),这似乎是一种方便的方法,可将或多或少的直接IOCTL运行到连接到GPU的各个子系统。包含视频并不足为奇,但是考虑到视频所需的所有编解码器功能,我认为摄像头接口在VideoCore中具有其芯片是有意义的。
那么为什么音频控制也通过VideoCore运行(否则,不需要VCHIQ对其进行控制)?我怀疑,鉴于VC具有对H.264和其他编解码器的硬件支持(并且因为您可以通过HDMI路由音频),因此这只是放置硅片的最简单位置。嗯,事实是BCM芯片有两个MMU(一个用于VC + ARM,另一个用于常规OS- 请参见第5页的图),这使得零拷贝DMA成为可能(无需将内容复制到音频芯片-告诉它一部分内存属于它,而不属于CPU。Dunno尚未真正在后台进行此操作,但为什么不呢?)。
请注意,VCHIQ上的IOCTL本身并没有真正传输数据-它们在内存块之间设置了DMA和其他操作,并向各个位发送命令。这可能非常危险,因为您可能会破坏用户空间中的内部内核数据结构,使GPU崩溃,对损坏的数据进行悬吊等。因此,请勿将/ dev / vhciq设置为777模式!
无论如何,简短回答“什么是VCHIQ?” 这里是:
VCHIQ是正在运行的Linux内核与VideoCore芯片中的外围设备(除其他外)之间的命令接口。/ dev / vhciq还提供对这些命令的通用用户空间访问,以(至少)由摄像头和音频子系统使用。暴露给随机程序是一个非常危险的界面,因此默认情况下会受到一些限制。
RPi社区的BCM硬件中有些人注视着他们;我不是其中的一个(经过几个小时的研究,我可能脚踝深了:-))。就是说,我认为这是一个不错的高级概述,将欢迎您进行补充/更正。
至于为什么www-data需要权限,那是因为您的CGI程序正在以该用户的身份生成子进程。我不太了解特定的播放器,但是更好的做法通常是运行一些特殊的守护程序来控制与声音交互的程序,并使用UNIX套接字或类似接口从CGI控制它,而不是直接产生一个孩子。
确实,安全供应商因允许其Web服务器以root身份访问其计算机而前阵子破产。他们可能这样做是为了简化流程管理,而不是编写这种类型的中间层,但这是安全的禁忌。让Apache基本上不受限制地访问GPU DMA是一个同样糟糕的主意(尽管我承认很难利用)。
希望这能回答您的问题。
/dev/vhciq
一般不需要访问权限来运行音频-在这种情况下,这是因为OP正在使用它来进行音频处理omxplayer
,这可能不是理想的选择。