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.