O que é / dev / vchiq no Raspberry Pi?

10

Estou usando o Raspberry Pi 3 e o raspbian jessie e me deparei com / dev / vchiq tentando chamar o programa (omxplayer) com perg-cgi, que tocaria alguma música no meu RiPi. E eu não poderia fazê-lo funcionar.

Quando o abri com meu navegador (por exemplo, localhost / muzikica / pusti.pl) [apache2], ele dizia " falha ao abrir a instância do vchiq ". Então mudei as permissões do arquivo / dev / vchiq para xx7 e funcionou até não reiniciar o meu RiPi. Então descobri e adicionei www-data (usuário que está executando meu programa que meu script pusti.pl chamaria) ao grupo de vídeos, porque / dev / vchiq faz parte do grupo de vídeos. E funcionou!

Agora, o que diabos é o / dev / vchiq xD e por que o www-data precisa de pelo menos permissões de leitura e gravação para reproduzir som no meu Raspberry Pi?

Desde já, obrigado.

Бојан Драшко
fonte

Respostas:

12

Estou surpreso que o todo-poderoso Google não tenha uma resposta pronta para a pergunta "o que é VCHIQ?" Sou um nerd de longa data do kernel e não sou um funcionário da Broadcom, nem sou especialista do BCM283 *, mas eis o que eu encontrei para a posteridade (talvez):

No ramo do kernel do Raspberry Pi :

Interface de comunicação do kernel para o VideoCore para a família de produtos BCM2708.

O que vale a pena notar aqui é que o VideoCore é (surpresa surpresa) o controlador de vídeo do SoC que o Pi executa, e parece que essa é uma maneira útil de executar IOCTLs diretos mais ou menos diretos para vários subsistemas conectados à GPU . Isso inclui vídeo não é uma grande surpresa, mas acho que faz sentido que a interface da câmera tenha seu silício no VideoCore, considerando todas as coisas de codec que o vídeo precisa fazer.

Então, por que o controle de áudio também é executado no VideoCore (caso contrário, não seria necessário o VCHIQ para controlá-lo)? Eu suspeito que, dado o VC ter suporte de hardware para H.264 e outros codecs (e porque você pode rotear o áudio através de HDMI), esse era apenas o lugar mais fácil para colocar o silício. Bem, isso e o fato de o chip BCM ter dois MMUs (um para o VC + ARM, outro para uso normal do SO - veja o diagrama na página 5 ), o que torna possível o DMA de cópia zero (não é necessário copiar itens para o silício de áudio - diga a ele que um pedaço de memória pertence a ele e não à CPU. Ainda não sei se eles fazem isso de verdade, mas por que você não faria isso?).

Observe que os IOCTLs no VCHIQ realmente não transferem dados em si - eles configuram o DMA e outras operações entre os pedaços de memória e enviam comandos para vários bits. Isso pode ser super perigoso, pois você pode estragar as estruturas internas de dados do kernel do espaço do usuário, travar a GPU, evitar dados corrompidos, etc. Portanto, não defina / dev / vhciq para o modo 777 !!!

De qualquer forma, a resposta curta para "o que é VCHIQ?" Aqui está:

VCHIQ é uma interface de comando entre o kernel Linux em execução e os periféricos (entre outras coisas) no silício VideoCore. O / dev / vhciq fornece acesso genérico ao espaço do usuário a esses comandos para uso (no mínimo) dos subsistemas de câmera e áudio. É uma interface decentemente perigosa para expor a programas aleatórios, daí as permissões um tanto restritivas por padrão.

Existem pessoas que estão à altura dos olhos no hardware do BCM na comunidade RPi; Eu não sou um deles (talvez até o tornozelo depois de algumas horas de pesquisa :-)). Dito isto, acho que essa é uma visão geral decente de alto nível e gostaria de receber adições / correções.

Na medida em que o www-data requer permissão, isso ocorre porque seu programa CGI está gerando processos filho como esse usuário. Eu não conheço bem esse jogador em particular, mas a melhor prática geralmente seria executar algum daemon de especialidade para controlar o programa que faz interface com o som e controlá-lo a partir do CGI usando um soquete UNIX ou interface semelhante, em vez de gerar diretamente uma criança.

