2009-08-21 105 views
82

¿Cuáles son las diferencias entre el modo de usuario y el modo kernel, por qué y cómo se activan y cuál es su caso de uso?¿Cuál es la diferencia entre los modos de usuario y kernel en los sistemas operativos?

+0

Posible duplicado de [¿Cuál es la diferencia entre el espacio del núcleo y el espacio de usuario?] (Https://stackoverflow.com/questions/5957570/what-is-the-difference-between-the-kernel-space- and-the-user-space) –

+0

@SalvadorDali hola, el consenso actual es cerrar por "calidad": http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its -much-newer-and-ha Dado que la "calidad" no se puede medir, simplemente voy por votos ascendentes. ;-) Probablemente se deba a qué pregunta golpear las mejores nuevas palabras clave de Google en el título. Lo animo a que simplemente copie su respuesta allí con un descargo de responsabilidad agregado en la parte inferior y un enlace desde este, en caso de que se cierre. –

Respuesta

117
  1. Kernel Mode

    en modo kernel, el código de ejecución será completa y sin restricciones acceso al hardware subyacente. Es puede ejecutar cualquier instrucción de CPU y referencia cualquier dirección de memoria. El modo kernel generalmente se reserva para el de nivel más bajo, las funciones más confiables del sistema operativo. Los bloqueos en el modo kernel son catastróficos; ellos detendrán toda la PC.

  2. modo de usuario

    en modo de usuario, el código que se ejecuta no tiene la capacidad para acceder directamente a la memoria hardware o de referencia. El código que se ejecuta en modo de usuario debe delegar a las API del sistema para acceder al hardware o a la memoria . Debido a la protección otorgada por este tipo de aislamiento, los bloqueos en el modo de usuario siempre son recuperables. La mayoría de del código que se ejecuta en su computadora se ejecutará en modo de usuario.

Leer más

Understanding User and Kernel Mode

+0

¿Se pregunta cuándo la CPU está ejecutando el código del sistema operativo, en qué modo está el procesador? – JackieLam

+2

@JackieLam: Debería estar en modo kernel. – kadina

+0

Por lo tanto, para ejecutar un proceso __user space__, debe estar asignado a __kernel space__? – roottraveller

5

Voy a apuñalar en la oscuridad y supongo que estás hablando de Windows. En pocas palabras, el modo kernel tiene acceso total al hardware, pero el modo de usuario no. Por ejemplo, muchos, si no la mayoría, de los controladores de dispositivos están escritos en modo kernel porque necesitan controlar detalles más finos de su hardware.

Véase también this wikibook.

+2

Esto es importante para usted como programador porque los errores del kernel tienden a causar estragos mucho más graves de lo que puede estar acostumbrado. Una de las razones de la distinción kernel/usuario es que el kernel puede supervisar/controlar los recursos críticos del sistema y proteger a cada usuario de los demás. Es un poco simplificado, pero sigue siendo útil, para recordarse a sí mismo que los errores del usuario a menudo son molestos, pero los errores del kernel tienden a reducir toda la máquina. –

3

Otras respuestas ya se ha explicado la diferencia entre el modo de núcleo y usuarios. Si realmente desea entrar en detalles, debe obtener una copia de Windows Internals, un excelente libro escrito por Mark Russinovich y David Solomon que describe la arquitectura y los detalles internos de los diversos sistemas operativos de Windows.

40

Estos son dos modos diferentes en los que su computadora puede operar. Antes de esto, cuando las computadoras eran como una gran sala, si algo falla, se detiene toda la computadora. Entonces, los arquitectos informáticos deciden cambiarlo. Los microprocesadores modernos implementan en hardware al menos 2 estados diferentes.

modo Usuario:

  • el modo en el que todos los programas de usuario se ejecutan. No tiene acceso a la RAM y hardware. La razón de esto es porque si todos los programas se ejecutaran en el modo kernel , podrían sobreescribir la memoria de los demás. Si es , necesita acceder a cualquiera de estas características: realiza una llamada a la API subyacente . Cada proceso iniciado por Windows excepto el proceso del sistema se ejecuta en modo de usuario.

modo de núcleo:

  • modo en el que todos los programas se ejecutan kernel (controladores diferentes). Tiene acceso a cada recurso y hardware subyacente. Se puede ejecutar cualquier instrucción de CPU y se puede acceder a todas las direcciones de memoria. Este modo está reservado para los controladores que operan en el nivel más bajo

Cómo se produce el cambio.

La CPU no realiza automáticamente el cambio del modo de usuario al modo kernel. La CPU se ve interrumpida por interrupciones (temporizadores, teclado, E/S). Cuando se produce una interrupción, la CPU deja de ejecutar el programa actual en ejecución, cambia al modo kernel y ejecuta el controlador de interrupción. Este controlador guarda el estado de la CPU, realiza sus operaciones, restablece el estado y regresa al modo de usuario.

