Qu'est-ce que / dev / vchiq dans Raspberry Pi?

10

J'utilise Raspberry Pi 3 et raspbian jessie et j'ai rencontré / dev / vchiq en essayant d'appeler programme (omxplayer) avec perg-cgi qui jouerait de la musique sur mon RiPi. Et je ne pouvais pas le faire fonctionner.

Quand je l'ai ouvert avec mon navigateur (par exemple localhost / muzikica / pusti.pl) [apache2], il a dit " échec de l'ouverture de l'instance vchiq ". J'ai donc changé les autorisations du fichier / dev / vchiq en xx7 et cela a fonctionné jusqu'à ce que je ne redémarre pas mon RiPi. J'ai donc compris et ajouté www-data (utilisateur qui exécute mon programme que mon script pusti.pl appellerait) au groupe vidéo, car / dev / vchiq fait partie du groupe vidéo. Et ça a marché!

Maintenant, qu'est-ce que / dev / vchiq xD et pourquoi www-data a besoin au moins des autorisations de lecture et d'écriture pour jouer du son sur mon Raspberry Pi?

Merci d'avance.

Бојан Драшко
la source

Réponses:

12

Je suis étonné que le tout-puissant Google n'ait pas de réponse toute prête à la question "qu'est-ce que VCHIQ?" Je suis un geek du noyau de longue date et je ne suis pas un employé de Broadcom, et je ne suis pas non plus un expert du BCM283 *, mais voici ce que j'ai trouvé pour (peut-être) la postérité:

Depuis la branche du noyau Raspberry Pi :

Interface de communication noyau à VideoCore pour la famille de produits BCM2708.

Il convient de noter ici que le VideoCore est (surprise surprise) le contrôleur vidéo du SoC que le Pi exécute, et il semblerait que ce soit un moyen pratique d'exécuter des IOCTL plus ou moins directs vers divers sous-systèmes connectés au GPU . Que cela inclut la vidéo n'est pas une grande surprise, mais je suppose qu'il est logique que l'interface de la caméra ait son silicium dans VideoCore compte tenu de tout ce que la vidéo doit faire.