De fato, um fornecedor de segurança foi preso há um tempo atrás por permitir o acesso raiz do servidor da web à sua máquina. Eles provavelmente fizeram isso para facilitar o gerenciamento de processos, em vez de escrever esse tipo de camada intermediária, mas é um não-não de segurança. Dar ao apache basicamente acesso irrestrito ao GPU DMA é uma idéia igualmente ruim (embora muito mais difícil de explorar, admito).

Espero que isso responda sua pergunta.

BJ Black
fonte
11
"Então, por que o controle de áudio também é executado no VideoCore (caso contrário, não seria necessário o VCHIQ para controlá-lo)?" -> Observe que você não precisa ter acesso para /dev/vhciqexecutar o áudio em geral - nesse caso, é porque o OP está usando omxplayerisso, o que provavelmente não é o ideal.
goldilocks
Hmm. Espero que exista um driver ALSA que crie as interfaces terrestres de usuário apropriadas. Eu não sei nada sobre o omxplayer além de uma pesquisa no Google de cinco segundos e me pergunto se está fazendo algo interessante com esse acesso extra ao áudio (como usar um codec de hardware) ou simplesmente abrindo estupidamente um dispositivo que não precisa. Fascinante, e eu também imaginaria que o driver ALSA usa o VHCIQ sob as cobertas (diretamente no kernelspace, natch). Coisa legal!
BJ Black
11
Não sei se é isso o que realmente acontece, mas especulação ... A GPU possui decodificação MPEG de hardware e isso pode incluir áudio MP3 (não é possível encontrar uma referência de qualquer maneira), e um decodificador de hardware provavelmente consumiria um pouco menos suco do que decodificação de software. Totalmente não vale a pena pelo custo de segurança, mas possivelmente interessante.
BJ Black
11
Hã. Arrumado. Basta olhar no pqru.qr.ai e parece que o driver ALSA realmente usa o VHCIQ (não é necessário conversar com / dev / vhciq porque ele pode chamar a API do kernel diretamente, mas ainda assim ...).
BJ Black
2
Certo. Basicamente, o que está acontecendo aqui é que o chip Broadcom é dividido em duas partes principais - a CPU (que é o que o Linux fala e executa software de uso geral) e a GPU (que executa um firmware independente e gerencia vídeos etc.). VCHIQ é a interface que a CPU usa para conversar com a GPU. Isso é uma simplificação, mas provavelmente bom o suficiente por enquanto.
BJ Black
0

No meu caso, tive o mesmo problema quando criei um novo usuário, além do usuário padrão, e tive problemas não apenas com o som, mas também com a configuração do wifi, acesso à porta serial etc ... Então abri o / etc / arquivo de grupo. E adicionei meu usuário a todos os grupos em que o usuário 'pi' foi inserido e tudo funcionou perfeitamente. Do seguinte modo:

raiz: x: 0:
daemon: x: 1:
bin: x: 2:
sys: x: 3:
adm: x: 4: pi, carlos 
tty: x: 5: pi, carlos
disco: x: 6:
lp: x: 7:
e-mail: x: 8:
notícias: x: 9:
uucp: x: 10:
homem: x: 12:
proxy: x: 13:
kmem: x: 15:
discagem: x: 20: pi, carlos
fax: x: 21:
voz: x: 22:
cdrom: x: 24: pi, carlos
disquete: x: 25:
fita: x: 26:
sudo: x: 27: pi, carlos 
áudio: x: 29: pi, carlos , imprensa
mergulho: x: 30:
www-data: x: 33:
backup: x: 34:
operador: x: 37:
lista: x: 38:
irc: x: 39:
src: x: 40:
gnats: x: 41:
sombra: x: 42:
utmp: x: 43:
vídeo: x: 44: pi, carlos
sasl: x: 45:
plugdev: x: 46: pi, carlos
equipe: x: 50:
jogos: x: 60: pi, carlos 
usuários: x: 100: pi, carlos
nogroup: x: 65534:
entrada: 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:
bluetooth: x: 111:
avahi: x: 112:Carlos 
Spi 
: x: 999: pi, carlos 
i2c: x: 998: pi, carlos gpio: x: 997: pi, Carlos
luz: x: 113:
epmd: x: 114:
certificado SSL: x: 115:
Carlos: x: 1001:
rtkit: x: 116:
pressione: x: 117:
acesso por pulso: x: 118:
 

Marcos Cruz
fonte