Llamadas al sistema: el mostrador oficial donde un programa pide al sistema operativo
Al final de la lección pasada vislumbramos un hueco curioso. El sistema operativo fija permisos en cada archivo, y sin embargo mi propio programa no puede sacar del disco ni siquiera un archivo que tiene permitido leer. De hecho, un programa no puede tocar libremente el disco, la pantalla ni la red. Está encerrado dentro de una cerca firme. Entonces, ¿cómo logra abrir un archivo, o poner letras en la pantalla?
Un programa está encerrado dentro de una cerca (modo usuario)
Antes dijimos que el sistema operativo construye un muro para que los programas no invadan la memoria de los demás. Ese muro aplica al hardware igual. Un programa común no puede meter la mano directamente en el disco, no puede poner un punto en la pantalla directamente, no puede tocar la línea de red en sí. Es como si estuviera dentro de una cerca. Este estado encerrado se llama modo usuario. Parece sofocante, pero hay una razón. Si cualquier programa pudiera manejar el hardware directamente, un solo programa lleno de errores o malicioso podría arruinar toda la computadora.
Haz que el programa intente alcanzar directamente el disco. El muro lo bloquea (rojo). Un programa en modo usuario no puede tocar el hardware directamente.
Cada vez que intentaba alcanzar directamente, quedaba bloqueado. Por seguridad es de lo más natural. Pero entonces parece extraño. Los programas que usamos a diario abren archivos sin problema, muestran fotos y se conectan a internet. Si están encerrados, ¿cómo logran todo eso? El secreto es que no lo hacen ellos mismos; lo piden. A continuación, veamos cómo funciona ese pedir.
La solución: pedir en un mostrador oficial (una llamada al sistema)
En un banco no entramos nosotros mismos a la bóveda. Vamos al mostrador, entregamos una solicitud, y un empleado que tiene las llaves se encarga por nosotros. Un programa es igual. Como no puede abrir el disco él mismo, va al mostrador del sistema operativo y pide. "Abre este archivo, por favor." "Pon estas letras en la pantalla." "Envía esto por internet." Cada una de esas solicitudes entregadas al sistema operativo se llama una llamada al sistema. Lo clave es que el programa no hace el trabajo él mismo; hace que lo haga el sistema operativo, porque el sistema operativo tiene el privilegio.
Toca la solicitud para pedir en el mostrador. El programa (dorado) entrega abrir archivo al mostrador del SO (azul), y el SO lo hace y devuelve el resultado (verde).
Al pedir en el mostrador, lo imposible se volvió posible. El programa sigue dentro de la cerca, pero a través de su agente, el sistema operativo, logró un trabajo de afuera. Pero una cosa es curiosa. Es el mismísimo disco, así que ¿por qué está bloqueado cuando lo toca el programa y bien cuando lo toca el sistema operativo? En ese breve instante de cruzar el mostrador, algo claramente cambia. A continuación, miremos de cerca ese cambio.
Cruzar el mostrador cambia el privilegio (modo usuario y modo núcleo)
El secreto es que la CPU tiene dos modos. Uno es el modo usuario, el mundo de poder limitado donde viven nuestros programas. El otro es el modo núcleo, el mundo poderoso del sistema operativo donde puede tocar el hardware y cualquier otra cosa. Normalmente un programa corre en modo usuario. Entonces, en el instante en que una llamada al sistema cruza el mostrador, la CPU cambia brevemente a modo núcleo. Con ese privilegio fuerte el sistema operativo atiende el trabajo pedido, y al terminar vuelve enseguida a modo usuario y entrega el resultado al programa. El poder fuerte se concede solo por el momento de atender la petición, y solo en este mostrador, y después se retira.
Toca hacer una llamada al sistema. El programa corre en modo usuario (dorado), cambia a modo núcleo (azul) en cuanto cruza el mostrador, hace el trabajo, y vuelve a modo usuario.
Esta pequeña danza, el modo que cambia brevemente y vuelve, es en realidad el corazón de la seguridad del sistema operativo. El poder no está siempre encendido; se enciende solo por el instante en que llega una petición, y luego se apaga. Pero aquí surge una pregunta. Si el sistema operativo simplemente hiciera lo que se le pide en cuanto cruzas el mostrador, ¿en qué se diferenciaría al final de que el programa toque el hardware directamente? Por eso el mostrador tiene un trabajo más: revisar. Veámoslo a continuación.
Un solo mostrador permite revisar (la comprobación de permisos)
Si el sistema operativo hiciera todo en cuanto se le pide, sin preguntas, el mostrador sería solo un punto de paso. Pero el sistema operativo no hace eso. Como toda petición debe pasar por este único mostrador, el sistema operativo puede revisar primero, antes de hacer el trabajo. "¿Tienes permiso para leer este archivo?" La misma comprobación de permisos que vimos la lección pasada ocurre justo aquí. Si el permiso está, hace el trabajo; si no, rehúsa y devuelve un error. Un mostrador estrecho se vuelve el puesto de control por el que toda acción peligrosa debe pasar.
Elige una petición y mándala al mostrador. El SO comprueba el permiso. Una petición permitida se hace (verde); una prohibida (por ejemplo, escribir el archivo de otro) se rehúsa (rojo) con un error devuelto.
Una petición permitida pasó, y una prohibida fue detenida en la puerta. Que el mostrador sea estrecho no era un inconveniente sino una salvaguarda. Como toda acción peligrosa debe pasar por un solo lugar, las reglas solo hace falta aplicarlas en ese único lugar. Ahora hilemos todo en una sola línea: la cerca del modo usuario, el pedir que es una llamada al sistema, el modo núcleo brevemente cambiado, y la comprobación en el mostrador.
En resumen: el viaje de ida y vuelta en una línea, y el núcleo detrás del mostrador
Visto en una línea, va así. Un programa corre dentro de la cerca del modo usuario, sin poder tocar el hardware directamente. Cuando necesita algo, pide en el mostrador oficial con una llamada al sistema. En cuanto cruza, la CPU cambia brevemente a modo núcleo, y el sistema operativo primero comprueba el permiso, luego hace el trabajo. Al terminar, vuelve a modo usuario y entrega el resultado. Así que una llamada al sistema es la única puerta bien custodiada que une un programa con el poder del sistema operativo. Cada vez que abrimos un archivo, ponemos un punto en la pantalla o enviamos algo por internet, todo eso pasa calladamente por esta puerta.
Toca los pasos en orden para seguir una vuelta completa. Del programa de usuario a la llamada al sistema, al cambio a modo núcleo y la comprobación de permisos, a hacer el trabajo y devolver el resultado. El viaje de ida y vuelta en un panel.
Pero detrás de ese mostrador, ¿quién es el que realmente hace el trabajo con la fuerza poderosa del modo núcleo? El centro más profundo del sistema operativo, el núcleo que tiene todo el privilegio y habla directamente con el hardware, tiene un nombre. Es el kernel. Una llamada al sistema era, al final, una petición enviada a este kernel. En la próxima lección por fin nos encontramos cara a cara con el kernel. Veremos, todo en un solo lugar, en qué manos estaban girando todo este tiempo la planificación, la memoria, los archivos, los permisos y el mostrador que hemos observado.