Che cos'è / dev / vchiq in Raspberry Pi?


10

Sto usando Raspberry Pi 3 e raspbian jessie e mi sono imbattuto in / dev / vchiq provando a chiamare il programma (omxplayer) con perg-cgi che avrebbe riprodotto un po 'di musica sul mio RiPi. E non potrei farlo funzionare.

Quando l'ho aperto con il mio browser (ad esempio localhost / muzikica / pusti.pl) [apache2] diceva " impossibile aprire l'istanza vchiq ". Quindi ho cambiato i permessi del file / dev / vchiq in xx7 e ha funzionato fino a quando non ho riavviato il mio RiPi. Così ho capito e aggiunto www-data (utente che sta eseguendo il mio programma che il mio script pusti.pl chiamerebbe) al gruppo video, perché / dev / vchiq fa parte del gruppo video. E ha funzionato!

Ora, che diavolo è / dev / vchiq xD e perché i dati www necessitano almeno delle autorizzazioni di lettura e scrittura per riprodurre l'audio sul mio Raspberry Pi?

Grazie in anticipo.

Risposte:


12

Sono sorpreso che l'onnipotente Google non abbia una risposta pronta alla domanda "che cos'è VCHIQ?" Sono un fanatico del kernel da molto tempo e non un dipendente Broadcom, né sono un esperto BCM283 *, ma ecco cosa ho trovato per (forse) i posteri:

Dal ramo del kernel Raspberry Pi :

Interfaccia di comunicazione da Kernel a VideoCore per la famiglia di prodotti BCM2708.

Ciò che vale la pena notare qui è che VideoCore è (sorpresa sorpresa) il controller video per il SoC che esegue il Pi, e sembrerebbe che questo sia un modo pratico per eseguire IOCTL più o meno diretti verso vari sottosistemi collegati alla GPU . Che questo includa il video non è una grande sorpresa, ma immagino abbia senso che l'interfaccia della videocamera abbia il suo silicio all'interno di VideoCore, dato tutto il codec che il video deve fare.