http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode

http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html

http://en.wikipedia.org/wiki/Direct_memory_access

http://en.wikipedia.org/wiki/Interrupt_request

+0

¿Se pregunta cuándo la CPU está ejecutando el código del sistema operativo, en qué modo está el procesador? – JackieLam

+1

@JackieLam: kernel mode –

7

Un procesador en un equipo que ejecuta Windows tiene dos modos diferentes: modo de usuario y modo de núcleo. El procesador cambia entre los dos modos dependiendo del tipo de código que se está ejecutando en el procesador. Las aplicaciones se ejecutan en modo de usuario y los componentes principales del sistema operativo se ejecutan en modo kernel. Mientras que muchos controladores se ejecutan en modo kernel, algunos controladores pueden ejecutarse en modo de usuario.

Cuando inicia una aplicación en modo de usuario, Windows crea un proceso para la aplicación. El proceso proporciona a la aplicación un espacio de direcciones virtuales privadas y una tabla de identificadores privados. Debido a que el espacio de direcciones virtuales de una aplicación es privado, una aplicación no puede alterar los datos que pertenecen a otra aplicación. Cada aplicación se ejecuta de forma aislada, y si una aplicación falla, la falla se limita a esa aplicación. Otras aplicaciones y el sistema operativo no se ven afectados por el bloqueo.

Además de ser privado, el espacio de direcciones virtuales de una aplicación en modo de usuario es limitado. Un procesador que se ejecuta en modo de usuario no puede acceder a las direcciones virtuales que están reservadas para el sistema operativo. Limitar el espacio de direcciones virtuales de una aplicación en modo usuario evita que la aplicación altere, y posiblemente dañe, los datos críticos del sistema operativo.

Todo el código que se ejecuta en modo kernel comparte un único espacio de direcciones virtuales. Esto significa que un controlador kernel-mode no está aislado de otros controladores y del sistema operativo en sí. Si un controlador en modo kernel escribe accidentalmente en la dirección virtual incorrecta, los datos que pertenecen al sistema operativo u otro controlador podrían verse comprometidos. Si un controlador de kernel-mode falla, todo el sistema operativo se bloquea.

Si es usuario de Windows una vez que vaya a este enlace, obtendrá más.

Communication between user mode and kernel mode

1

Lo

Básicamente la diferencia entre los modos de núcleo y el usuario no depende del sistema operativo y sólo se consigue mediante la restricción de algunas instrucciones para ejecutarse sólo en el modo de núcleo por medio del diseño de hardware.Todos los demás fines, como la protección de la memoria, solo pueden realizarse con esa restricción.

Cómo

Esto significa que el procesador vive ya sea en el modo de núcleo o en el modo de usuario. Utilizando algunos mecanismos, la arquitectura puede garantizar que cada vez que se cambie al modo kernel, se obtenga el código del sistema operativo para su ejecución.

Por qué

Tener esta infraestructura de hardware éstos pueden ser alcanzados en los sistemas operativos comunes:

  • Proteger los programas de usuario de acceder a toda la memoria, para no dejar que los programas sobreescriben el sistema operativo, por ejemplo,
  • que impide que los programas de usuario realicen instrucciones confidenciales, como las que cambian los límites del puntero de la memoria de la CPU, para que los programas no rompan los límites de su memoria, por ejemplo.
2

anillos de CPU son los más clara distinción

En modo protegido x 86, la CPU está siempre en uno de los 4 anillos. El núcleo de Linux sólo utiliza 0 y 3:

  • 0 para el kernel
  • 3 para los usuarios

Esta es la definición más fuerte y rápido de modo de núcleo vs modo de usuario.

Por qué Linux no usa anillos 1 y 2: CPU Privilege Rings: Why rings 1 and 2 aren't used?

cómo se determina el timbre actual?

El anillo actual es seleccionado por una combinación de:

  • tabla de descriptores globales: una tabla en memoria de las entradas GDT, y cada entrada tiene un campo Privl que codifica el anillo.

    La instrucción LGDT establece la dirección en la tabla de descriptores actual.

    Consulte también: http://wiki.osdev.org/Global_Descriptor_Table

  • el segmento registra CS, DS, etc., que apuntan a que el índice de una entrada en el GDT.

    Por ejemplo, CS = 0 significa que la primera entrada del GDT está actualmente activa para el código de ejecución.

¿Qué puede hacer cada anillo?

