Me sorprende que el todopoderoso Google no tenga una respuesta lista para la pregunta "¿qué es VCHIQ?" Soy un experto en kernel desde hace mucho tiempo y no soy un empleado de Broadcom, ni soy experto en BCM283 *, pero esto es lo que he encontrado para (tal vez) la posteridad:
Desde la rama del núcleo Raspberry Pi :
Interfaz de comunicación Kernel a VideoCore para la familia de productos BCM2708.
Lo que vale la pena señalar aquí es que VideoCore es (sorpresa sorpresa) el controlador de video para el SoC que ejecuta Pi, y parece que esta es una forma práctica de ejecutar IOCTL más o menos directos en varios subsistemas conectados a la GPU . Que esto incluya video no es una gran sorpresa, pero supongo que tiene sentido que la interfaz de la cámara tenga su silicio dentro de VideoCore dado todo el codec que necesita hacer el video.
Entonces, ¿por qué el control de audio también se ejecuta a través de VideoCore (de lo contrario no necesitaría VCHIQ para controlarlo)? Sospecho que, dado el hecho de que VC tiene soporte de hardware para H.264 y otros códecs (y porque puede enrutar audio a través de HDMI), fue el lugar más fácil para colocar el silicio. Bueno, eso y el hecho de que el chip BCM tiene dos MMUs (uno para el VC + ARM, otro para el sistema operativo normal de servicio- ver diagrama en la página 5 ), lo que hace copia cero DMA sea posible (sin necesidad de copiar cosas a la silicio de audio: solo dígale que una parte de la memoria le pertenece a él y no a la CPU. Todavía no sé si realmente lo hacen bajo las cubiertas, pero ¿por qué no lo haría?).
Tenga en cuenta que los IOCTL en VCHIQ realmente no transfieren datos per se: configuran DMA y otras operaciones entre fragmentos de memoria y envían comandos a varios bits. Esto puede ser súper peligroso, ya que potencialmente podría atornillar las estructuras internas de datos del kernel desde el espacio de usuario, bloquear la GPU, colgar datos corruptos, etc. ¡¡Así que no configure / dev / vhciq en modo 777 !!!
En cualquier caso, la respuesta corta a "¿qué es VCHIQ?" Aquí está:
VCHIQ es una interfaz de comando entre el núcleo Linux en ejecución y los periféricos (entre otras cosas) en el silicio VideoCore. / dev / vhciq proporciona acceso genérico de espacio de usuario a esos comandos para que también lo utilicen (como mínimo) la cámara y los subsistemas de audio. Es una interfaz decentemente peligrosa para exponer a programas aleatorios, de ahí los permisos algo restrictivos por defecto.
Hay personas que están a la altura de sus ojos en el hardware BCM en la comunidad RPi; No soy uno de ellos (tal vez estoy hasta los tobillos después de un par de horas de investigación :-)). Dicho esto, creo que esta es una descripción general de alto nivel decente y agradecería adiciones / correcciones.
En cuanto a por qué www-data requiere permiso, eso sería porque su programa CGI está generando procesos secundarios como ese usuario. No conozco bien a ese jugador en particular, pero una mejor práctica generalmente sería ejecutar algún demonio especial para controlar el programa que está interactuando con el sonido y controlándolo desde CGI usando un socket UNIX o una interfaz similar en lugar de engendrar directamente a un niño.
De hecho, un proveedor de seguridad fue arrestado hace un tiempo por permitir el acceso raíz de su servidor web a su máquina. Probablemente hicieron esto para facilitar la gestión de procesos en lugar de escribir este tipo de capa intermedia, pero es un no-no de seguridad. Darle a Apache acceso básicamente ilimitado a GPU DMA es una idea igualmente mala (aunque mucho más difícil de explotar, lo admito).
Esperemos que esto responda tu pregunta.
/dev/vhciq
ejecutar audio en general, en este caso es porque el OP lo está utilizandoomxplayer
para hacerlo, lo que probablemente no sea lo ideal.En mi caso tuve el mismo problema cuando creé un nuevo usuario además del usuario predeterminado, y tuve problemas no solo con el sonido sino también con la configuración del wifi, el acceso al puerto serie, etc. Luego abrí el / etc / grupo de archivos. Y agregué mi usuario a todos los grupos donde se insertó el usuario 'pi', y todo funcionó perfectamente. Como sigue:
fuente