19 votos

¿Qué impide que un programa en ensamblador bloquee el sistema operativo?

En primer lugar, soy principiante, así que si esta pregunta parece tonta, por favor, señale las suposiciones incorrectas.

Por lo que tengo entendido, el trabajo de un sistema operativo es gestionar el hardware y el software que se ejecuta en el sistema operativo. Además, según tengo entendido, los programas en ensamblador permiten controlar el hardware casi directamente. En un programa ensamblador, uno puede leer y escribir datos en registros, y leer y escribir datos en RAM.

Dada esta libertad para jugar con los registros y la RAM, ¿no sería posible que los programas en ensamblador afectaran al sistema operativo? Supongamos que un sistema operativo utiliza el registro A para almacenar información crucial, y supongamos que yo ejecuto un programa ensamblado en ese sistema operativo. Si el programa escribe basura en el registro A, el sistema operativo se verá afectado.

Preguntas:

  1. ¿Es posible manipular el registro A de la forma descrita anteriormente?

  2. Si no es así, ¿qué impide que los programas ensambladores modifiquen los registros utilizados por el SO?

33voto

GSerg Puntos 33571

Al final, todos los programas son código máquina, independientemente de si el lenguaje fuente era ensamblador o un lenguaje de alto nivel.

Lo importante es que haya hardware mecanismos que limitan lo que un proceso dado puede hacer, incluyendo "meterse" con registros que podrían afectar a otros programas o al propio sistema operativo.

Esto comenzó con una simple distinción entre los modos de funcionamiento "usuario" y "supervisor", y desde entonces ha evolucionado hacia una arquitectura de seguridad con múltiples "anillos" de privilegio.


He aquí un ejemplo muy genérico para hacerlo un poco más concreto:

  • En "modo usuario", un proceso no puede acceder a memoria que no haya sido asignada a su ID de proceso. La memoria asignada a otros procesos y al propio sistema operativo está bloqueada. Esto incluye los valores de los registros utilizados por esos otros procesos. Esto lo impone el hardware de la MMU.

  • Por lo tanto, en "modo usuario", un proceso no puede acceder a los registros de control de la MMU.

  • Y obviamente, en "modo usuario", un proceso no puede cambiar el modo a "modo supervisor" excepto a través de un mecanismo muy bien definido que implica llamar a una función del sistema operativo.

El sistema operativo obtiene el control si el proceso intenta romper alguna de estas reglas. Una vez que esto ocurre, el sistema operativo puede simplemente detener el proceso infractor, no ejecutando nunca más sus instrucciones.

10voto

jamesh625 Puntos 369

Muchos sistemas operativos multitarea utilizan una estructura de datos denominada Bloque de control de procesos (PCB) para solucionar el problema de la sobreescritura de registros. Cuando ejecutas tu código, el SO crea un nuevo proceso para seguirlo. El PCB contiene información sobre tu proceso y el espacio asignado para guardar el contenido de los registros. Digamos que el proceso A se está ejecutando actualmente en el procesador y tu código está en el proceso B. Lo que ocurre cuando ejecutas tu código es algo parecido a esto:

  1. Los datos de estado del proceso A (contenido de los registros, contador de programa, etc.) se copian en su PCB.

  2. Los datos de estado del proceso B se copian de su PCB a los registros de la CPU

  3. El proceso B se ejecuta en el procesador hasta que finaliza o es adelantado.

  4. Los datos de estado del proceso B se copian de nuevo en su PCB

  5. Los datos de estado del proceso A se copian de nuevo en la CPU y continúa ejecutándose

Si el sistema operativo se está ejecutando como el proceso A, entonces puedes ver cómo guardar sus registros antes de que tu programa se ejecute y luego copiarlos de nuevo en la CPU una vez que tu programa termina evita que los programas de usuario se metan con lo que está pasando en otros procesos.

Para evitar que los procesos de usuario escriban sobre los datos del SO en memoria, la mayoría de las plataformas utilizan la segmentación de memoria. Básicamente, utilizando memoria virtual, el espacio de direcciones que ve un proceso puede asignarse a cualquier rango arbitrario de direcciones físicas. Mientras los espacios de memoria física de los procesos no se solapen, es imposible que un proceso sobrescriba los datos de otro.

Por supuesto, los distintos sistemas operativos hacen las cosas de forma diferente, así que esto no se aplicará en todos los casos. Además, en la mayoría de las plataformas, los procesos del sistema operativo se ejecutan en un modo diferente al de los procesos de usuario, por lo que hay algunas complejidades.

4voto

Depende de la plataforma de la que hable.

  • En un procesador más básico, el procesador se limita a ejecutar las instrucciones que le indique el programa.

  • En un procesador más sofisticado, hay (al menos) dos modos. En un modo, el procesador hace lo que el programa le dice que haga. En el otro modo, el propio procesador se niega para ejecutar determinadas instrucciones.

