versiones ventajas tutorial historia desventajas descargar central operating-system mode

operating-system - tutorial - sybase ventajas y desventajas



¿Dónde está el bit de modo? (3)

Acabo de leer esto en "Conceptos del sistema operativo" de Silberschatz, p. 18:

Un poco, llamado el bit de modo , se agrega al hardware de la computadora para indicar el modo actual: kernel (0) o user (1). Con el bit de modo, podemos distinguir entre una tarea que se ejecuta en nombre del sistema operativo y una que se ejecuta en nombre del usuario.

¿Dónde está el bit de modo almacenado?

(¿Es un registro en la CPU? ¿Se puede leer el bit de modo? Por lo que yo entiendo, la CPU tiene que poder leer el bit de modo. ¿Cómo sabe qué programa obtiene el bit de modo 0? dirección especial get mode bit 0? ¿Quién establece el bit de modo / cómo se establece?)


En la actualidad, recibe otros nombres, como el Modo Supervisor o un anillo de protección.


Es un registro de CPU. Solo es accesible si ya estás en modo kernel.

Los detalles de cómo se establece dependen del diseño de la CPU. En el hardware más común, se configura automáticamente al ejecutar un código de operación especial que se utiliza para realizar llamadas al sistema. Sin embargo, hay otras arquitecturas donde ciertas páginas de memoria pueden tener un conjunto de banderas que indica que son "puertas de enlace" al kernel: llamar a una función en estas páginas establece el bit del modo kernel.


Tenga en cuenta que su pregunta depende en gran medida de la CPU; aunque no es común, es posible que se encuentre con ciertos procesadores en los que este concepto de nivel de usuario / kernel ni siquiera existe.

El registro cs tiene otra función importante: incluye un campo de 2 bits que especifica el Nivel de privilegio actual (CPL) de la CPU. El valor 0 denota el nivel de privilegio más alto, mientras que el valor 3 denota el nivel más bajo. Linux usa solo los niveles 0 y 3, que se denominan respectivamente Modo kernel y Modo de usuario.

(Tomado de "Understanding the Linux Kernel 3e", sección 2.2.1)
También tenga en cuenta que esto depende de la CPU como puede ver claramente y cambiará de una a otra, pero el concepto, en general, se cumple.


¿Quién lo establece? Normalmente, kernel / cpu y un proceso de usuario no pueden cambiarlo, pero permítanme explicar algo aquí.

Esto es una simplificación excesiva, no lo tomes como es
Supongamos que el kernel está cargado y que la primera aplicación acaba de comenzar (el primer shell), el kernel carga todo para que se inicie esta aplicación, establece el bit en el registro cs (si está ejecutando x86) y luego salta al código del proceso de Shell.

El shell continuará ejecutando todas sus instrucciones en este contexto, si el proceso contiene alguna instrucción privilegiada, la CPU la buscará y no la ejecutará; dará una excepción (excepción de hardware) que le dice al kernel que alguien intentó ejecutar una instrucción privilegiada y aquí el código del kernel maneja el trabajo (la CPU establece el cs en modo kernel y salta a alguna ubicación conocida para manejar este tipo de errores (tal vez terminar el proceso, tal vez otra cosa).

Entonces, ¿cómo puede un proceso hacer algo privilegiado? Hablando con un determinado dispositivo, por ejemplo? Aquí vienen las llamadas al sistema; el kernel hará este trabajo por ti.

Lo que sucede es lo siguiente:
Establece lo que desea en un lugar determinado (por ejemplo, establece que desea acceder a un archivo, la ubicación del archivo es x, está accediendo para leer, etc.) en algunos registros (la documentación del kernel le informará al respecto) y luego (en x86) int0x80 instrucción int0x80 .

Esto interrumpe la CPU, detiene su trabajo, establece el modo en modo kernel, salta el registro IP a una ubicación conocida que tiene el código que sirve solicitudes de archivos-IO y se mueve desde allí.
Una vez que sus datos estén listos, el kernel establecerá estos datos en un lugar al que pueda acceder (ubicación de memoria, registro, depende de la CPU / Kernel / lo que solicitó), establece el indicador cs en modo usuario y salta de nuevo a su instrucción al lado de la instrucción it int 0x80 .

Finalmente, esto sucede cada vez que ocurre un cambio, se notifica al kernel que algo sucedió, por lo que la CPU termina su instrucción actual, cambia el estado de la CPU y salta al código que maneja esta cosa; el proceso explicado anteriormente, en términos generales, se aplica a cómo se produce un cambio entre el modo kernel y el modo de usuario.