Las otras dos respuestas (al momento de escribir) hablan sobre las interrupciones y el IDT. Esto es correcto, sin embargo, en una CPU Intel-esque moderna, no hay menos de tres formas de llamar a un núcleo.
Método # 1: interrupciones.
Esto se explica arriba. Configura una entrada en la tabla de descriptores de interrupciones / vector de interrupciones, y luego ejecuta una interrupción de software para ingresar al núcleo.
La principal ventaja de este método es que un núcleo típico debe ser capaz de manejar las interrupciones de todos modos, y funciona en hardware arcaico.
Método # 2: Llamar puertas.
Una puerta de llamada es un tipo especial de selector de segmento. El objetivo de la llamada debe cargarse en la tabla de descriptores de segmento global o local (GDT y LDT respectivamente). Si luego realiza una instrucción de llamada lejana utilizando la puerta de llamada como segmento (se ignora el desplazamiento de la llamada), esto le permite llamar a un código más privilegiado. Las puertas de llamada son extremadamente flexibles; La arquitectura IA-32 tiene cuatro niveles de privilegio, y las puertas de llamada le permiten llamar a cualquier nivel.
No creo que Linux alguna vez haya usado puertas de llamada, pero Windows 95 sí. Los servicios del kernel Win95 ( krnl386.exe
y kernel.dll
) realmente se ejecutaron en modo de usuario (anillo 3). El nivel de privilegio más alto (anillo 0) solo se usó para controladores y un microkernel que realizó solo el cambio de proceso. La llamada a los conductores se realizó mediante puertas de llamada. Esto permitió que el código heredado de 16 bits (¡de los cuales había mucho!) Usara los controladores Win95 simplemente usando una llamada remota estándar, como siempre lo hacían.
La protección inadecuada de la tabla de descriptores globales fue la causa de varias vulnerabilidades de Windows 95, que lograron instalar sus propias puertas de llamadas escribiendo sobre la memoria.
Método # 3: SYSCALL / SYSRET y SYSENTER / SYSEXIT
Estos son dos conjuntos de instrucciones, inventados independientemente por AMD e Intel, pero esencialmente hacen lo mismo. SYSCALL / SYSRET fue lo primero y fue solo para AMD, SYSENTER / SYSEXIT fue Intel, pero AMD lo implementa ahora. Así que voy a describir SYSENTER / SYSEXIT.
A diferencia de las puertas de llamada, SYSENTER solo se puede usar para transferir al anillo 0, y solo se puede transferir a una ubicación. Sin embargo, tiene la ventaja de tener una latencia extremadamente baja porque, a diferencia de una llamada o interrupción, no toca la pila.
La ubicación de transferencia se configura utilizando tres registros específicos del modelo: uno para la información del segmento y uno para el puntero de instrucción y el puntero de pila del código del núcleo. Como no se "empuja" nada en la pila, el código de modo de usuario es responsable de decirle al núcleo a dónde regresar pasando el puntero de instrucción de retorno y el puntero de pila en los registros. El núcleo es responsable de restaurar el puntero de la pila, y la instrucción SYSEXIT restaura el puntero de la instrucción.
Más información sobre las instrucciones SYSENTER y SYSEXIT.