Espacio de usuario y kernel integrado de Linux, contexto de proceso y contexto de interrupción

Prefacio

  • Cuando estaba aprendiendo el sistema Linux embebido antes, siempre me fascinaba el contexto de interrupción y el contexto del proceso , y estaba muy familiarizado con él. Sin embargo, siempre era difícil explicar los conceptos a la fuerza, así que corrí a resolverlos. A los efectos de este concepto, leí mucha información en Internet. El aprendizaje de estos conceptos es un proceso acumulativo.

Espacio de usuario y espacio del kernel

  • Sabemos que el sistema operativo actual utiliza memoria virtual , por lo que para un sistema operativo de 32 bits, su espacio de direccionamiento (espacio de almacenamiento virtual) es 4G (2 elevado a 32). El núcleo del sistema de preocupación es el kernel , que es independiente de las aplicaciones ordinarias y puede acceder al espacio de memoria protegido, así como a todos los permisos para acceder a los dispositivos de hardware subyacentes. Para garantizar que los procesos del usuario no puedan manipular directamente el kernel y garantizar la seguridad del kernel, el sistema de preocupación divide el espacio virtual en dos partes, una parte es el espacio del kernel y la otra es el espacio del usuario. Para el sistema operativo Linux , el byte más alto de 1G (de la dirección virtual 0xC0000000 a 0xFFFFFFFF) es usado por el kernel, que se llama espacio del kernel, y el byte 3G más bajo (de la dirección virtual 0x00000000 a 0xBFFFFFFF), Para cada proceso a utilizar, se denomina espacio de usuario. ** Cada proceso puede ingresar al kernel a través de llamadas al sistema, por lo tanto, el kernel de Linux es compartido por todos los procesos del sistema. Por lo tanto, desde la perspectiva de un proceso específico, cada proceso puede tener 4G bytes de espacio virtual . La asignación de espacio se muestra en la siguiente figura:
    Inserte la descripción de la imagen aquí

  • Con espacio de usuario y espacio de kernel, toda la estructura interna de Linux se puede dividir en tres partes , de abajo hacia arriba: hardware -> espacio de kernel -> espacio de usuario . Como se muestra abajo:
    Inserte la descripción de la imagen aquí

  • Cabe señalar que:
    (1) El código y los datos del núcleo se almacenan en el espacio del núcleo , y el código y los datos del programa de usuario se almacenan en el espacio de usuario del proceso. Ya sea en el espacio del kernel o en el espacio del usuario, todos están en el espacio virtual .
    (2) Linux utiliza un mecanismo de protección de dos niveles: el nivel 0 es para el kernel y el nivel 3 es para los programas de usuario .

Modo kernel y modo de usuario

(1) Cuando una tarea (proceso) ejecuta una llamada al sistema y se ejecuta en el código del kernel, se dice que el proceso está en el estado de ejecución del kernel (estado del kernel) . El procesador ahora se está ejecutando en el código del kernel con el nivel de privilegio más alto (nivel 0). Cuando el proceso está en modo kernel, el código del kernel ejecutado usará la pila del kernel del proceso actual. Cada proceso tiene su propia pila de kernel.

(2) Cuando el proceso está ejecutando el propio código del usuario, se dice que está en el estado de ejecución del usuario (estado de usuario) . El procesador ahora se está ejecutando en el código de usuario con el nivel de privilegio más bajo (nivel 3). Cuando el programa de usuario se está ejecutando y el programa de interrupción lo interrumpe repentinamente, también se puede hacer referencia simbólicamente al programa de usuario como si estuviera en el estado del núcleo del proceso. Porque el manejador de interrupciones usará la pila del kernel del proceso actual.

Contexto de proceso y contexto de interrupción

Contexto

  • El contexto se traduce del contexto en inglés . Se refiere a un medio ambiente . En relación con el proceso, es el entorno en el que se ejecuta el proceso; específicamente, son las diversas variables y datos, incluidas todas las variables de registro, archivos abiertos por el proceso, información de la memoria, etc.

