Co to jest / dev / vchiq w Raspberry Pi?

10

Używam Raspberry Pi 3 i raspbian jessie i natknąłem się na / dev / vchiq , próbując wywołać program (omxplayer) z perg-cgi, który odtwarzałby muzykę na moim RiPi. I nie mogę go uruchomić.

Kiedy otworzyłem go za pomocą mojej przeglądarki (np. Localhost / muzikica / pusti.pl) [apache2], powiedział „ nie udało się otworzyć instancji vchiq ”. Więc zmieniłem uprawnienia pliku / dev / vchiq na xx7 i działało to dopóki nie zrestartowałem mojego RiPi. Więc to rozgryzłem i dodałem www-data (użytkownika, który wykonuje mój program, który wywołałby mój skrypt pusti.pl) do grupy wideo, ponieważ / dev / vchiq jest częścią grupy wideo. I zadziałało!

Czym do diabła jest / dev / vchiq xD i dlaczego www-data potrzebuje przynajmniej uprawnień do odczytu i zapisu, aby odtwarzać dźwięk na moim Raspberry Pi?

Z góry dziękuję.

Бојан Драшко
źródło

Odpowiedzi:

12

Dziwi mnie, że wszechmocny Google nie ma gotowej odpowiedzi na pytanie „czym jest VCHIQ?” Jestem wieloletnim maniakiem jądra i nie jestem pracownikiem Broadcom, ani też ekspertem BCM283 *, ale oto, co znalazłem dla (być może) potomności:

Z gałęzi jądra Raspberry Pi :

Interfejs komunikacyjny z jądra na VideoCore dla rodziny produktów BCM2708.

Warto tutaj zauważyć, że VideoCore jest (zaskakujące zaskoczenie) kontrolerem wideo dla SoC, w którym działa Pi, i wydaje się, że jest to przydatny sposób na uruchomienie mniej lub bardziej bezpośrednich IOCTL-ów do różnych podsystemów podłączonych do GPU . To, że obejmuje to wideo, nie jest żadną niespodzianką, ale wydaje mi się, że ma sens, że interfejs kamery ma swój krzem w VideoCore, biorąc pod uwagę wszystkie kodeki, jakie musi zrobić wideo.

Dlaczego więc sterowanie dźwiękiem odbywa się również przez VideoCore (inaczej nie wymagałoby VCHIQ do sterowania)? Podejrzewam, że biorąc pod uwagę fakt, że VC obsługuje sprzętowo H.264 i inne kodeki (a ponieważ można przesyłać dźwięk przez HDMI), było to najłatwiejsze miejsce na umieszczenie krzemu. Cóż, to i fakt, że chip BCM ma dwa MMU (jeden do VC + ARM, drugi do normalnego użytkowania systemu operacyjnego - patrz schemat na str. 5 ), co umożliwia kopiowanie DMA bez kopiowania (nie trzeba kopiować rzeczy do audio silicon - po prostu powiedz, że do niego należy część pamięci, a nie procesor. Nie wiem jeszcze, czy faktycznie robią to pod przykryciem, ale dlaczego byś tego nie zrobił?).

Zauważ, że IOCTL na VCHIQ tak naprawdę nie przesyłają danych per se - konfigurują DMA i inne operacje między porcjami pamięci i wysyłają polecenia do różnych bitów. Może to być bardzo niebezpieczne, ponieważ możesz potencjalnie wkręcić wewnętrzne struktury danych jądra z przestrzeni użytkownika, zawiesić procesor graficzny, zawiesić uszkodzone dane itp. Więc nie ustawiaj / dev / vhciq na tryb 777 !!!

W każdym razie krótka odpowiedź na „czym jest VCHIQ?” Oto on:

VCHIQ to interfejs poleceń między uruchomionym jądrem Linuksa a urządzeniami peryferyjnymi (między innymi) w krzemie VideoCore. / dev / vhciq zapewnia ogólny dostęp użytkownika do tych komend, których mogą używać (przynajmniej) podsystemy kamery i audio. Jest to dość niebezpieczny interfejs, który może być narażony na przypadkowe programy, stąd domyślnie dość restrykcyjne uprawnienia.

W społeczności RPi są ludzie, którzy mają oko na oku w sprzęcie BCM; Nie jestem jednym z nich (po kilku godzinach badań być może sięgam kostek :-)). To powiedziawszy, uważam, że jest to przyzwoity przegląd na wysokim szczeblu i chętnie przyjmie uzupełnienia / poprawki.

O ile dane www wymagają pozwolenia, dzieje się tak dlatego, że Twój program CGI odradza procesy potomne jako ten użytkownik. Nie znam dobrze tego konkretnego odtwarzacza, ale lepszą praktyką byłoby zwykle uruchomienie jakiegoś specjalnego demona, aby sterować programem, który łączy się z dźwiękiem i sterować nim za pomocą CGI za pomocą gniazda UNIX lub podobnego interfejsu, zamiast bezpośredniego tworzenia dziecka.