El chip de la CPU se construye físicamente de manera que:

  • anillo 0 puede hacer nada

  • anillo 3 no se puede ejecutar varias instrucciones y escribir en varios registros, sobre todo:

    • no puede cambiar su propio anillo! De lo contrario, podría establecerse en el timbre 0 y los timbres serían inútiles.

      En otras palabras, no se puede modificar el actual segment descriptor, que determina el anillo actual.

    • no puede modificar las tablas de páginas: How does x86 paging work?

      En otras palabras, no se puede modificar el registro CR3, y la paginación en sí impide la modificación de las tablas de páginas.

      Esto evita que un proceso vea la memoria de otros procesos por razones de seguridad/facilidad de programación.

    • no se puede registrar controladores de interrupción. Esos se configuran escribiendo en las ubicaciones de memoria, lo que también se evita mediante la paginación.

      Los manejadores se ejecutan en el anillo 0 y romperían el modelo de seguridad.

      En otras palabras, no puede utilizar las instrucciones LGDT y LIDT.

    • no se pueden hacer las instrucciones IO como in y out, y por lo tanto tienen acceso a hardware arbitrario.

      De lo contrario, por ejemplo, los permisos de archivo serían inútiles si cualquier programa pudiera leer directamente del disco.

      Más precisamente gracias a Michael Petch: en realidad es posible que el sistema operativo permita las instrucciones de E/S en el anillo 3, esto es realmente controlado por el Task state segment.

      Lo que no es posible es que el anillo 3 se conceda permiso para hacerlo si no lo tenía en primer lugar.

      Linux siempre lo deshabilita. Ver también: Why doesn't Linux use the hardware context switch via the TSS?

Cómo hacer cómo los programas y sistemas operativos de transición entre los anillos?

  • cuando la CPU está encendido, se inicia la ejecución del programa inicial en el anillo 0 (así una especie de, pero es una buena aproximación). Puedes pensar que este programa inicial es el kernel (pero normalmente es un gestor de arranque que llama al kernel en el anillo 0).

  • cuando un proceso de usuario desea que el kernel haga algo por él, como escribir en un archivo, usa una instrucción que genera una interrupción como int 0x80 para señalar al kernel.

    Cuando esto sucede, la CPU llama e interrumpe el controlador de devolución de llamada que el kernel registró en el momento del arranque.

    Este controlador ejecuta en el anillo 0, que decide si el núcleo permitirá que esta acción, realizar la acción, y reinicie el programa de espacio de usuario en el anillo 3.

  • cuando se utiliza la llamada exec sistema (o cuando el kernel will start /init), el núcleo prepares the registers and memory del nuevo proceso de espacio de usuario, y luego salta al punto de entrada y conmuta la CPU para que suene 3

  • Si el programa intenta hacer algo malo, como escribir en un registro prohibido o dirección de memoria (debido a la paginación), la CPU también llama a algún controlador de devolución de llamada del kernel en el anillo 0.

    Pero como el territorio del usuario era malo, el kernel podría matar el proceso esta vez, o darle una advertencia con una señal.

  • Cuando se inicia el kernel, configura un reloj de hardware con una frecuencia fija, que genera interrupciones periódicamente.

    Este reloj de hardware genera interrupciones que ejecutan el anillo 0, y le permiten programar qué usuario y procesos deben reactivarse.

    De esta manera, la programación puede realizarse incluso si los procesos no realizan ninguna llamada al sistema.

¿Cuál es el punto de tener múltiples anillos?

Hay dos grandes ventajas de separar kernel y utilidades:

  • es más fácil de hacer que los programas a medida que esté más seguro de uno no va a interferir con la otra. Por ejemplo, un proceso de usuario no tiene que preocuparse de sobrescribir la memoria de otro programa debido a la búsqueda, ni de poner el hardware en un estado no válido para otro proceso.
  • es más seguro. P.ej. los permisos de archivos y la separación de memoria podrían evitar que una aplicación de piratería pueda leer sus datos bancarios. Esto supone, por supuesto, que confías en el kernel.

anillos negativos

Mientras que los anillos negativos en realidad no son referenciados en el manual de Intel, en realidad hay modos de CPU que tienen más capacidades que el anillo 0 en sí, y por lo tanto son un buen ajuste para el "negativo anillo "nombre.

Un ejemplo es el modo de hipervisor utilizado en la virtualización.

Para más detalles ver: https://security.stackexchange.com/questions/129098/what-is-protection-ring-1

Cómo jugar un rato con él?

He creado una configuración de metal desnudo que debe ser una buena manera de manipular directamente los anillos: https://github.com/cirosantilli/x86-bare-metal-examples

no tenía la paciencia para hacer un ejemplo de espacio de usuario por desgracia, pero fue tan lejos como configuración de paginación, por lo que userland debería ser factible.Me encantaría ver una solicitud de extracción.

+1

Dado que esta pregunta no es específica de ningún SO, 'in' y' out' están disponibles para sonar 3. El TSS puede apuntar a una tabla de permisos IO en la tarea actual que otorga acceso de lectura/escritura a todos o puertos específicos. –

+0

Por supuesto que establece los bits IOPL en el valor 3, luego el programa Ring 3 tiene acceso total al puerto y los permisos TSS IO no se aplican. –

+0

@MichaelPetch gracias, no sabía esto. He actualizado la respuesta. –

Cuestiones relacionadas