átomo

  • Atom (átomo) originalmente significa "la partícula más pequeña que no se puede dividir más", mientras que operación atómica significa "una operación o una serie de operaciones que no se pueden interrumpir".

¿Y por qué existe tal concepto de contexto?

  • El espacio del kernel y el espacio del usuario son dos modos de trabajo de los sistemas operativos modernos: el módulo del kernel se ejecuta en el espacio del kernel y la aplicación del modo de usuario se ejecuta en el espacio del usuario . Representan diferentes niveles y tienen diferentes derechos de acceso a los recursos del sistema. El módulo del kernel se ejecuta en el nivel más alto (modo kernel), el sistema confía en todas las operaciones por debajo de este nivel y las aplicaciones se ejecutan en un nivel inferior (modo de usuario) . En este nivel, el procesador controla el acceso directo al hardware y el acceso no autorizado a la memoria. El modo kernel y el modo de usuario tienen su propia asignación de memoria, es decir, su propio espacio de direcciones.

  • El procesador siempre se encuentra en uno de los siguientes estados:
    (1) Modo kernel, ejecutándose en el contexto del proceso , el kernel representa el proceso que se ejecuta en el espacio del kernel; modo kernel, ejecutándose en el contexto de interrupción, el kernel representa el hardware que se ejecuta en el espacio del kernel;
    (2) Modo de usuario, que se ejecuta en el espacio de usuario .

  • Los dos estados operativos diferentes del sistema tienen el concepto de contexto. Si una aplicación en el espacio del usuario desea solicitar servicios del sistema, como operar un dispositivo físico y asignar la dirección del dispositivo al espacio del usuario, debe implementarse a través de llamadas al sistema . ( Las llamadas al sistema son funciones de interfaz proporcionadas por el sistema operativo al espacio de usuario ).

  • A través de la llamada al sistema, el programa de aplicación del espacio de usuario ingresará al espacio del kernel y el kernel se ejecutará en el espacio del kernel en nombre del proceso, lo que implica el cambio de contexto. El espacio del usuario y el espacio del kernel tienen diferentes asignaciones de direcciones, conjuntos de registros generales o especiales , Y el proceso del espacio de usuario debe pasar muchas variables y parámetros al kernel, y el kernel también debe guardar algunos registros, variables, etc. del proceso del usuario, de modo que pueda regresar al espacio del usuario para continuar la ejecución después de que finalice la llamada al sistema.

Contexto de proceso

El llamado contexto de proceso se refiere a los valores en todos los registros de la CPU, el estado del proceso y el contenido de la pila cuando se está ejecutando un proceso. Cuando el kernel necesita cambiar a otro proceso, necesita guardar todos los estados del proceso actual, es decir Guarde el contexto de proceso del proceso actual para que cuando el proceso se ejecute de nuevo, se pueda restaurar el estado en el momento de la conmutación y la ejecución pueda continuar.

  • El contexto de un proceso se puede dividir en tres partes: contexto a nivel de usuario, contexto de registro y contexto a nivel de sistema .
    Contexto de usuario : texto, datos, pila de usuario y área de memoria compartida;
    contexto de registro : registro general, registro de programa (IP), registro de estado del procesador (EFLAGS), puntero de pila (ESP);
    contexto a nivel de sistema : bloque de control de proceso task_struct, memoria Información de gestión (mm_struct, vm_area_struct, pgd, pte), pila del kernel.
    Cuando ocurre la programación del proceso, el cambio de proceso es un cambio de contexto (cambio de contexto).
  • El sistema operativo debe cambiar toda la información mencionada anteriormente antes de que se pueda ejecutar el proceso recién programado. La llamada al sistema es un cambio de modo (cambio de modo) . En comparación con la conmutación de procesos, la conmutación de modo es mucho más fácil y ahorra tiempo, porque la tarea principal de la conmutación de modo es cambiar el contexto de los registros de proceso.
  • El contexto del proceso es principalmente manejadores de excepciones y subprocesos del núcleo . La razón por la que el kernel ingresa al contexto del proceso es porque parte del trabajo del proceso en sí debe realizarse en el kernel. Por ejemplo, una llamada al sistema sirve al proceso actual y una excepción suele ser un estado de error causado por el proceso de procesamiento. Por tanto, tiene sentido referirse a lo actual en el contexto del proceso.

