usuario sistemas sistema que procesador operativos operativo operacional núcleo nucleo modo microkernel hace entre diferencia cambio aplicaciones operating-system

operating-system - sistemas - nucleo del sistema operativo



¿Cuál es la diferencia entre los modos de usuario y kernel en los sistemas operativos? (7)

  1. Modo kernel

    En modo Kernel, el código de ejecución tiene acceso completo e irrestricto al hardware subyacente. Puede ejecutar cualquier instrucción de CPU y hacer referencia a cualquier dirección de memoria. El modo kernel generalmente se reserva para las funciones más confiables y de nivel más bajo del sistema operativo. Los bloqueos en modo núcleo son catastróficos; detendrán toda la PC.

  2. Modo de usuario

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

Lee mas

Entender el usuario y el modo Kernel

¿Cuáles son las diferencias entre el modo de usuario y el modo kernel, por qué y cómo se activan y cuáles son sus casos de uso?


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 de usuario:

  • modo donde se ejecutan todos los programas de usuario. No tiene acceso a la RAM y el hardware. La razón de esto es porque si todos los programas se ejecutaran en modo kernel, podrían sobreescribir la memoria de los demás. Si necesita acceder a alguna 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 Kernel:

  • modo donde se ejecutan todos los programas kernel (diferentes controladores). Tiene acceso a todos los recursos 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 conductores que operan en el nivel más bajo

Cómo ocurre el cambio.

El cambio del modo de usuario al modo kernel no se realiza automáticamente por la CPU. 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


Otras respuestas ya explicaron la diferencia entre el usuario y el modo kernel. 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 distintos sistemas operativos de Windows.


Un procesador en una computadora con Windows tiene dos modos diferentes: modo de usuario y modo kernel. 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 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 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 solo 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 eres usuario de Windows una vez que pasas por este enlace obtendrás más.

Comunicación entre el modo de usuario y el modo kernel


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.

Ver también http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode .


Los anillos CPU son la distinción más clara

En el modo protegido x86, la CPU siempre está en uno de los 4 timbres. El kernel de Linux solo usa 0 y 3:

  • 0 para kernel
  • 3 para usuarios

Esta es la definición más difícil y rápida del modo kernel frente al modo usuario.

¿Por qué Linux no usa los anillos 1 y 2: anillos de privilegios de la CPU: por qué los anillos 1 y 2 no se utilizan?

¿Cómo se determina el anillo actual?

El anillo actual se selecciona mediante una combinación de:

  • tabla de descriptor global: una tabla en memoria de 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.

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

  • el segmento registra CS, DS, etc., que apuntan al í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 está físicamente construido de modo que:

  • el anillo 0 puede hacer cualquier cosa

  • ring 3 no puede ejecutar varias instrucciones y escribir en varios registros, más notablemente:

    • 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 descriptor de segmento actual, que determina el anillo actual.

    • no puede modificar las tablas de página: ¿cómo funciona la búsqueda de x86?

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

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

    • no 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 usar las instrucciones LGDT y LIDT.

    • no puede hacer las instrucciones de IO como entrada y out , y por lo tanto tiene acceso a hardware arbitrario.

      De lo contrario, por ejemplo, los permisos de archivos 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 en realidad está controlado por el segmento de estado de la tarea .

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

      Linux siempre lo desautoriza. Ver también: ¿Por qué Linux no usa el interruptor de contexto de hardware a través del TSS?

¿Cómo funcionan los programas y los sistemas operativos de transición entre anillos?

  • cuando la CPU se enciende, comienza a ejecutar el programa inicial en el anillo 0 (bueno, 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 núcleo 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 manejador se ejecuta en el anillo 0, que decide si el núcleo permitirá esta acción, realizará la acción y reiniciará el programa de usuario en el anillo 3.

  • cuando se usa la llamada al sistema exec (o cuando el núcleo arranca /init inicia ), el kernel prepara los registros y la memoria del nuevo proceso userland, luego salta al punto de entrada y cambia la CPU al timbre 3

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

    Pero dado que 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 núcleo, 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 activarse.

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

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

Hay dos ventajas principales de separar kernel y userland:

  • es más fácil hacer programas ya que está más seguro de que uno no interferirá con el otro. 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 Por ejemplo, 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

Si bien los anillos negativos en realidad no se mencionan en el manual de Intel, en realidad existen modos de CPU que tienen más capacidades que el anillo 0 en sí mismo, por lo que son adecuados para el nombre de "anillo negativo".

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 con eso?

Creé una configuración básica que debería ser una buena forma de manipular anillos directamente: https://github.com/cirosantilli/x86-bare-metal-examples

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

Alternativamente, los módulos del kernel de Linux se ejecutan en el anillo 0, por lo que puede usarlos para probar operaciones privilegiadas, por ejemplo, leer los registros de control: ¿Cómo acceder a los registros de control cr0, cr2, cr3 desde un programa? Obteniendo falla de segmentación

Aquí hay una configuración conveniente de QEMU + Buildroot para probarlo sin matar a su host.

La desventaja de los módulos kernel es que otros kthreads se están ejecutando y podrían interferir con sus experimentos. Pero en teoría, usted puede hacerse cargo de todos los manejadores de interrupciones con su módulo kernel y ser el propietario del sistema, eso sería un proyecto realmente interesante.


Qué

Básicamente, la diferencia entre los modos kernel y user no depende del sistema operativo y solo se consigue restringiendo algunas instrucciones para que se ejecuten solo en modo kernel 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

Significa que el procesador vive en el modo núcleo o en el modo 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é

Al tener esta infraestructura de hardware, esto podría lograrse en sistemas operativos comunes:

  • Proteger los programas de usuario de acceder a toda la memoria, para que los programas no sobrescriban el sistema operativo, por ejemplo,
  • impidiendo 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 sus límites de memoria, por ejemplo.