Cómo aprender el sistema operativo nuclear
1. Características del núcleo plus:
1. El núcleo adopta un diseño de micronúcleo, que es fácil de trasplantar y la información escrita es relativamente confiable, pero no creo Entonces, en comparación con Linux, tomando la plataforma ARM como ejemplo, NU solo adopta el modo SVC, y tanto el kernel como las tareas del usuario se ejecutan en el mismo estado, lo que significa que todas las tareas pueden acceder a cualquier recurso. Esto significa que todas las tareas pueden acceder a cualquier recurso. ¿Es esto confiable?
2. Sistema operativo en tiempo real. NU es un sistema operativo suave en tiempo real (VxWorks es un sistema operativo en tiempo real duro). El componente de control de subprocesos admite multitarea y preferencia de tareas, y define dos procesamientos de interrupciones. modos de servicio, LISR y HISR, que es similar al mecanismo de la primera y segunda mitad de Linux. La parte inferior en Linux se implementa mediante interrupciones suaves, mientras que HISR de NU solo aparece en forma de tareas y su prioridad siempre es mayor que la tarea.
3. NU se aplica en forma de biblioteca. Usted escribe sus propias tareas de aplicación para conectarse al kernel y componentes de NU personalizados. NU no tiene una CLI
2. Componentes
Componente 1.IN
El componente de inicialización consta de tres partes. Después del reinicio del hardware, primero ingresa INT_initialize(). Durante la inicialización a nivel de placa, primero configura el modo SVC. , desactiva las interrupciones y luego copia el kernel desde la rom. Vaya a ram, cree el segmento bss, cree la pila sys, la pila irq y la pila fiq en secuencia, finalmente inicialice el temporizador, cree el espacio de pila del temporizador HISR, mire el código de Plataforma 2410, el código de la plataforma 2410, un tick dura aproximadamente 15,8 ms, completo Después de la inicialización a nivel de placa, ingrese INC_initialize para inicializar cada componente, incluida la inicialización de la aplicación, la creación de tareas y HISR. Finalmente, el control se entrega al programador, que. depende principalmente de la disposición del espacio de direcciones en la RAM
|Timer HISR stack = 1024|
|FIQ stack= 512|
|IRQ stack= 1024 |
|Pila SVC= 1024|
| bss|
|.data|
|.text|
Entre ellos, el tamaño de la pila SVC está relacionado con el número de fuentes de interrupción. Se produce un irq anidado, irq_context se almacena en la pila SVC y la pila IRQ solo funciona como una pila temporal.
2. Componente de control de subprocesos
El componente TC es la parte más importante del kernel de NU, que incluye principalmente programación, interrupciones, operaciones relacionadas con tareas, bloqueos y relojes, que serán presentado a continuación.
Programación
Hay dos tipos de subprocesos (en el mismo espacio de direcciones) en NU, a saber, HISR y tareas. HISR puede entenderse como una tarea de mayor prioridad, pero no es una tarea. La forma de implementar HISR con una prioridad más alta que una tarea es ver primero si hay una tarea al ejecutar el cronograma. Las tareas tienen cuatro estados: pendiente, lista, completada y finalizada, mientras que HISR tiene solo dos estados: en ejecución e inactivo.
Cada tarea tiene un bloque de control de subprocesos TCB, que incluye la prioridad de la tarea, el estado, el intervalo de tiempo, la pila de tareas, la información de protección, los indicadores de operación de la señal, el procesador de señales, etc. La tarea inicializará esta información cuando se cree, conectará la tarea a create_list, inicialmente configurará la tarea en pure_suspend, si está configurado el inicio automático, llame a resume_task() para activar la tarea, aquí hay un detalle, si create_task() es inicializada en la aplicación, la tarea no se ejecutará automáticamente porque la inicialización aún no se ha completado, el control aún no se ha transferido al programador y la tarea no se puede programar.
Una vez que se activa la tarea, el estado cambia a listo y se cuelga en TCD_Priority_List [256]. Cada elemento de la matriz es un puntero a la lista bidireccional circular TCB, y la prioridad correspondiente se encuentra de acuerdo con la prioridad tc de la tarea.
Cada HISR tiene un bloque de control HISR, que solo tiene prioridad, pila HISR e información de entrada HISR, por lo que HISR no se puede suspender y no tiene información de entrada HISR. HISR no permite la suspensión y no hay intervalos de tiempo ni operaciones de señal. En circunstancias normales, cuando ocurre una interrupción, HISR se activará y el programa organizará la ejecución de HISR. Si no ocurre ninguna interrupción durante el período, la ejecución de HISR no se interrumpirá. Las prioridades de HISR son solo 0, 1. y 2, y la prioridad del temporizador es El nivel es 2 y la prioridad de HISR es 2. En otras palabras, es difícil adelantar el HISR activado por interrupciones externas, y solo se puede adelantar el HISR con mayor prioridad. A diferencia de la tarea, el HISR activado usa head_list y tail_list para colgar el HCB en la lista de enlace único. Debido a que los HISR con la misma prioridad no se adelantarán entre sí, no es necesario utilizar una lista doblemente enlazada. Dos consejos son acelerar la velocidad de ejecución de HISR.
El núcleo del sistema operativo en tiempo real es la programación de tareas, y la estrategia de programación de NU es el algoritmo de bucle y segmento de tiempo.
La parte de programación del sistema consta de tres funciones: control_too_system(), que se utilizan para guardar el contexto, establecer la pila de solicitudes, desactivar interrupciones, desactivar el intervalo de tiempo del sistema y restablecer el sistema. segmento de tiempo. Intervalo de tiempo del sistema, restablezca el intervalo de tiempo de la tarea al valor predeterminado, actualice sp a system_stack_pointer, llame a Schedule (), el proceso de programación es una consulta muy simple, solo mire las dos variables globales, TCD_Execute_HISR y TCD_Execute_Task, programe Parte de la clave es activar las interrupciones, de lo contrario, si no hay tareas preparadas o HISR activado, ingresará al ciclo infinito del programa. Después de consultar el siguiente hilo, saltará a control_to_thread () y volverá a abrir el intervalo de tiempo del sistema, luego agregue. el tc_stack_ptr del hilo al sp, cambie a la pila del hilo y sáquelo en secuencia, completando así la programación de tareas.
El cambio de tareas es principalmente un cambio de contexto, es decir, el cambio de pila de tareas guardará algunos registros y direcciones de retorno. Estas acciones las completa el compilador, y el cambio de tareas es el tiempo de ejecución en el sistema operativo. runtime) es un cambio de estado, por lo que el compilador no puede hacer nada al respecto, por lo que es necesario implementar el guardado del contexto en el código.
La preferencia de tareas es asíncrona y debe implementarse mediante interrupciones. En términos generales, cada interrupción del temporizador determinará si el tiempo dividido de la tarea actual ha pasado y luego establecerá TCT_Set_Execute_Task con la misma prioridad que otras tareas o una tarea de mayor prioridad se adelantará a las tareas de baja prioridad y las tareas de alta prioridad; se adelantan a las tareas de baja prioridad y las tareas de alta prioridad se adelantan a las tareas de baja prioridad. Las tareas de baja prioridad generalmente se activan mediante interrupciones externas. Resume_task() en HISR activará la tarea de alta prioridad y luego la programará para la tarea de alta prioridad. Debido a que el HISR del temporizador se registra durante la inicialización del sistema, solo responde al tiempo de espera. y La operación se realiza después de que se agota el tiempo y no se realiza la operación resume_task.
Hay dos tipos de pilas en NU: pila de solicitud y pila de interrupción. La pila de solicitud es una pila mínima y la pila de interrupción guarda todos los registros actuales. El tamaño de pila mínimo en TCB = tamaño de pila de adquisición de aplicación. - Pila de solicitudes (44 bytes en modo armado, 48 bytes en modo pulgar) La bandera de pulgar se usa para registrar el modo de trabajo de ARM al guardar el contexto. El código c se compila en modo pulgar, lo que puede reducir el tamaño del código y mejorarlo. La densidad del código ensamblador se compila en modo miniatura, lo que puede aumentar la densidad del código.
El código ensamblador se compila en modo ARM, lo que puede mejorar la eficiencia del código. No hay mucho código de kernel en NU, principalmente código ensamblador. El tipo de pila no tiene nada que ver con el shell al que apunta la PC. La pila de interrupción guarda el escenario en el que la tarea o HISR se interrumpe durante la ejecución. La pila de solicitud se establece en la ubicación de la pila de control. La pila se establece donde control_to_system(), Schedule_protect() y send_signals() se envían a tareas que ocupan recursos protegidos. La pila de solicitud se establece después de ejecutar HISR_Shell() y luego salta a la programación.
(Dirección inferior) Parte superior de la pila-> 1 (Tipo de pila de interrupción)
CPSR Guardar CPSR
r0 Guardar r0
r1 Guardar r1
r2 Guardar r2
r3 Guardar r3
r4 Guardar r4
r5 Guardar r5
r6 Guardar r6
r7 Guardar r7
r8 Guardar r8
r9 Guardar r9
r10 Guardar r10
r11 Guardar r11
r12 Guardar r12
sp Guardar sp
lr Guardar lr
(Dirección alta) Parte inferior de la pila - p>