Interrumpir contexto

  • El hardware envía una señal de interrupción a la CPU a través de la señal de activación, lo que hace que el kernel llame al controlador de interrupciones y entre en el espacio del kernel. En este proceso, algunas variables y parámetros de hardware también se pasan al kernel, y el kernel realiza el procesamiento de interrupciones a través de estos parámetros.
    Por tanto, "contexto de interrupción" puede entenderse como los parámetros pasados ​​por el hardware y algunos entornos que el núcleo necesita salvar, principalmente el entorno del proceso interrumpido.
    El kernel ingresa al contexto de interrupción debido al procesamiento de interrupciones o interrupciones suaves causadas por la señal de interrupción. La ocurrencia de señales de interrupción es aleatoria y los manejadores de interrupciones y las interrupciones suaves no pueden predecir de antemano qué proceso se está ejecutando actualmente cuando ocurre la interrupción, por lo que es posible hacer referencia a la corriente en el contexto de la interrupción, pero no tiene sentido.
    De hecho, la señal de interrupción que el proceso A quiere esperar puede ocurrir durante la ejecución del proceso B. Por ejemplo, el proceso A inicia una operación de escritura en disco, el proceso B se ejecuta después de que el proceso A duerme, y el proceso B es interrumpido por una señal de interrupción del disco después de que se escribe el disco, y el proceso A se despierta durante el procesamiento de la interrupción.

Contexto de proceso vs contexto de interrupción

  • El núcleo puede estar en dos contextos: contexto de proceso y contexto de interrupción .
    Después de la llamada al sistema, la aplicación del usuario ingresa al espacio del kernel, y luego el espacio del kernel se ejecuta en el contexto del proceso para el representante del proceso correspondiente en el espacio del usuario .
  • Las interrupciones asincrónicas harán que se llame al manejador de interrupciones , y el manejador de interrupciones se ejecutará en el contexto de interrupciones .
    El contexto de interrupción y el contexto del proceso no pueden ocurrir al mismo tiempo. El código del kernel que se
    ejecuta en el contexto del proceso es prioritario , pero el contexto de interrupción se ejecutará hasta el final y no será reemplazado. Por lo tanto, el kernel restringe el trabajo del contexto de interrupción y no le permite realizar las siguientes operaciones :
  1. Ingrese al estado de suspensión o abandone activamente la CPU.
    Debido a que el contexto de interrupción no pertenece a ningún proceso, no tiene nada que ver con el actual (aunque actual apunta al proceso interrumpido en este momento), por lo que una vez que el contexto de interrupción duerme o abandona la CPU, no se puede despertar. Por eso también se le llama contexto atómico.
  2. Ocupar mutex
    Para proteger los recursos de la sección crítica del manejador de interrupciones, no se pueden usar mutex . Si no se puede obtener el semáforo, el código se suspenderá y ocurrirá la misma situación que la anterior.Si se debe usar un candado, se usa spinlock.
  3. Realización de tareas que requieren mucho tiempo El
    procesamiento de interrupciones debe ser lo más rápido posible, porque el kernel tiene que responder a una gran cantidad de servicios y solicitudes, y el contexto de interrupción tarda demasiado en consumir el tiempo de la CPU, lo que afectará seriamente las funciones del sistema. Cuando se realizan tareas que requieren mucho tiempo en una rutina de manejo de interrupciones, debe ser manejada por la mitad inferior de la rutina de manejo de interrupciones.
  4. Acceso a la memoria virtual del espacio de usuario
    Debido a que el contexto de interrupción no está relacionado con un proceso específico, es el kernel que se ejecuta en el espacio del kernel en nombre del hardware, por lo que no se puede acceder a la dirección virtual del espacio de usuario en el contexto de interrupción
  5. Las rutinas de manejo de interrupciones no deben configurarse como reentrantes (rutinas que se pueden llamar en paralelo o recursivamente)
    porque cuando ocurre una interrupción, tanto preempt como irq se desactivan hasta que regresa la interrupción. Por lo tanto, el contexto de la interrupción no es el mismo que el contexto del proceso, y no se permite que se ejecuten simultáneamente diferentes instancias de rutinas de procesamiento de interrupciones en SMP.
  6. La rutina de manejo de interrupciones puede ser interrumpida por IRQ de nivel superior.Si
    desea deshabilitar esta interrupción, el manejador de interrupciones se puede definir como las rutinas de procesamiento rápido, el equivalente a decirle a la CPU, la rutina se ejecuta, deshabilitar todas las interrupciones en la CPU local. solicitud. El resultado directo de esto es que el rendimiento del sistema se degrada porque otras interrupciones se retrasan en la respuesta.

