Más información sobre Carpeta
Binder es el mecanismo que implementa IPC (comunicación entre procesos) en el sistema Android. El significado original de Binder es "pegamento, adhesivo", por lo que se puede imaginar que su propósito es "pegar" dos procesos como pegamento para facilitar la implementación de IPC.
Entonces, ¿por qué existe la comunicación de procesos? Esto se debe a que los procesos en Linux están aislados, lo que significa que el proceso A no conoce la existencia del proceso B y el proceso B correspondiente no conoce la existencia del proceso A. La memoria del proceso A y el proceso B no se comparte, por lo que se requiere IPC para transferir los datos del proceso A al proceso B.
Aquí está el punto de conocimiento sobre el espacio del proceso: el espacio del proceso se puede dividir en espacio de usuario y espacio del kernel. En pocas palabras, el espacio del usuario es el espacio donde se ejecutan los programas del usuario y el espacio del kernel es el espacio donde se ejecuta el kernel. Debido a que los programas de usuario definitivamente no llamarán cosas cruciales y de bajo nivel como el kernel, es necesario proteger el kernel y crear un espacio para que el kernel pueda ejecutarse en el espacio del kernel para que no sea perturbado por espacio de usuario. El espacio de usuario no se comparte entre los dos procesos, pero el espacio del kernel sí.
Entonces, aquí algunos estudiantes tendrán una idea audaz: la comunicación entre dos procesos se puede lograr usando el espacio del kernel, porque su espacio del kernel es * * * * compartido, por lo que los datos no se pasarán. Pero otro problema que conlleva es que, para garantizar la seguridad, el espacio del usuario y el espacio del kernel también están aislados. Entonces, ¿cómo se mueven los datos del espacio de usuario del remitente al espacio del kernel?
Para resolver este problema, se proporcionan llamadas al sistema para permitir que los programas de usuario llamen a los recursos del kernel. Las llamadas al sistema son la única forma en que el espacio del usuario accede al espacio del kernel, lo que garantiza que todo el acceso a los recursos esté bajo el control del kernel, evita el acceso no autorizado a los recursos del sistema por parte de los programas del usuario y mejora la seguridad y estabilidad del sistema (este pasaje proviene de "Análisis de Principios de Binder para ingenieros de aplicaciones de Android"). Nuestras operaciones habituales de red y E/S en realidad se ejecutan en el espacio del kernel a través de llamadas al sistema (es decir, modo kernel).
En este punto, tenemos un plan de implementación general para IPC: los datos del proceso A se transfieren al espacio del kernel a través de una llamada al sistema (es decir, copy_from_user), y el espacio del kernel luego usa una llamada al sistema para transferir los datos al proceso B (es decir, copiar_al_usuario). Este es también el principio de implementación actual de la comunicación IPC tradicional en Linux. Se puede ver que habrá dos copias de datos.
(Imagen de "Análisis de principios de Binder para ingenieros de aplicaciones de Android")
Algunos modos de IPC en Linux:
De la explicación anterior, podemos saber que IPC Se requiere espacio en el kernel para soportarlo. Tanto las tuberías como los sockets en Linux están en el kernel. Pero no hay Binder en el sistema Linux. Entonces, ¿cómo utilizar Binder para implementar IPC en Android?
Se trata de módulos cargables del kernel dinámico en Linux. Los módulos cargables del kernel dinámico son programas con funciones independientes que se pueden compilar de forma independiente pero no se pueden ejecutar de forma independiente. Está vinculado al kernel en tiempo de ejecución y se ejecuta como parte del kernel. De esta manera, el sistema Android puede agregar dinámicamente un módulo del kernel para ejecutarlo en el espacio del kernel, y los procesos del usuario pueden comunicarse a través de este módulo del kernel como puente. (Este pasaje proviene del "Análisis de los principios de Binder para ingenieros de aplicaciones de Android") En Android, este módulo del kernel también es un controlador de Binder.
Además, en comparación con el IPC tradicional de Linux, el principio de IPC de Binder solo requiere una copia de datos para completarse. Entonces, ¿cómo lo hiciste?
En realidad, Binder se implementa mediante mmap (mapeo de memoria).
Mmap se utiliza para asignar archivos u otros objetos a la memoria, generalmente en un sistema de archivos con medios físicos. En resumen, mmap puede establecer una relación de mapeo entre el área de memoria del espacio del usuario y el área de memoria del espacio del kernel, reduciendo así la cantidad de copias de datos. Los cambios realizados por cualquiera de las partes en el área de memoria se reflejarán en el. otra parte.
Entonces, lo que hace Binder es crear un dispositivo virtual (el controlador del dispositivo es /dev/binder) y luego crear un búfer de recepción de datos en el espacio del kernel. Este búfer se conectará al búfer de memoria y. el proceso de recepción de datos se asigna al espacio de usuario, de modo que el proceso de envío de datos envía los datos al búfer de memoria, y los datos se asignan indirectamente al espacio de usuario del proceso de recepción, lo que reduce una copia de datos. Puede ver la imagen a continuación para obtener más detalles.
(Imagen de "Análisis de principios de Binder para ingenieros de aplicaciones de Android")
Ventajas de los adhesivos
En todo el proceso de comunicación de Binder, se puede dividir en cuatro Partes:
El cliente y el servidor se implementan en la capa de aplicación, y el controlador Binder y ServiceManager se implementan en la parte inferior del sistema Android.
El proceso específico es el siguiente:
(El diagrama esquemático del proceso de comunicación de Binder proviene del "Análisis de principios de Binder para ingenieros de aplicaciones de Android")