1. El punto de llegada
El tema 1 abrió con este programa y con la advertencia de que su única línea útil ponía en marcha más cosas de las que parecía:
#include <stdio.h>
int main(void)
{
printf("Hola, sistema operativo\n");
return 0;
}
Entonces describimos lo que ocurría en seis pasos, casi todos con palabras prestadas. Ahora cada parte del programa remite a algo que conocemos:
| En el programa | Lo que hay detrás | Tema |
|---|---|---|
#include <stdio.h> | Una cabecera del estándar de C, que existe en cualquier sistema. | 15, 25 |
main | No es el comienzo: antes se ejecutan el enlazador dinámico y _start. | 9, 32 |
printf | Una función de biblioteca, que da formato y guarda el texto en un búfer del proceso. | 15 |
| El texto en pantalla | Una llamada write sobre el descriptor 1, que es un dispositivo de caracteres; el emulador de terminal lo dibuja. | 13, 29 |
return 0 | El código de arranque llama a exit, que vacía los búferes y pide al kernel que finalice el proceso. El 0 lo recoge la shell. | 15, 26 |
| Lo que no está escrito | El proceso que la shell creó, su memoria virtual, sus credenciales, los fallos de página, las interrupciones del temporizador. | 19, 27, 30 |
El programa no cambió. Cambió lo que se ve al mirarlo, y ese era el objetivo del curso: no aprender a usar un sistema operativo, sino saber qué hay debajo de cada programa.
2. El curso en ocho preguntas
El mapa del tema 1 presentaba cada bloque como una pregunta. Estas son las respuestas, en una frase cada una:
| Bloque | La pregunta | La respuesta |
|---|---|---|
| 1. Introducción | ¿Qué es un sistema operativo y para qué existe? | Es el software que administra el hardware y lo presenta a los programas en forma de abstracciones, repartiéndolo y protegiéndolo. |
| 2. La computadora por dentro | ¿Qué hace el hardware por sí solo? | Ejecuta instrucciones una tras otra. No distingue programas, no protege y no reparte: todo eso hay que construirlo. |
| 3. El kernel y las llamadas al sistema | ¿Cómo le pide un programa algo al kernel? | Con una instrucción que cambia de modo y entrega el control a una rutina que el kernel eligió de antemano. |
| 4. Interrupciones | ¿Cómo recupera el kernel el control de la CPU? | El hardware se lo devuelve: los dispositivos, cuando ocurre algo; el temporizador, siempre. |
| 5. El arranque | ¿Qué ocurre entre el botón de encendido y el escritorio? | Una cadena de programas, cada uno capaz de cargar al siguiente, hasta el primer proceso. |
| 6. Tipos y diseños | ¿En qué se diferencian los sistemas operativos? | En lo que priorizan y en cuánto ponen dentro del kernel. Los mecanismos son los mismos. |
| 7. Los servicios | ¿Qué administra el kernel y cómo se observa? | Procesos, memoria, archivos, dispositivos y permisos, y todo se puede ver en /proc y /sys. |
| 8. Integración | ¿Qué ocurre, de punta a punta, al ejecutar un comando? | Lo que recorrimos en el tema 32: todo lo anterior, en dos milisegundos. |
3. Las ideas que sostienen todo
De un curso se olvidan los detalles. Conviene decidir qué debe quedar, y son unas pocas ideas que aparecieron una y otra vez, con distintos nombres:
| Idea | En pocas palabras | Dónde apareció |
|---|---|---|
| Abstracción | El sistema oculta el hardware tras conceptos simples: el proceso oculta la CPU; el espacio de direcciones, la memoria; el archivo, el disco. | Temas 2, 26, 27 y 28 |
| La frontera privilegiada | Hay dos modos. Lo peligroso solo se puede hacer en uno, y a ese solo se entra por puertas que el kernel dejó preparadas. | Temas 12, 13 y 17 |
| El kernel reacciona | No es un programa que corre al lado de los demás. Se ejecuta cuando lo invoca una llamada, una interrupción o una excepción. | Temas 11 y 19 |
| El hardware habilita | Cada garantía del sistema descansa en una capacidad del procesador. Sin modos no hay protección; sin temporizador, no hay multitarea. | Temas 3, 5 y 23 |
| Mecanismo y política | Una cosa es cómo se hace algo y otra qué se decide hacer. El kernel pone lo primero; lo segundo se deja, cuando se puede, fuera. | Temas 19, 22 y 29 |
| Cruzar cuesta | Cada paso al kernel, cada cambio de proceso y cada acceso al disco tiene un precio. Por eso todo se agrupa: se pide mucho, pocas veces. | Temas 7, 11, 14 y 15 |
| Hacerlo tarde | El kernel posterga el trabajo hasta que es inevitable: entrega la memoria al usarla, copia al escribir, graba cuando conviene. | Temas 7, 9, 18 y 27 |
| Una interfaz para todo | Dispositivos, tuberías y hasta el estado del kernel se usan como archivos, con las mismas cuatro operaciones. | Temas 28, 29 y 31 |
| No confiar en nadie | El kernel valida cada argumento y comprueba cada pedido. La protección se arma en capas, para que el fallo de una no entregue todo. | Temas 13 y 30 |
| Todo se puede observar | Ninguna afirmación del curso hubo que creerla: cada una se comprobó con un programa o con una herramienta. | Temas 16 y 31 |
La última no es un concepto de sistemas operativos, sino un método, y quizá sea lo más valioso. Ante una duda sobre lo que hace un programa, la respuesta no está en suponer: está en strace, en /proc o en diez líneas de C escritas para averiguarlo.
4. Los patrones que se repiten
Además de las ideas generales, el curso mostró varias soluciones concretas que reaparecen en lugares distintos. Reconocerlas ahorra mucho esfuerzo al estudiar un sistema nuevo, porque suelen estar ahí también:
| Patrón | Qué resuelve | Lo encontramos en |
|---|---|---|
| Una tabla de funciones | Que una parte del sistema invoque a otra sin conocerla, a través de un número o de un conjunto acordado. | La tabla de llamadas al sistema, la de vectores de interrupción, las operaciones de un driver, el sistema de archivos virtual |
| Una caché | La distancia de velocidad entre dos niveles: se guarda cerca lo que se usó hace poco. | La caché de la CPU, la TLB, la caché de páginas, el búfer de stdio, la búsqueda en PATH |
| Dormir y despertar | Esperar sin consumir CPU: una llamada al sistema deja al proceso dormido, y una interrupción lo despierta. | La lectura del teclado y del disco, sleep, wait, las tuberías |
| Prometer y entregar después | No gastar recursos en lo que quizá no se use. | La memoria de malloc, la carga de un ejecutable, la copia al escribir tras fork |
| Etapas que se cargan | Un problema circular: hace falta el sistema para cargar el sistema. | Firmware, cargador, kernel, initramfs |
| Contador y diferencia | Medir una tasa cuando solo se dispone de totales acumulados. | El uso de CPU, las interrupciones por segundo, los bytes de red |
| Identificar por número | Que el nombre sea para las personas y el número para el sistema. | PID, UID, descriptores, inodos, números mayor y menor |
| Heredar | Que un programa reciba su entorno ya preparado, sin tener que pedirlo. | Descriptores, credenciales, directorio actual, variables de entorno |
5. Los errores, ahora con explicación
En el tema 1 dijimos que estudiar sistemas operativos servía, entre otras cosas, para entender ciertos mensajes de error. Es un buen momento para comprobarlo. Cada uno de estos mensajes resultaba opaco al empezar, y ahora tiene una causa precisa y una forma de investigarlo:
| Mensaje | Qué ocurrió | Dónde mirar | Tema |
|---|---|---|---|
Segmentation fault | Un acceso a una dirección que no pertenece a ninguna región del proceso, o sin el permiso necesario. El kernel envió SIGSEGV. | dmesg, gdb | 18, 27 |
Illegal instruction | La CPU encontró bytes que no son una instrucción válida para ella. | dmesg | 18 |
Floating point exception | Una división entera por cero. | gdb | 18 |
Killed, sin más | Alguien envió SIGKILL. Si no fue una persona, fue el kernel al quedarse sin memoria. | dmesg, journalctl -k | 26, 27 |
Permission denied | Los permisos del archivo no conceden la operación a la identidad del proceso. | ls -l, id, strace -Z | 30 |
Operation not permitted | La operación exige un privilegio que el proceso no tiene. | strace -Z | 30 |
No such file or directory | Una ruta no existe. A veces no es la que se cree: puede faltar una biblioteca o un archivo de configuración. | strace -e trace=%file | 16 |
command not found | La shell no halló un ejecutable con ese nombre en los directorios de PATH. | type, echo $PATH | 32 |
Exec format error | El archivo no tiene un formato que este kernel sepa cargar: es de otro sistema o de otra arquitectura. | file | 9, 25 |
version `GLIBC_…' not found | El ejecutable se compiló contra una biblioteca de C más nueva que la instalada. | ldd, objdump -T | 15 |
No space left on device | El sistema de archivos está lleno, quizá por un archivo borrado que alguien mantiene abierto. | df, /proc/PID/fd | 28 |
Too many open files | El proceso alcanzó el límite de su tabla de descriptores. Suele indicar archivos que se abren y no se cierran. | /proc/PID/fd, /proc/PID/limits | 28, 31 |
Inappropriate ioctl for device | Se pidió una operación de terminal sobre algo que no lo es: la salida está redirigida. | — | 29 |
Kernel panic … Unable to mount root fs | El kernel arrancó y no pudo montar la partición raíz. | Los parámetros en GRUB | 21 |
| Un programa que «no responde» | Está bloqueado en una llamada, o está calculando sin parar. | strace -p, el estado en ps | 16, 26 |
| Una salida que falta o aparece desordenada | El texto quedó en el búfer de stdio. | fflush, stderr | 15 |
La tabla tiene un rasgo común. En todos los casos, el mensaje es la traducción de un número: un código de errno o una señal. Alguien —el kernel, la shell, la biblioteca— lo convirtió en texto. Saber qué número hay detrás y quién lo produjo es casi siempre la mitad del diagnóstico.
6. La caja de herramientas
El curso no era de administración, pero dejó un conjunto de herramientas probadas. Ordenadas por la pregunta que responde cada una:
| Para saber… | Herramienta | Tema |
|---|---|---|
| qué le pide un programa al kernel | strace, con -f, -p, -c, -Z, -y | 16 |
| qué dijo el kernel | dmesg, journalctl -k | 11, 22 |
| qué dijo un servicio | journalctl -u, systemctl status | 22 |
| qué procesos hay y en qué estado | ps, top, pstree, pgrep | 26 |
| cuánta memoria hay y quién la usa | free, pmap, /proc/PID/maps | 27 |
| cuán ocupado está el sistema | vmstat, uptime, /proc/stat | 19, 31 |
| cuánto tiempo pasó un programa en cada modo | time | 11 |
| dónde falló un programa | gdb, con la opción -g al compilar | 6, 18 |
| qué es un archivo y cómo está hecho | file, stat, readelf, ldd, xxd | 9, 28 |
| qué hardware hay y qué driver lo maneja | lspci, lsblk, lsmod, modinfo, /sys | 8, 24, 29 |
| qué interrupciones llegan | /proc/interrupts, watch | 17 |
| cómo arrancó el equipo y cuánto tardó | systemd-analyze, efibootmgr, /proc/cmdline | 20 a 22 |
| quién soy y qué puedo hacer | id, ls -l | 30 |
qué hace una función o un archivo de /proc | man, en sus secciones 2, 3 y 5 | 4, 15 |
Si hubiera que conservar una sola, sería la primera. strace funciona con cualquier programa, en cualquier lenguaje, sin el código fuente, y contesta la pregunta de la que casi todas las demás dependen.
7. Los programas del curso
Cada tema dejó uno o más programas. Reunidos, forman un pequeño laboratorio al que conviene volver: son cortos, cada uno aísla una sola idea, y se prestan a modificarlos.
| Bloque | Programas | Lo que muestran |
|---|---|---|
| 1 | hola.c, hola_write.c, copiar.c, ilusion.c, invasor.c, epoch.c, entorno.c, aviso.c, verificar.sh | El intermediario; la abstracción; la memoria propia de cada proceso; el entorno de trabajo. |
| 2 | memoria.c, almacenado.c, pila.c, suma.c, matriz.c, rtc.c, etapas.c | El programa almacenado; la pila; la caché; un dispositivo real; las etapas de la compilación. |
| 3 | componentes.sh, version.c, tiempos.c, anillo.c, privilegiada.c, espiar.c, hola.s, hola_error.s, escribir.c, errores.c, leer.c, copiar.c, quien.c, generica.c, caminos.c, clases.c, unidos.c, demora.c, mezcla.c, perdido.c, copiar_stdio.c, nombres.c, posix.c, terco.c | Los modos; la llamada al sistema en ensamblador y en C; errno; el búfer de stdio; el diagnóstico con strace. |
| 4 | interrupciones.c, division.c, division_real.c, segfault.c, ilegal.c, paginas.c, pausa.c, atrapar.c, bucle.c, turnos.c, siesta.c | Las interrupciones por segundo; las excepciones y sus señales; los fallos de página; los cambios de contexto. |
| 5 | mbr.c, cmdline.c, latido.c | La tabla de particiones; los parámetros del kernel; un servicio propio. |
| 6 | latencia.c, el módulo hola.c, familia.sh, plataforma.c | El tiempo real; código en el anillo 0; la portabilidad. |
| 7 | hijo.c, lanzar.c, zombi.c, huerfano.c, mapa.c, profundidad.c, memoria.c, info.c, abrir.c, redirigir.c, ventana.c, identidad.c, procesos.sh, usocpu.c | fork y exec; el espacio de direcciones; los descriptores; ioctl; las credenciales; /proc. |
| 8 | minishell.c, inspector.sh, inspector.c | Una shell y un monitor: todo lo anterior, junto. |
Si guardas todo en un mismo directorio, ten en cuenta que hay nombres que se usan en dos temas para programas distintos: copiar.c en los temas 2 y 14, memoria.c en los temas 5 y 27, y hola.c en el tema 1 y en el módulo del tema 24. Lo más cómodo es usar un directorio por tema.
8. Lo que quedó sin ver
Un curso de fundamentos se define tanto por lo que incluye como por lo que deja para después. En cada bloque hubo que detenerse antes de entrar en profundidad, y conviene tener presente dónde:
| Vimos | No vimos |
|---|---|
| Los comandos necesarios para los experimentos. | La terminal como herramienta de trabajo: búsquedas, filtros, edición, gestión de paquetes, redes. |
| Algunos scripts breves. | Bash como lenguaje: funciones, arreglos, manejo de errores, expresiones regulares. |
| C suficiente para hacer llamadas al sistema. | Punteros a fondo, estructuras de datos, gestión de memoria, compilación de proyectos grandes. |
Qué es un proceso, y fork, exec y wait. | Hilos, señales con sus manejadores, grupos y sesiones. |
| Que existe un planificador. | Los algoritmos: cómo decide, qué garantiza cada uno, cómo se evalúan. |
| Que dos flujos pueden interferir. | Condiciones de carrera, cerrojos, semáforos, interbloqueos. |
| Páginas, marcos y fallos de página. | La estructura de las tablas, los algoritmos de reemplazo, el interior de malloc. |
| Inodos, directorios y descriptores. | Cómo se organiza un sistema de archivos en el disco, y cómo sobrevive a un corte de energía. |
| Que una tubería conecta dos procesos. | Los demás mecanismos de comunicación: colas, memoria compartida, sockets. |
| Que la red no es un archivo. | Todo lo demás sobre redes. |
| Usuarios, permisos y las capas de protección. | Los ataques concretos y las defensas modernas en detalle. |
| Qué son una máquina virtual y un contenedor. | Cómo se construyen. |
La columna derecha no es una lista de omisiones: es el programa de los cursos que siguen. Cada fila tiene el suyo.
9. La ruta: catorce cursos más
Este curso es el primero de quince. Los demás profundizan en lo que aquí se presentó a vista de pájaro, y en cada uno encontrarás como punto de partida algo que ya viste:
Nivel inicial
| Curso | Profundiza en | Lo anticipamos en |
|---|---|---|
| 2. Terminal y Línea de Comandos en Linux | El uso diario del sistema: archivos, texto, procesos, permisos, tuberías y redirecciones. | Temas 4, 26, 28, 30 y 32 |
| 3. Automatización con Scripts en Bash | La shell como lenguaje de programación. | Temas 4, 25, 31 y 33 |
| 4. Programación en C para Sistemas Operativos | El lenguaje en que está escrito el kernel, y en que se le habla. | Temas 9, 14, 15 y 27 |
Nivel intermedio
| Curso | Profundiza en | Lo anticipamos en |
|---|---|---|
| 5. Procesos e Hilos | La creación y el control de procesos, las señales y los hilos. | Temas 18 y 26 |
| 6. Planificación de la CPU | Los algoritmos que deciden quién usa el procesador. | Temas 19 y 23 |
| 7. Concurrencia y Sincronización | Los problemas de compartir datos, y sus soluciones. | Temas 19 y 26 |
| 8. Gestión de Memoria | La paginación, las tablas, el intercambio y la asignación dinámica. | Temas 7, 18 y 27 |
| 9. Sistemas de Archivos y Entrada/Salida | La organización de los datos en el disco y el camino hasta el dispositivo. | Temas 7, 8, 28 y 29 |
| 10. Comunicación entre Procesos | Tuberías, colas, memoria compartida y sockets. | Temas 26 y 28 |
Nivel avanzado
| Curso | Profundiza en | Lo anticipamos en |
|---|---|---|
| 11. Redes desde el Sistema Operativo | Cómo implementa el kernel la comunicación entre equipos. | Temas 17 y 29 |
| 12. Seguridad en Sistemas Operativos | Los ataques, y los mecanismos que los contienen. | Temas 12, 20 y 30 |
| 13. Virtualización y Contenedores | Cómo se construye una máquina dentro de otra, y un sistema dentro de otro. | Temas 12, 23 y 30 |
| 14. Rendimiento, Depuración y Observabilidad | Medir, encontrar el cuello de botella y entender un sistema en producción. | Temas 16, 19 y 31 |
| 15. Construcción de un Sistema Operativo desde Cero | Escribir un kernel mínimo: arranque, interrupciones, memoria, procesos. | Temas 13, 17, 20, 21 y 24 |
El orden recomendado es el de los números, pero la ruta no es una fila. Después del nivel inicial, los cursos intermedios pueden tomarse según el interés: quien trabaja con servidores quizá quiera llegar pronto a los sistemas de archivos; quien escribe programas con hilos, a la concurrencia. El último curso es la prueba de todo lo anterior: no hay mejor forma de comprobar que se entiende un sistema operativo que escribir uno.
10. El próximo paso
El curso que sigue es Terminal y Línea de Comandos en Linux. Puede parecer un paso atrás: después de escribir un módulo del kernel, aprender a listar archivos. No lo es. A lo largo de este curso usamos la terminal como un medio, con lo mínimo para llegar a cada experimento, y quedó mucho sin explicar:
| Lo usamos aquí, de pasada | Allí se estudia |
|---|---|
grep, awk, cut, sort, head, tail, wc | El procesamiento de texto: cómo extraer, filtrar y transformar. |
|, >, 2>&1 | La composición de comandos, con todas sus formas. |
ls -l, chmod, ln, find | La gestión de archivos y permisos. |
ps, kill, &, jobs | El control de procesos y trabajos. |
sudo, apt, systemctl | La administración del sistema. |
$PATH, $?, $$ | Las variables y el entorno de la shell. |
La diferencia es que ahora llegas sabiendo qué hay detrás. Para quien empieza por los comandos, ls | wc -l es una fórmula que hay que memorizar. Para ti es una tubería creada por la shell, dos procesos con sus descriptores cambiados entre fork y exec, y un búfer del kernel entre ambos. Los comandos dejan de ser un vocabulario y pasan a ser consecuencias de un modelo que ya tienes. Ese es el sentido de haber empezado por los fundamentos.
11. Cómo seguir practicando
Lo aprendido se fija usándolo. Algunas maneras de hacerlo, de menor a mayor esfuerzo:
- Mirar lo que usas. Elige cada tanto un programa de uso diario y obsérvalo: qué archivos abre, cuántos procesos crea, cuánta memoria ocupa de verdad, qué hace mientras parece no hacer nada. Con
strace,psy/procalcanza. - Modificar los programas del curso. Cada tema terminó con ejercicios que proponían cambios. Los que quedaron sin hacer siguen ahí.
- Completar los dos proyectos. La shell del tema 32 admite redirecciones, tuberías y segundo plano. El inspector del tema 33 tiene diez ampliaciones propuestas.
- Leer el manual.
man 2 syscallslista todas las llamadas al sistema. Elegir una desconocida, leer su página y escribir un programa que la use es un ejercicio completo. - Leer código real. Las utilidades básicas son programas cortos, y su código fuente es público. Ver cómo está escrito el
cato ellsque usaste, después de haber escrito los tuyos, enseña mucho.
Para quien quiera un texto de consulta más amplio, hay cuatro libros que complementan bien este curso:
| Libro | Autores | Sirve para |
|---|---|---|
| Operating Systems: Three Easy Pieces | Remzi y Andrea Arpaci-Dusseau | La teoría, explicada con claridad y con experimentos. Está disponible gratuitamente en línea. |
| Sistemas operativos modernos | Andrew Tanenbaum y Herbert Bos | El texto universitario clásico, de alcance muy amplio. |
| The Linux Programming Interface | Michael Kerrisk | La referencia sobre las llamadas al sistema de Linux, con programas para cada una. |
| Linux Kernel Development | Robert Love | Una introducción al interior del kernel. |
12. El curso, en doce frases
- Un sistema operativo administra el hardware y lo ofrece a los programas como abstracciones: procesos, memoria propia, archivos.
- El hardware solo ejecuta instrucciones. La protección, el reparto y la multitarea se construyen sobre unas pocas capacidades del procesador.
- El procesador tiene dos modos, y solo el kernel se ejecuta en el privilegiado. Es la base de toda la protección.
- Un programa obtiene servicios del kernel mediante llamadas al sistema: un número, unos argumentos y una instrucción que cambia de modo.
- La biblioteca de C envuelve esas llamadas y añade una capa que las ahorra; POSIX las hace portables entre sistemas tipo Unix.
- El kernel no se ejecuta por su cuenta: lo activan las llamadas al sistema, las interrupciones de los dispositivos y las excepciones del procesador.
- El temporizador garantiza que el kernel recupere el control, y con el cambio de contexto hace posible la multitarea.
- El arranque es una cadena de programas —firmware, cargador, kernel, primer proceso— en que cada uno carga al siguiente.
- Los sistemas operativos se diferencian en lo que priorizan y en cuánto código ponen en modo kernel, no en sus mecanismos básicos.
- El proceso es la unidad a la que se asignan los recursos; su memoria es virtual, y se entrega cuando se usa.
- Archivos, dispositivos y el propio estado del kernel se manejan con la misma interfaz, y el acceso se controla comparando la identidad del proceso con los permisos del recurso.
- Todo lo anterior se puede observar, y esa es la manera de aprenderlo.
13. Autoevaluación final
Estas preguntas no corresponden a un tema: cada una pide relacionar varios. Si puedes responderlas sin consultar, el objetivo del curso está cumplido.
1. Un programa ejecuta printf("hola\n") con la salida en una terminal. Describe el camino del texto hasta la pantalla.
printf da formato al texto y lo guarda en el búfer de stdout. Como el destino es una terminal, el salto de línea provoca el vaciado: la biblioteca llama a write sobre el descriptor 1. La instrucción syscall cambia a modo kernel; el kernel llega, por la tabla de descriptores, al driver de la pseudoterminal, que procesa los bytes y los deja en el búfer del otro extremo. El emulador de terminal, que dormía esperándolos, despierta, los lee y los dibuja; el entorno gráfico y el driver de video los llevan a la pantalla.
2. ¿Qué tres cosas pueden hacer que la CPU pase de modo usuario a modo kernel, y qué tienen en común?
Una llamada al sistema, que el programa provoca a propósito; una excepción, que provoca sin querer una instrucción que no puede completarse; y una interrupción de hardware, que provoca un dispositivo. En las tres, la CPU cambia de modo y salta, en el mismo acto, a una dirección que el kernel fijó de antemano: quien provoca la entrada no elige qué se ejecuta.
3. Un programa entra en un bucle infinito que solo suma. ¿Por qué el resto del sistema sigue funcionando?
Porque el temporizador interrumpe al procesador a intervalos regulares. En cada interrupción el kernel recupera el control, comprueba si el proceso agotó su turno y, si otro proceso espera, hace un cambio de contexto. El programa no puede evitarlo: deshabilitar las interrupciones requiere una instrucción privilegiada.
4. ¿Por qué un puntero nulo en un programa termina solo con ese programa, y en un driver puede detener la máquina?
En los dos casos la unidad de gestión de memoria genera un fallo de página. Si ocurre en modo usuario, el kernel está por encima para contenerlo: envía SIGSEGV al proceso y los demás no se enteran. Un driver se ejecuta en modo kernel, en el mismo espacio de direcciones que el resto del kernel; no hay nadie por encima, y sus estructuras pueden haber quedado dañadas.
5. Un proceso pide 1 GB con malloc y no lo usa. ¿Cuánta memoria física consume? ¿Qué ocurre cuando empieza a escribir en él?
Casi ninguna. El kernel añade una región a su espacio de direcciones sin asignar marcos. Al escribir, cada primer acceso a una página produce un fallo de página; el kernel comprueba que la dirección pertenece a una región válida, asigna un marco y hace que la instrucción se repita. Si la memoria del sistema no alcanza, descarta caché, recurre al intercambio y, en último caso, elimina un proceso.
6. ¿Qué diferencia hay entre root y el modo kernel?
Son privilegios de naturaleza distinta. El modo kernel es un estado del procesador, que determina qué instrucciones y qué memoria son accesibles. root es una identidad de usuario, que el kernel consulta al atender una llamada al sistema. Un proceso de root se ejecuta en modo usuario; su poder consiste en que el kernel acepta lo que pide, incluso cargar un módulo, cuyo código sí se ejecutará en modo kernel.
7. En ls > lista.txt, ¿qué hace la shell, qué hace el kernel y qué hace ls?
La shell crea un proceso con fork; en el hijo abre lista.txt y lo coloca en el descriptor 1 con dup2; luego llama a execve. El kernel atiende cada una de esas llamadas: crea el proceso, comprueba los permisos, actualiza la tabla de descriptores, carga el programa. ls no hace nada distinto de lo habitual: escribe en el descriptor 1, sin saber que es un archivo.
8. ¿Cómo se entera un proceso dormido en un read de que llegaron sus datos?
No se entera él: lo despiertan. El dispositivo genera una interrupción; el manejador del driver recoge los datos y marca al proceso como listo. Cuando el planificador le da un turno, el proceso continúa dentro de su llamada, el kernel copia los datos a su búfer y read retorna.
9. Un ejecutable compilado en Linux no funciona en Windows, aunque el procesador sea el mismo. Da tres razones.
El formato del archivo es distinto: ELF frente a PE, y cada kernel solo sabe cargar el suyo. Las bibliotecas de las que depende no existen en el otro sistema. Y la interfaz de llamadas al sistema es diferente: los números, la convención y los servicios mismos.
10. ¿Por qué el arranque necesita varias etapas?
Porque para cargar el sistema operativo hacen falta capacidades que son parte del sistema operativo: leer un disco, entender un sistema de archivos. El firmware, que está en un chip, sabe lo mínimo para cargar al cargador; este sabe leer el sistema de archivos donde está el kernel; el kernel recibe en memoria un sistema provisional con los drivers que le faltan para montar la raíz.
11. ¿Qué diferencia hay entre un kernel monolítico y un microkernel, y qué se gana y se pierde con cada uno?
En el monolítico, los drivers, los sistemas de archivos y la red se ejecutan en modo kernel, en un mismo espacio de direcciones: se comunican con llamadas a función, lo que es rápido, pero un error en cualquiera afecta a todo. En el microkernel son procesos de usuario que se comunican por mensajes: un fallo queda aislado y el componente puede reiniciarse, al precio de más cambios de contexto.
12. Te dicen que un servidor «está lento». ¿Qué mirarías, y en qué orden?
Primero la carga media, comparada con la cantidad de procesadores, y el reparto del tiempo de CPU: mucho tiempo de usuario indica cálculo; mucho de kernel, llamadas al sistema; mucho de espera, disco. Después la memoria disponible y el uso del intercambio. Luego, con top, qué procesos consumen. Identificado uno, strace -c -p para ver qué le pide al kernel, y dmesg o el registro por si el kernel o algún servicio informaron un problema.
13. ¿Por qué se puede observar tanto de un sistema Linux con solo cat y strace?
Por dos decisiones de diseño. La primera es que el kernel publica su estado como archivos, en /proc y /sys, que cualquier herramienta de texto puede leer. La segunda es que todo lo que un programa hace fuera de su memoria pasa por las llamadas al sistema, una frontera única y estable que strace puede vigilar.
14. Si tuvieras que explicarle a alguien, en un minuto, qué es un sistema operativo, ¿qué dirías?
No hay una única respuesta. Una posible: es el programa que se interpone entre el hardware y todos los demás programas. Les da a cada uno la ilusión de tener una máquina propia —un procesador, una memoria, unos archivos—, reparte entre ellos la máquina real y les impide dañarse entre sí. Lo logra porque es el único que se ejecuta en el modo privilegiado del procesador, y los demás solo pueden pedirle las cosas.
Para terminar
- Vuelve al tema 1 y relee la sección «El rastro de un "Hola"». Reescríbela con tus palabras y con el detalle que ahora puedes darle.
- Elige las tres ideas de la sección 3 que te resulten menos claras y repasa los temas indicados.
- Recorre la tabla de errores de la sección 5 y provoca cada uno a propósito, con un programa o un comando.
- Completa al menos una ampliación de la shell y una del inspector.
- Escribe, sin consultar, el recorrido de un comando que elijas, como hicimos en el tema 32. Verifícalo después con
strace -f.
Aquí termina Fundamentos de Sistemas Operativos. El sistema que antes era una caja negra tiene ahora un interior conocido: un procesador con dos modos, un kernel que responde, y programas que le piden lo que necesitan. Lo que sigue, en cada curso de la ruta, es abrir una de esas piezas y mirar más de cerca.