Contexto atómico

Un principio básico del kernel es: en un contexto atómico o de interrupción, el kernel no puede acceder al espacio del usuario y el kernel no puede dormir . Es decir, en este caso, el kernel no puede llamar a ninguna función que pueda provocar el sueño. En términos generales, el contexto atómico se refiere a la interrupción o interrupción suave, y mientras se mantiene un bloqueo de giro . El kernel proporciona cuatro macros para determinar si se encuentra en estas situaciones:

  • El recuento al que acceden estas cuatro macros es thread_info-> preempt_count. Esta variable es en realidad una máscara de bits. Los 8 bits más bajos representan el recuento de preferencia, que generalmente es modificado por spin_lock / spin_unlock, o modificado a la fuerza por el programador, e indica que la profundidad máxima de preferencia permitida por el kernel es 256.
  • El bit 8-15 es el recuento de interrupciones suaves, que generalmente es modificado por local_bh_disable / local_bh_enable, e indica que la profundidad máxima de interrupciones suaves permitida por el kernel es 256.
  • El bit 16-27 es el recuento de interrupciones duras, que generalmente es modificado por enter_irq / exit_irq, e indica que la profundidad máxima de interrupciones duras permitida por el kernel es 4096.
  • El bit 28 es el indicador PREEMPT_ACTIVE. El código significa:
    PREEMPT_MASK: 0x000000ff
    SOFTIRQ_MASK: 0x0000ff00
    HARDIRQ_MASK: 0x0fff0000

Todos los lugares donde las 4 macros anteriores devuelven 1 son contextos atómicos, ** no permiten que el kernel acceda al espacio del usuario, no permiten que el kernel entre en suspensión o invoquen funciones que puedan causar la suspensión. ** Y significa que thread_info-> preempt_count no es 0, lo que le dice al kernel que la preferencia está deshabilitada.
Sin embargo, para in_atomic (), cuando la preferencia está habilitada, funciona muy bien. Puede decirle al kernel si actualmente tiene un spinlock, si debe deshabilitar la preferencia, etc. Sin embargo, cuando la preferencia no está habilitada, spin_lock no modifica preempt_count en absoluto, por lo que incluso si el kernel llama a spin_lock y mantiene el bloqueo de giro, in_atomic () todavía devuelve 0, lo que le dice incorrectamente al kernel que se encuentra actualmente en un contexto no atómico. Por lo tanto, cualquier código que se base en in_atomic () para determinar si está en el contexto atómico es problemático cuando la preferencia está prohibida.

Blog de referencia contenido: https://mp.weixin.qq.com/s?src=11×tamp=1563710917&ver=1742&signature=QR4lcgtbcKzOvDFLwoqFNplQTjSK7GewpVDBCvNpaXRozYEwcUOrFTqWKf5XsDAp00ySWlARSnQsnzDVXewoqWKf5XsDAp00ySWlARSnQsnzDV=1563710917

Supongo que te gusta

Origin blog.csdn.net/qq_41782149/article/details/96754633
Recomendado
Clasificación