2010-03-19 20 views
23

CPU Cambia del modo de usuario al modo kernel: ¿qué es exactamente? ¿Cómo hace esta transición?CPU Cambia del modo de usuario al modo kernel: ¿qué es exactamente? ¿Cómo hace esta transición?

EDIT:

Incluso si es dependiente de la arquitectura favor me dan una respuesta. La arquitectura depende de usted. Dime la arquitectura que conoces.

Quiero tener una idea acerca de lo que todas las cosas estarán involucradas en él.

+1

Depende de la arquitectura y no necesariamente depende del sistema operativo. –

Respuesta

28

Nota: esto es principalmente relevante para la arquitectura x86. Aquí hay una explicación algo simplificada.

La transición es generalmente causado por una de las siguientes:

  • de fallo (por ejemplo, un error de página o alguna otra excepción causada por la ejecución de una instrucción)
  • de interrupción (por ejemplo, una interrupción de teclado o I/O acabado)
  • Trap (por ejemplo, una llamada de sistema)

lo que sucede normalmente es que el sistema comprueba el Descriptor de Tabla de interrupción (IDT). Cada excepción (interrupción, falla, etc.) tiene un número asociado que se usa para indexar en esta tabla.

De esta tabla, la CPU puede determinar el controlador de interrupción para ejecutar.

Como parte de la transición los siguientes cambios (en general) tengan efecto:

  • Cambiar a Kernel pila
  • EFLAGS se guardan
  • selector segmento de código y EIP se guardan.
  • pila selector de segmento y puntero de pila se guardan
  • comience la ejecución del manejador de interrupciones
  • Los registros de propósito general se guardan (trabajo del manipulador)
  • selectores de segmento se cambian a los del kernel (de trabajo del manipulador)

Ahora se encuentra en modo kernel.

Espero que ayude :)

+1

¿Las interrupciones están deshabilitadas mientras se ejecuta un controlador de interupt? ¿O las interrupciones de mayor prioridad tienen permitido interrumpir el controlador de interrupción que ya se está ejecutando? ¿Puede haber un cambio de contexto durante un controlador de interrupción en ejecución? –

+0

Solo para aclarar: ¿Quiere decir "sistema operativo" cuando escribe "el sistema verifica la tabla de descriptores de interrupción"? –

+0

@MartinThoma, sí, es el código del OS funcionando ahora. – fante

4

Eso depende del sistema, pero el mecanismo habitual es que alguna operación de usuario causa una interrupción del software. Esa interrupción hace que el procesador cambie de modo y salte al código del kernel, que luego verifica qué estaba intentando hacer el programa (¿llamada al sistema?) Y luego realiza la acción solicitada y salta al código del modo de usuario. Otros mecanismos además de una interrupción de software también pueden causar la transición; por ejemplo, en un sistema multitarea preferente, una interrupción del temporizador puede activar el programador.

+0

Entonces, ¿estas dos situaciones son las únicas en que la CPU entra en modo kernel? – claws

+0

@claws, es completamente procesador, sistema operativo y depende de la implementación. –

+0

El comentario sobre las llamadas al sistema que suceden a través de una interrupción es algo anticuado. Older Linux solía usar la interrupción 0x80 para cambiar al modo kernel en una llamada al sistema. Pero con procesadores más nuevos (donde lo nuevo es cualquier cosa> pentium 2) y kernels de Linux, hubo un cambio al uso de la función de "llamada rápida al sistema" proporcionada a través de sysenter, instrucciones de sysexit. Consulte http://articles.manugarg.com/systemcallinlinux2_6.html – Jasmeet

1

En Windows, cuando se realiza una llamada al sistema, las rutinas de la biblioteca llaman a un punto de entrada del kernel que reside en el espacio de direcciones del sistema operativo. A su vez, lleva a la CPU al modo supervisor al ejecutar una instrucción específica para este fin, como sysenter. Lo que hace es esencialmente establecer un poco en el registro de banderas. Esto permite que el sistema operativo use instrucciones privilegiadas.

3

Mi entendimiento es que cualquier programa cuyo segmento de registros tienen los dos bits menos significativos cero se ejecuta en modo de núcleo, mientras que cualquier programa cuyos registros de segmento tiene los dos LSB = 1 va a correr en el usuario Modo. De hecho, los dos LSB del segmento definen el nivel privilegiado (0 más alto a 3 más bajo)

Por lo tanto, para hacer un prgrama en modo kernel, debe configurar los registros de segmento para que sean 0010 hex (creo) No estoy seguro de cómo puede colocar un programa en ese espacio de memoria sin sobreescribir algo más; en otras palabras, ¿cómo lo asegura el enlazador? Además, si desea llamar al código del modo Kernel desde el código del modo de usuario, debe averiguar cómo pasar los parámetros: no están utilizando la misma memoria soace, por lo que no pueden pasar datos por referencia de memoria. Supongo que debes pasarlo en registros.

Si anynody puede llenar los huecos en el anterior, estaría muy agradecido.

Cuestiones relacionadas