Registro de preguntas de la entrevista de desarrollo de controladores de Android

Este artículo registra algunas preguntas relacionadas con la técnica que hizo el entrevistador cuando entrevisté al ingeniero de desarrollo de controladores de Android (solo como referencia).


1. Poda del sistema: ¿el método específico? ¿Cómo juzgar si es necesario o reservado durante el proceso de corte?
  1. Eliminar apks innecesarios
    Hay muchos apks que básicamente no se utilizan en el sistema, que probablemente ocupan más de 100 MB de espacio en la partición del sistema.Después de la eliminación, el tiempo de arranque se puede acortar de manera efectiva.

  2. Elimine los controladores innecesarios.
    Hay interruptores de controlador en el archivo .config, y los innecesarios se pueden desactivar directamente (make menuconfig)

  3. Capa de marco
    Eliminar algunos idiomas (languages_full.mk), eliminar archivos inútiles (en el archivo mk)

  4. Elimine servicios inútiles
    Elimine scripts y servicios inútiles (servicios 4G...), elimine información de impresión inútil (no genere impresiones del cargador de arranque y uboot, y reduzca el nivel de impresión del kernel a 1)


2. ¿Cuál es el proceso general al depurar periféricos? (como la pantalla LCD)
  1. Obtener especificaciones de pantalla (determinar qué tipo de pantalla <single/dual lvds, edp, mipi...> para depurar);
  2. Configure los parámetros en el archivo dts correspondiente (kernel/arch/arm/boot/dts);
  3. Determine los parámetros de acuerdo con la especificación de la pantalla:

1> voltaje de retroiluminación, voltaje de alimentación de la pantalla;
2> frecuencia de reloj: frecuencia de reloj LCD, la unidad es Hz;
3> Hactive: píxeles efectivos horizontales, Vactive: píxeles efectivos verticales
4> hback-porch/hfront-porch/hsync-len : señal de sincronización horizontal, vback-porch/vfront-porch/vsync-len: señal de sincronización vertical

  1. Configure el estado gpio correspondiente al diagrama esquemático del hardware (suba o baje según la definición del hardware):

Pin de control de retroiluminación (activar), pin de activación de pantalla (activar), pin de reinicio (restablecer)

  1. Métodos de depuración y solución de problemas:

cat d/dri/0/summary
para ver el estado de apertura de vop y la interfaz de pantalla
cat /sys/kernel/debug/gpio
para ver el estado de gpio y confirmar si la configuración de gpio es normal

