Raspberry Pi中的/ dev / vchiq是什么?


10

我正在使用Raspberry Pi 3和Raspbian Jessie,并且通过尝试用perg-cgi调用程序(omxplayer)遇到了/ dev / vchiq,这会在我的RiPi上播放一些音乐。而且我不能让它工作。

当我用浏览器(例如localhost / muzikica / pusti.pl)打开它[apache2]时,它说“ 无法打开vchiq实例 ”。因此,我将/ dev / vchiq文件的权限更改为xx7,并且一直有效,直到我没有重新启动RiPi。因此找出原因,并将www-data(正在执行我的pusti.pl脚本将调用我的程序的用户)添加到视频组,因为/ dev / vchiq是视频组的一部分。而且有效!

现在,/ dev / vchiq xD 是什么,为什么www-data至少需要读写权限才能在Raspberry Pi上播放声音?

提前致谢。

Answers:


12

令我感到惊讶的是,全能的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是一个同样糟糕的主意(尽管我承认很难利用)。

希望这能回答您的问题。


1
“那么为什么音频控制也通过VideoCore运行(否则它不需要VCHIQ来控制它)?” ->请注意,您/dev/vhciq一般不需要访问权限来运行音频-在这种情况下,这是因为OP正在使用它来进行音频处理omxplayer,这可能不是理想的选择。
goldilocks

嗯 我希望有一个ALSA驱动程序可以创建适当的用户陆地接口。除了5秒钟的Google搜索外,我对omxplayer一无所知,并且想知道它是否对音频的额外访问(例如使用硬件编解码器)做任何有趣的事情,还是只是愚蠢地打开了不需要的设备。令人着迷,我也可以想象一下,ALSA驱动程序在幕后(直接在内核空间,natch中)使用VHCIQ。整洁的东西!
BJ Black Black

1
我不知道这是否是实际发生的情况,但是推测……GPU具有硬件MPEG解码,并且可能包括MP3音频(无论哪种方式都找不到引用),而硬件解码器的消耗可能会少一些果汁比软件解码。完全不值得为安全付出代价,但可能很有趣。
BJ黑色

1
嗯 整齐。只是浏览pqru.qr.ai,看起来ALSA驱动程序确实确实在幕后使用了VHCIQ(无需与/ dev / vhciq对话,因为它可以直接调用内核API,但仍然可以...)。
BJ黑色

2
当然。基本上,这里发生的事情是Broadcom芯片分为两个主要部分:CPU(Linux与之通信并运行通用软件)和GPU(运行独立的固件并处理视频等)。VCHIQ是CPU用于与GPU对话的接口。这是一个简化,但目前可能已经足够。
BJ黑色者

0

在我的情况下,除了默认用户外,当我创建一个新用户时,我遇到了同样的问题,不仅在声音方面,而且在wifi的配置,访问串行端口等方面都遇到了问题……然后我打开了/ etc /组文件。然后,我将用户添加到插入了用户“ pi”的所有组中,并且一切正常。如下:

根:x:0:
守护进程:x:1:
bin:x:2:
sys:x:3:
adm:x:4:pi,carlos 
tty:x:5:pi,carlos
磁盘:x:6:
lp:x:7:
邮件:x:8:
新闻:x:9:
uucp:x:10:
男子:x:12:
代理:x:13:
kmem:x:15:
拨出:x:20:pi,carlos
传真:x:21:
声音:x:22:
光盘:x:24:pi,卡洛斯
软盘:x:25:
胶带:x:26:
sudo:x:27:pi,卡洛斯 
音频:x:29:pi,carlos,按
倍数:x:30:
www-data:x:33:
备用:x:34:
运算符:x:37:
清单:x:38:
irc:x:39:
src:x:40:
gna:x:41:
阴影:x:42:
utmp:x:43:
视频:x:44:pi,carlos
sasl:x:45:
plugdev:x:46:pi,卡洛斯
工作人员:x:50:
游戏:x:60:pi,卡洛斯 
用户:x:100:pi,卡洛斯
nogroup:x:65534:
输入:x:101:pi,carlos
systemd-journal:x:102:
systemd-timesync:x:103:
systemd-network:x:104:
systemd-resolve:x:105:
systemd-bus-proxy:x:106:
crontab:x:107:
netdev:x:108:pi,carlos
pi:x:1000:
messagebus:x:109:
ssh:x:110:
蓝牙:x:111:
avahi:x:112:
spi:x:999:pi,卡洛斯 
i2c:x:998:pi,卡洛斯 
gpio:x:997:pi,卡洛斯
lightdm:x:113:
epmd:x:114:
ssl-cert:x:115:
卡洛斯:x:1001:
rtkit:x:116:
按:x:117:
脉冲访问:x:118:
 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.