Rzeczywiście, sprzedawca zabezpieczeń został zatrzymany jakiś czas temu za umożliwienie dostępu do katalogu głównego swojego serwera internetowego. Prawdopodobnie zrobili to, aby ułatwić zarządzanie procesami, a nie pisać tego rodzaju warstwę środkową, ale jest to zabezpieczenie nie-nie. Dawanie apacheowi w zasadzie nieskrępowanego dostępu do GPU DMA jest równie złym pomysłem (choć przyznaję, że trudniej go wykorzystać).

Mam nadzieję, że to odpowiada na twoje pytanie.

BJ Black
źródło
1
„Więc dlaczego sterowanie dźwiękiem odbywa się również przez VideoCore (inaczej nie wymagałoby VCHIQ do sterowania)?” -> Pamiętaj, że nie powinieneś potrzebować dostępu do /dev/vhciqgenerowania dźwięku - w tym przypadku dzieje się tak, ponieważ OP używa omxplayergo do tego, co prawdopodobnie nie jest idealne.
złotowłosy
Hmm Oczekuję, że istnieje sterownik ALSA, który tworzy odpowiednie interfejsy lądowe użytkownika. Nic nie wiem o omxplayerze poza 5-sekundowym wyszukiwaniem w Google i zastanawiam się, czy robi coś interesującego z tym dodatkowym dostępem do dźwięku (np. Za pomocą kodeka sprzętowego), czy po prostu głupio otwiera urządzenie, którego nie potrzebuje. Fascynujące, a także wyobrażam sobie, że sterownik ALSA używa VHCIQ pod osłonami (bezpośrednio w przestrzeni jądra, natch). Schludne rzeczy!
BJ Black,
1
Nie mam pojęcia, czy tak się właściwie dzieje, ale spekulacje ... GPU ma sprzętowe dekodowanie MPEG, które może zawierać audio MP3 (nie można znaleźć referencji w żaden sposób), a dekoder sprzętowy prawdopodobnie zużyłby nieco mniej sok niż dekodowanie oprogramowania. Całkowicie nie warto ze względu na koszty bezpieczeństwa, ale być może interesujące.
BJ Black
1
Huh Schludny. Przeglądając pqru.qr.ai i wygląda na to, że sterownik ALSA faktycznie używa VHCIQ pod przykryciem (nie trzeba rozmawiać z / dev / vhciq, ponieważ może bezpośrednio wywoływać API jądra, ale nadal ...).
BJ Black
2
Pewnie. Zasadniczo dzieje się tutaj to, że chip Broadcom jest podzielony na dwie główne części - procesor (z którym Linux rozmawia i uruchamia oprogramowanie ogólnego przeznaczenia) oraz procesor graficzny (który obsługuje niezależne oprogramowanie wewnętrzne i obsługuje wideo itp.). VCHIQ to interfejs używany przez procesor do komunikowania się z GPU. Jest to uproszczenie, ale na razie wystarczające.
BJ Black
0

W moim przypadku miałem ten sam problem, gdy utworzyłem nowego użytkownika oprócz domyślnego użytkownika, i miałem problemy nie tylko z dźwiękiem, ale także z konfiguracją Wi-Fi, dostępem do portu szeregowego itp. Następnie otworzyłem / etc / plik grupy. Dodałem mojego użytkownika do wszystkich grup, do których wstawiono użytkownika „pi” i wszystko działało idealnie. Następująco:

root: x: 0:
daemon: x: 1:
bin: x: 2:
sys: x: 3:
adm: x: 4: pi, carlos 
tty: x: 5: pi, carlos
dysk: x: 6:
lp: x: 7:
mail: x: 8:
aktualności: x: 9:
uucp: x: 10:
mężczyzna: x: 12:
proxy: x: 13:
kmem: x: 15:
dialout: x: 20: pi, carlos
faks: x: 21:
głos: x: 22:
cdrom: x: 24: pi, Carlos
dyskietka: x: 25:
taśma: x: 26:
sudo: x: 27: pi, carlos 
audio: x: 29: pi, carlos , naciśnij
dip: x: 30:
www-data: x: 33:
kopia zapasowa: x: 34:
operator: x: 37:
lista: x: 38:
irc: x: 39:
src: x: 40:
komary: x: 41:
shadow: x: 42:
utmp: x: 43:
wideo: x: 44: pi, Carlos
sasl: x: 45:
plugdev: x: 46: pi, Carlos
personel: x: 50:
gry: x: 60: pi, carlos 
użytkownicy: x: 100: pi, carlos
nogroup: x: 65534:
wejście: x: 101: pi, Carlos
systemd-journal: x: 102:
systemd-timesync: x: 103:
systemd-network: x: 104:
systemd-rozdzielczość: 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:
naciśnij: x: 117:
dostęp impulsowy: x: 118:
 

Marcos Cruz
źródło