Nota: encienda la luz de fondo pwm primero y luego habilite la salida lvds, lo que dará como resultado una pantalla blanca (retraso de activación de la luz de fondo pwm > retardo de activación de pantalla lvds ( 先使能lvds后使能背光).


3. ¿El proceso general de conducción?

El proceso general del controlador es el siguiente:

  1. Inicialización : realice algunas operaciones de inicialización necesarias, como establecer modos de pin, inicializar dispositivos, etc.
  2. Parámetros de configuración : de acuerdo con los requisitos de hardware o los requisitos del usuario, configure los parámetros correspondientes, como el ciclo PWM, el ciclo de trabajo, la polaridad, etc.
  3. Habilitar dispositivo : Encienda el dispositivo o módulo correspondiente, como habilitar la transmisión SPI o habilitar el bus I2C.
  4. Dispositivo de operación : realizar operaciones específicas, como enviar instrucciones o datos al dispositivo, recibir datos devueltos por el dispositivo, etc.
  5. Cierre el dispositivo : cuando se complete la operación, cierre el dispositivo o módulo, libere los recursos relacionados y haga un buen trabajo después.

inserte la descripción de la imagen aquí

4. ¿Interrumpir? Flujo de procesamiento de interrupción de Linux? ¿Qué sucede cuando llega una interrupción? ¿Sincronizar? ¿Para qué sirve la sincronización?

Interrupción:
cuando la CPU está ejecutando una instrucción, recibe una señal de interrupción y se vuelve para ejecutar el código preestablecido, y luego regresa al flujo de instrucciones original para continuar ejecutando una vez que se completa la ejecución. en 硬件中断和软件中断.

flujo de interrupción

  1. Después de que la CPU recibe la señal de interrupción, guardará los datos de registro, como ESP y CS, que pueden restaurar el flujo de estado de ejecución actual en la pila del kernel.
    Básicamente, se adopta la forma de diseño de doble pila.La CPU juzgará el estado actual, primero cambiará la pila del usuario a la pila del kernel y luego guardará los datos.

  2. Obtenga el número de vector de interrupción.
    Cada señal de interrupción tiene un número de vector de interrupción, que es un número entero. Cuando la CPU recibe una señal de interrupción, consultará la tabla de vectores de interrupción de acuerdo con el número de vector de interrupción de la señal y luego llamará a la función de procesamiento correspondiente de la tabla de vectores.
    Correspondencia entre los números de vector de interrupción y las señales de interrupción: para las excepciones de CPU, los números de vector están especificados por el estándar de arquitectura de CPU. Para los periféricos, el controlador del dispositivo aplica dinámicamente su número de vector. Para la interrupción IPI y la interrupción de instrucción, el kernel especifica el número de vector.

  3. Encuentre el descriptor de puerta correspondiente de la tabla de vectores de interrupción de acuerdo con el número de vector de interrupción y, después de realizar una verificación de seguridad en el descriptor, la CPU comienza a ejecutar la función de procesamiento de interrupción (es decir, el desplazamiento del segmento en el descriptor de puerta). La instrucción IRET se ejecuta al final de la función de procesamiento de interrupción, y esta instrucción volverá a la instrucción original para continuar la ejecución de acuerdo con los datos previamente almacenados en la pila.

Sincronización:
después de que el sistema operativo introduce el concepto de proceso y el proceso se convierte en una entidad de programación, 系统就具备了并发运行多个进程的能力,但也导致了系统中各个进程之间的资源竞争和共享. Además, debido a la introducción de interrupciones, mecanismos de excepción y preferencia del modo kernel, estas rutas (procesos) de ejecución del kernel se ejecutan de manera intercalada.
Para las rutas del kernel donde se ejecutan estas rutas intercaladas, no se toman las medidas de sincronización necesarias. Habrá acceso intercalado y cambios a algunas estructuras de datos importantes. Esto conduce a inconsistencias en el estado de estas estructuras de datos, lo que a su vez provoca fallas en el sistema.
Para garantizar el funcionamiento eficiente, estable y ordenado del sistema, Linux debe adoptar un mecanismo de sincronización.

  1. Operación atómica
    La operación atómica protege principalmente una variable compartida en el kernel para evitar que se acceda a la variable simultáneamente y provoque que los datos no estén sincronizados.

  2. Semáforo
    Los semáforos generalmente implementan operaciones de exclusión mutua, pero puede especificar el número de procesos en la sección crítica.Cuando el número especificado es 1, significa que se trata de un semáforo de exclusión mutua.

  3. Spin lock
    Protección para estructuras de datos o variables
    Protección para código de sección crítica

    La variable global V representa el bloqueo; cuando V=1, está en estado bloqueado, y cuando V=0, está en estado desbloqueado; el mecanismo de bloqueo giratorio solo acepta que la única
    ruta de ejecución contiene el bloqueo giratorio. Supongamos que el código en el procesador A quiere ingresar a una sección crítica. Simplemente lea el valor de V primero. Suponiendo que V!=0 indica que está en un estado bloqueado, lo que indica que los códigos de otros procesadores están accediendo a datos compartidos, entonces el procesador A entra en un estado de espera ocupado (girando). Suponga V=0. Indica que ningún código en otros procesadores ingresa actualmente a la sección crítica y el procesador A puede acceder al recurso crítico en este momento.

    .
    .
    .


5. Modelo de controlador general de Linux

El modelo de controlador de dispositivo de Linux incluye dispositivo, bus, clase y controlador, que están interrelacionados.

Bus bus:
inserte la descripción de la imagen aquí
Dispositivo:
Cada dispositivo se describe mediante una estructura de dispositivo. La estructura del dispositivo contiene información general sobre el dispositivo.

Cuando se encuentra un nuevo dispositivo, es necesario definir una nueva estructura de dispositivo y el dispositivo es miembro de la nueva estructura. De esta forma, alguna información del nuevo dispositivo puede definirse en la nueva estructura, y la información general del dispositivo está representada por la estructura del dispositivo.

conducir:

  1. Struct device_driver es la abstracción del controlador en el marco del controlador del kernel

  2. Elemento clave 1: el nombre, el nombre del controlador, a menudo se usa como base para hacer coincidir el controlador y el dispositivo

  3. Elemento clave 2: sonda, la función de detección del controlador, utilizada para detectar si un dispositivo puede ser administrado por el controlador

amable:

  1. Estructuras relacionadas: struct class y struct class_device

  2. El uso de udev es inseparable de la clase.

  3. El significado real de clase es servir como un contenedor multidispositivo de una clase con el mismo atributo.
    Propósito: para clasificar y administrar varios dispositivos, la clase también coloca algunas "etiquetas" en cada clase mientras clasifica, que también es la infraestructura proporcionada por el modelo de controlador de dispositivo para que escribamos controladores.

Supongo que te gusta

Origin blog.csdn.net/weixin_45639314/article/details/131330353
Recomendado
Clasificación