Alors pourquoi le contrôle audio est-il également exécuté via le VideoCore (sinon il n'aurait pas besoin de VCHIQ pour le contrôler)? Je soupçonne que, étant donné que VC prend en charge le matériel pour H.264 et d'autres codecs (et parce que vous pouvez acheminer l'audio via HDMI), c'était juste l'endroit le plus simple pour mettre le silicium. Eh bien, cela et le fait que la puce BCM possède deux MMU (une pour le VC + ARM, une autre pour une utilisation normale du système d'exploitation - voir le diagramme à la page 5 ), ce qui rend possible le DMA sans copie (pas besoin de copier les choses sur le silicium audio - dites-lui simplement qu'un morceau de mémoire lui appartient et non le CPU. Vous ne savez pas encore s'ils le font réellement sous les couvertures, mais pourquoi pas?).

Notez que les IOCTL sur VCHIQ ne transfèrent pas vraiment les données en soi - ils configurent DMA et d'autres opérations entre des morceaux de mémoire et envoient des commandes à divers bits. Cela peut être super dangereux, car vous pourriez potentiellement visser avec les structures de données du noyau interne de l'espace utilisateur, planter le GPU, écarter les données corrompues, etc. Donc, ne définissez pas / dev / vhciq en mode 777 !!!

En tout cas, la réponse courte à "qu'est-ce que VCHIQ?" C'est ici:

VCHIQ est une interface de commande entre le noyau Linux en cours d'exécution et les périphériques (entre autres) dans le silicium VideoCore. / dev / vhciq fournit un accès générique à l'espace utilisateur à ces commandes pour une utilisation (au minimum) par la caméra et les sous-systèmes audio également. C'est une interface décemment dangereuse à exposer à des programmes aléatoires, d'où les autorisations quelque peu restrictives par défaut.

Il y a des gens qui sont à la hauteur de leurs yeux dans le matériel BCM de la communauté RPi; Je ne suis pas l'un d'eux (je suis peut-être jusqu'aux chevilles après quelques heures de recherche :-)). Cela dit, je pense que c'est une vue d'ensemble de haut niveau décente et apprécierait les ajouts / corrections.

En ce qui concerne les raisons pour lesquelles www-data nécessite une autorisation, cela serait dû au fait que votre programme CGI génère des processus enfants en tant qu'utilisateur. Je ne connais pas bien ce joueur en particulier, mais la meilleure pratique serait généralement d'exécuter un démon spécialisé pour contrôler le programme qui s'interface avec le son et le contrôler à partir de CGI en utilisant un socket UNIX ou une interface similaire plutôt que de générer directement un enfant.

En effet, un fournisseur de sécurité a été arrêté il y a quelque temps pour avoir autorisé son serveur racine à accéder à sa machine. Ils ont probablement fait cela pour faciliter la gestion des processus plutôt que d'écrire ce type de couche intermédiaire, mais c'est un non-non de sécurité. Donner à Apache un accès fondamentalement libre au GPU DMA est une mauvaise idée (bien que plus difficile à exploiter, je l'admets).

En esperant que cela répond à votre question.

BJ Black
la source
1
"Alors pourquoi le contrôle audio est-il également exécuté via le VideoCore (sinon il n'aurait pas besoin de VCHIQ pour le contrôler)?" -> Notez que vous ne devriez pas avoir besoin d'accéder à /dev/vhciqpour exécuter l'audio en général - dans ce cas, c'est parce que l'OP l'utilise omxplayerpour le faire, ce qui n'est probablement pas idéal.
goldilocks
Hmm. Je m'attends à ce qu'il y ait un pilote ALSA qui crée les interfaces utilisateur appropriées. Je ne connais rien d'omxplayer autre qu'une recherche Google de 5 secondes et je me demande si cela fait quelque chose d'intéressant avec cet accès supplémentaire sur l'audio (comme utiliser un codec matériel) ou simplement ouvrir bêtement un appareil dont il n'a pas besoin. Fascinant, et j'imagine également que le pilote ALSA utilise VHCIQ sous les couvertures (directement dans kernelspace, natch). Des trucs sympas!
BJ Black
1
Je ne sais pas si c'est ce qui se passe réellement, mais la spéculation ... Le GPU a un décodage MPEG matériel et qui pourrait inclure l'audio MP3 (ne peut pas trouver de référence dans les deux cas), et un décodeur matériel consommerait probablement un peu moins jus que le logiciel décode. Totalement pas la peine pour le coût de la sécurité, mais peut-être intéressant.
BJ Black
1
Huh. Soigné. Il suffit de regarder pqru.qr.ai et il semble que le pilote ALSA utilise effectivement VHCIQ sous les couvertures (pas besoin de parler à / dev / vhciq car il peut appeler directement l'API du noyau, mais quand même ...).
BJ Black
2
Sûr. Fondamentalement, ce qui se passe ici, c'est que la puce Broadcom est divisée en deux parties principales - le processeur (qui est ce à quoi Linux parle et exécute des logiciels à usage général) et le GPU (qui exécute un micrologiciel indépendant et gère la vidéo, etc.). VCHIQ est l'interface que le CPU utilise pour parler au GPU. Il s'agit d'une simplification, mais probablement assez bonne pour l'instant.
BJ Black
0

Dans mon cas, j'ai eu le même problème lorsque j'ai créé un nouvel utilisateur en plus de l'utilisateur par défaut, et j'ai eu des problèmes non seulement avec le son mais aussi la configuration du wifi, l'accès au port série etc ... Ensuite j'ai ouvert le / etc / fichier de groupe. Et j'ai ajouté mon utilisateur à tous les groupes où l'utilisateur 'pi' a été inséré, et tout fonctionnait parfaitement. Comme suit:

racine: x: 0:
démon: x: 1:
bac: x: 2:
sys: x: 3:
adm: x: 4: pi, carlos 
tty: x: 5: pi, carlos
disque: x: 6:
lp: x: 7:
courrier: x: 8:
nouvelles: x: 9:
uucp: x: 10:
homme: x: 12:
proxy: x: 13:
kmem: x: 15:
composition: x: 20: pi, carlos
fax: x: 21:
voix: x: 22:
cdrom: x: 24: pi, carlos
disquette: x: 25:
bande: x: 26:
sudo: x: 27: pi, carlos 
audio: x: 29: pi, carlos , appuyez sur
immersion: x: 30:
www-data: x: 33:
sauvegarde: x: 34:
opérateur: x: 37:
liste: x: 38:
irc: x: 39:
src: x: 40:
moucherons: x: 41:
ombre: x: 42:
utmp: x: 43:
vidéo: x: 44: pi, carlos
sasl: x: 45:
plugdev: x: 46: pi, carlos
personnel: x: 50:
jeux: x: 60: pi, carlos 
utilisateurs: x: 100: pi, carlos
nogroupe: x: 65534:
entrée: x: 101: pi, carlos
journal systemd: x: 102:
systemd-timesync: x: 103:
systemd-network: x: 104:
systemd-resolution: x: 105:
proxy-bus-systemd: 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:
presse: x: 117:
accès par impulsions: x: 118:
 

Marcos Cruz
la source