¿Qué impide que un programa bloquee todo el sistema? Con el primer tipo de procesador, la respuesta es "nada". Con un procesador básico, un solo programa malintencionado puede bloquear todo el sistema. Todos los primeros ordenadores domésticos de 8 bits, y muchos de los de 16 bits, entran en esta categoría.

En un PC moderno, el procesador tiene un hardware de "protección". Básicamente, el SO se ejecuta en un modo especial que le permite hacer cualquier cosa, mientras que los programas normales se ejecutan en un modo en el que el procesador sólo permite determinadas acciones (en función de los ajustes que el SO haya configurado en el procesador). Cosas como sólo acceder a ciertos registros, o sólo acceder a determinados rangos de memoria.

Obviamente, permitir que un único programa malintencionado bloquee todo el sistema es malo (también hay graves implicaciones de seguridad en dejar que un programa malintencionado acceda a los datos que quiera). Para evitar esto, necesitas dos cosas:

  1. Un procesador que disponga realmente de hardware de protección (es decir, que pueda configurarse para negarse a ejecutar determinadas instrucciones).

  2. Un sistema operativo que realmente utiliza estas facilidades para protegerse. (No sirve de nada tener un chip con circuitos de protección si el sistema operativo nunca los utiliza).

Casi cualquier sistema operativo de escritorio moderno que puedas nombrar (Windows, Linux, Mac OS, BSD...) es un sistema operativo en modo protegido que se ejecuta en un procesador con hardware de protección. Si estás haciendo desarrollo embebido en algún microcontrolador de 8 bits, probablemente no tenga ningún hardware de protección. (O cualquier SO, para el caso...)

1voto

CS Student Puntos 118

Q. ¿Qué impide que un programa en ensamblador bloquee el sistema operativo?

A. Nada.

Sin embargo, muchos programadores muy inteligentes se han esforzado a lo largo de los años por hacerlo cada vez más difícil. Desgraciadamente, por cada programador inteligente hay muchos, muchos otros que son más creativos, más ambiciosos y, a veces, simplemente tienen más suerte que los inteligentes. Cada vez que un programador inteligente dice que nadie debería, haría o podría hacer algo, alguien encuentra la manera de hacerlo. Microsoft Windows (como ejemplo) existe desde hace casi 35 años y todavía tenemos BSoD (Pantallas Azules de la Muerte), que no son más que instrucciones que bloquean el sistema operativo.

Empecemos con un poco de terminología. Todo lo que se ejecuta en un ordenador lo hace en código máquina. El bit que lee las pulsaciones de las teclas o el movimiento del puntero del ratón, el bit que cambia el color de un píxel de la pantalla o lee un byte de un archivo y el bit que calcula si tu bala alcanzó al malo o el bit que decide si se aceptará tu solicitud de tarjeta de crédito se ejecutan como una secuencia de instrucciones de código máquina. Algunos trabajos son tan comunes y se realizan tan a menudo que tiene sentido ensamblar las instrucciones necesarias para realizarlos y que todo el mundo utilice ese ensamblaje. El conjunto de estas tareas que permiten o ayudan a otros a utilizar el ordenador tiende a llamarse sistema operativo, pero no hay nada inherentemente diferente entre ellos y cualquier otro programa. No son más que secuencias de instrucciones de código máquina. Oirás hablar de modos protegidos y anillos de privilegios, pero no son más que más secuencias del mismo código máquina diciéndole al ordenador cómo comportarse.

Lo que hace que los sistemas operativos sean más complicados (y, por tanto, más propensos a fallar) es que tienen que tener en cuenta cosas en las que normalmente no hay que pensar. Tomemos como ejemplo el más simple de los trabajos. Quiero escribir un mensaje al final de un archivo. En un lenguaje de alto nivel escribiría algo como:

  with open("myFile.txt", "w+") as f:
      # do some really clever things
      f.write("Goodbye cruel world!")

Ignoremos todos los detalles sobre cómo se accede y se cambian los estados físicos o cómo se interpretan como bits y bytes o cómo se transfieren esos bytes a y desde la memoria y la CPU, y confiemos en que todo eso lo manejan los programas que el SO proporciona entre bastidores. Pensemos en cómo se añade el final de un archivo. 1) Averiguar dónde está el final del archivo, 2) escribir algo en esa posición. ¿Qué podría salir mal? En realidad, muchas cosas. Piensa en qué más está pasando en el ordenador mientras haces cosas inteligentes. Si cualquier otra cosa que esté haciendo otra persona (incluido el propio sistema operativo) cambia de alguna manera el archivo en el que estás trabajando, entonces este trabajo tan sencillo se vuelve de repente mucho más complicado. El archivo es más largo, el archivo es más corto. El archivo ya no existe. El disco está lleno, el disco estaría lleno si se escribieran todos los bytes, el disco está bloqueado, el disco está defectuoso... Ahora hay tantas condiciones y excepciones diferentes con las que el sistema operativo tiene que lidiar que es increíble que consiga hacer algo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X