Quindi perché il controllo audio viene eseguito anche attraverso VideoCore (altrimenti non sarebbe necessario VCHIQ per controllarlo)? Ho il sospetto che, dato che VC ha il supporto hardware per H.264 e altri codec (e poiché è possibile instradare l'audio tramite HDMI), era solo il posto più semplice per inserire il silicio. Bene, questo e il fatto che il chip BCM ha due MMU (uno per VC + ARM, un altro per il normale utilizzo del sistema operativo - vedi diagramma a pag.5 ), che rende possibile il DMA a zero-copia (non è necessario copiare cose sul silicio audio: basta dire che un pezzo di memoria appartiene a esso e non alla CPU. Non so se lo fanno effettivamente sotto le coperte, ma perché non dovresti?).

Si noti che gli IOCTL su VCHIQ non trasferiscono realmente i dati di per sé, ma impostano DMA e altre operazioni tra blocchi di memoria e inviano comandi a vari bit. Questo può essere super pericoloso, dal momento che potresti potenzialmente rovinare le strutture interne dei dati del kernel dallo spazio utente, bloccare la GPU, aggirare i dati corrotti, ecc. Quindi non impostare / dev / vhciq in modalità 777 !!!

In ogni caso, la risposta breve a "cos'è VCHIQ?" Ecco qui:

VCHIQ è un'interfaccia di comando tra il kernel Linux in esecuzione e le periferiche (tra le altre cose) nel silicio VideoCore. / dev / vhciq fornisce l'accesso generico allo spazio utente a quei comandi per l'uso (almeno) della telecamera e dei sottosistemi audio. È un'interfaccia abbastanza pericolosa da esporre a programmi casuali, quindi le autorizzazioni un po 'restrittive per impostazione predefinita.

Ci sono persone all'altezza dell'hardware BCM nella comunità RPi; Non sono uno di loro (forse sono profondo fino alle caviglie dopo un paio d'ore di ricerca :-)). Detto questo, penso che questa sia una panoramica di alto livello decente e gradirei aggiunte / correzioni.

Per quanto riguarda il motivo per cui www-data richiede l'autorizzazione, ciò sarebbe dovuto al fatto che il tuo programma CGI sta generando processi figlio come quell'utente. Non conosco bene quel particolare giocatore, ma di solito è meglio eseguire un demone specializzato per controllare il programma che si interfaccia al suono e controllarlo dal CGI usando un socket UNIX o un'interfaccia simile piuttosto che generare un bambino.

In effetti, un fornitore di sicurezza è stato arrestato qualche tempo fa per consentire al proprio server Web di accedere alla propria macchina. Probabilmente lo hanno fatto per facilitare la gestione dei processi piuttosto che scrivere questo tipo di livello intermedio, ma è un no-no di sicurezza. Dare a Apache un accesso praticamente illimitato al DMA della GPU è una cattiva idea (anche se lo ammetto molto più difficile da sfruttare).

Spero che questo risponda alla tua domanda.


1
"Allora perché il controllo audio viene eseguito anche attraverso VideoCore (altrimenti non sarebbe necessario VCHIQ per controllarlo)?" -> Nota che non dovresti avere bisogno dell'accesso per /dev/vhciqeseguire l'audio in generale - in questo caso è perché l'OP lo sta usando omxplayerper farlo, il che probabilmente non è l'ideale.
riccioli d'oro

Hmm. Mi aspetto che esista un driver ALSA che crei le interfacce di terra utente appropriate. Non so nulla di omxplayer diverso da una ricerca su Google di 5 secondi e mi chiedo se stia facendo qualcosa di interessante con quell'accesso extra sull'audio (come usare un codec hardware) o semplicemente aprendo stupidamente un dispositivo di cui non ha bisogno. Affascinante, e immagino anche che il driver ALSA utilizzi VHCIQ sotto le coperte (direttamente all'interno di kernelspace, natch). Roba ordinata!
BJ Black,

1
Non ho idea se questo è ciò che effettivamente accade, ma la speculazione ... La GPU ha la decodifica MPEG hardware e che potrebbe includere audio MP3 (non riesce a trovare un riferimento in entrambi i modi) e un decodificatore hardware consumerebbe probabilmente un po 'meno succo di decodifica software. Totalmente non ne vale la pena per il costo della sicurezza, ma forse interessante.
BJ Black,

1
Huh. Neat. Basta guardare pqru.qr.ai e sembra che il driver ALSA usi effettivamente VHCIQ sotto le copertine (non c'è bisogno di parlare con / dev / vhciq perché può chiamare direttamente l'API del kernel, ma comunque ...).
BJ Black,

2
Sicuro. Fondamentalmente quello che sta succedendo qui è che il chip Broadcom è suddiviso in due parti principali: la CPU (che è ciò con cui Linux parla e esegue software di uso generale) e la GPU (che esegue un firmware indipendente e gestisce video, ecc.). VCHIQ è l'interfaccia che la CPU utilizza per comunicare con la GPU. Questa è una semplificazione, ma probabilmente abbastanza buona per ora.
BJ Black,

0

Nel mio caso ho avuto lo stesso problema quando ho creato un nuovo utente oltre all'utente predefinito e ho avuto problemi non solo con il suono ma anche con la configurazione del wifi, l'accesso alla porta seriale ecc ... Poi ho aperto il / etc / group file. E ho aggiunto il mio utente a tutti i gruppi in cui è stato inserito l'utente "pi" e tutto ha funzionato perfettamente. Come segue:

root: x: 0:
demone: x: 1:
cestino: x: 2:
sys: x: 3:
adm: x: 4: pi, carlos 
tty: x: 5: pi, carlos
disco: x: 6:
lp: x: 7:
mail: x: 8:
notizie: x: 9:
uucp: x: 10:
uomo: x: 12:
proxy: x: 13:
kmem: x: 15:
dialout: x: 20: pi, carlos
fax: x: 21:
voce: x: 22:
cdrom: x: 24: pi, carlos
floppy: x: 25:
nastro: x: 26:
sudo: x: 27: pi, carlos 
audio: x: 29: pi, carlos , premi
tuffo: x: 30:
dati www: x: 33:
backup: x: 34:
operatore: x: 37:
elenco: x: 38:
irc: x: 39:
src: x: 40:
moscerini: x: 41:
ombra: x: 42:
utmp: x: 43:
video: x: 44: pi, carlos
sasl: x: 45:
plugdev: x: 46: pi, carlos
personale: x: 50:
giochi: x: 60: pi, carlos 
utenti: x: 100: pi, carlos
gruppo: x: 65534:
input: x: 101: pi, carlos
journal di sistema: x: 102:
systemd-timesync: x: 103:
systemd-network: x: 104:
systemd-resolver: 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:
spi: x: 999: pi, carlos 
i2c: x: 998: pi, carlos 
gpio: x: 997: pi, Carlos
lightdm: x: 113:
epmd: x: 114:
ssl-cert: x: 115:
Carlos: x: 1001:
rtkit: x: 116:
premere: x: 117:
accesso ad impulsi: x: 118:
 

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.