Los sistemas operativos operan en dos modos de ejecución diferenciados por el nivel de privilegio:
┌─────────────────────────────────────────────┐
│ ESPACIO DE USUARIO │ ← Modo Usuario
│ Aplicaciones, procesos, shell, libs... │
├─────────────────────────────────────────────┤
│ INTERFAZ (Llamadas al sistema) │ ← syscalls
├─────────────────────────────────────────────┤
│ ESPACIO DE KERNEL │ ← Modo Kernel
│ Gestión memoria, CPU, E/S, planificador... │
└─────────────────────────────────────────────┘
HARDWARE FÍSICO
| Modo | Nivel de privilegio | Acceso al hardware | Ejemplos |
|---|---|---|---|
| Modo Usuario | Bajo (Ring 3) | ❌ No directo | Shell, aplicaciones, servicios |
| Modo Kernel | Alto (Ring 0) | ✅ Total | Drivers, planificador, memoria |
Las aplicaciones pasan de modo usuario a modo kernel mediante llamadas al sistema (syscalls).
| Tipo | Características | Ventajas | Desventajas | Ejemplos |
|---|---|---|---|---|
| Monolítico | Todo en el kernel | Muy rápido | Menos modular | Linux, Android |
| Monolítico modular | Permite módulos dinámicos | Flexible + rápido | Complejidad media | Linux |
| Microkernel | Solo lo esencial en kernel | Muy seguro y estable | Más lento | Minix |
| Híbrido | Mezcla de ambos | Equilibrio | Complejo | Windows, macOS |
| Exokernel | Muy minimalista | Máximo control | Poco usado | Experimental |
MICROKERNEL │▓│ → Solo: IPC, scheduling, memoria básica
MONOLÍTICO │▓▓▓▓▓▓▓▓▓│ → Todo: drivers, FS, red, memoria...
HÍBRIDO │▓▓▓▓▓▓│ → Núcleo + servicios externos selectivos
MODULAR │▓▓▓▓▓[mod]│ → Núcleo + módulos cargables en caliente
| Característica | Descripción |
|---|---|
| Tipo de kernel | Híbrido (mezcla monolítico + microkernel) |
| Planificación | Preventiva (preemptive) |
| Planificador | Distribuido (no centralizado) |
| Multitarea | Multitarea real |
| Multiprocesamiento | Soporte SMP (varias CPUs) |
| Prioridades | Basadas en niveles de prioridad |
| Hilos (threads) | Unidad básica de ejecución |
| Cambio de contexto | Rápido y eficiente |
Windows no usa un planificador centralizado. Su modelo es distribuido:
CPU 0 → [Planificador propio] → Cola de hilos local
CPU 1 → [Planificador propio] → Cola de hilos local
CPU 2 → [Planificador propio] → Cola de hilos local
CPU N → [Planificador propio] → Cola de hilos local
| Característica | Descripción |
|---|---|
| Tipo de kernel | Monolítico (modular) |
| Arquitectura | Núcleo grande con módulos cargables |
| Planificación | Preventiva (preemptive) |
| Planificador | Centralizado (CFS - Completely Fair Scheduler) |
| Multitarea | Multitarea real |
| Multiprocesamiento | SMP (soporte multi-CPU) |
| Gestión de memoria | Avanzada (paginación, swapping) |
| Drivers | En el kernel o como módulos |
| Código | Open source |
| Portabilidad | Muy alta |
[CFS - Planificador centralizado]
↓ ↓ ↓
CPU 0 CPU 1 CPU 2
| Sistema operativo | Tipo de kernel | Detalles |
|---|---|---|
| Windows | Híbrido | Mezcla monolítico + microkernel |
| Linux | Monolítico (modular) | Kernel grande con módulos |
| macOS | Híbrido (XNU) | Basado en Mach + BSD |
| iOS | Híbrido (XNU) | Igual que macOS |
| Android | Monolítico (Linux) | Kernel Linux modificado |
| Aspecto | Windows | Linux |
|---|---|---|
| Tipo kernel | Híbrido | Monolítico modular |
| Planificador | Distribuido (por CPU) | Centralizado (CFS) |
| Código fuente | Propietario (cerrado) | Open source |
| Drivers | En espacio kernel/usuario | En kernel o módulos .ko |
| Portabilidad | Media (x86/ARM) | Muy alta (múltiples arquitecturas) |
| Módulos dinámicos | Limitado | Sí (insmod, modprobe) |
1. Modos de ejecución: Todo SO con base UNIX/Linux opera en dos modos: modo usuario (privilegio bajo, sin acceso directo al hardware) y modo kernel (privilegio total). El paso entre ambos se realiza mediante llamadas al sistema (syscalls).
2. Tipos de kernel: Existen cinco tipos principales — monolítico (todo integrado, muy rápido), monolítico modular (flexible con módulos cargables, usado en Linux), microkernel (solo lo esencial, más seguro pero lento), híbrido (equilibrio entre ambos, usado en Windows y macOS) y exokernel (experimental). Linux es monolítico modular; Windows es híbrido.
3. Planificación: La diferencia clave entre Windows y Linux reside en el planificador — Windows usa un modelo distribuido (cada CPU tiene el suyo), mientras que Linux usa CFS centralizado (Completely Fair Scheduler) que garantiza equidad en el reparto de CPU entre todos los procesos.
insmod y modprobeLos módulos del kernel son fragmentos de código que se pueden cargar y descargar del kernel de Linux bajo demanda, sin necesidad de reiniciar el sistema. Permiten añadir funcionalidad (drivers, sistemas de archivos, protocolos de red, etc.) de forma dinámica.
Para gestionarlos, las dos herramientas más comunes son insmod y modprobe.
insmod (Insert Module)insmod es la herramienta más básica para insertar un módulo en el kernel. Carga el archivo .ko (kernel object) que se le indique, tal cual, sin resolver dependencias.
insmod <ruta_al_modulo.ko> [parametros]
Cargar un módulo indicando la ruta completa:
sudo insmod /lib/modules/$(uname -r)/kernel/drivers/net/dummy.ko
Cargar un módulo pasándole parámetros:
sudo insmod ./mi_modulo.ko debug=1 nombre="prueba"
.ko.unknown symbol)./etc/modprobe.d/ ni los alias del sistema./lib/modules/.insmod: ERROR: could not insert module foo.ko: Unknown symbol in module
Este error típico aparece cuando el módulo depende de otros que no están cargados. En ese caso, hay que usar modprobe.
modprobe (Module Probe)modprobe es la herramienta recomendada y de alto nivel para cargar y descargar módulos. Internamente usa insmod, pero añade inteligencia: resuelve dependencias, consulta configuración y trabaja por nombre de módulo.
modprobe [opciones] <nombre_modulo> [parametros]
Cargar un módulo por nombre (sin extensión ni ruta):
sudo modprobe dummy
Descargar un módulo:
sudo modprobe -r dummy
Cargar pasando parámetros:
sudo modprobe usbcore autosuspend=2
Ver qué haría sin ejecutarlo realmente (modo simulación):
modprobe --dry-run --verbose dummy
Mostrar las dependencias de un módulo:
modprobe --show-depends ext4
/lib/modules/$(uname -r)/).modules.dep (generado por depmod)./etc/modprobe.d/ y /usr/lib/modprobe.d/, donde se pueden definir alias, opciones por defecto, listas negras (blacklist), etc.-r).| Opción | Descripción |
|---|---|
-r, --remove |
Descarga el módulo (y dependencias huérfanas). |
-v, --verbose |
Muestra información detallada. |
-n, --dry-run |
Simula la operación sin ejecutarla. |
-f, --force |
Fuerza la carga aunque haya conflictos de versión. |
--show-depends |
Lista las dependencias del módulo. |
-c, --showconfig |
Muestra la configuración efectiva de modprobe. |
insmod y modprobe| Característica | insmod |
modprobe |
|---|---|---|
| Argumento de entrada | Ruta al archivo .ko |
Nombre del módulo |
| Resuelve dependencias | ❌ No | ✅ Sí |
Usa /etc/modprobe.d/ |
❌ No | ✅ Sí |
| Permite descargar módulos | ❌ No (se usa rmmod) |
✅ Sí (modprobe -r) |
| Nivel | Bajo | Alto |
| Uso típico | Desarrollo / pruebas | Administración del sistema |
lsmod — Lista los módulos actualmente cargados en el kernel. En realidad es prácticamente un wrapper que formatea el contenido del archivo virtual /proc/modules:lsmod
cat /proc/modules # misma información, formato crudo
rmmod — Descarga un módulo (sin tocar dependencias):sudo rmmod dummy
modinfo — Muestra información sobre un módulo (autor, licencia, parámetros aceptados, dependencias, etc.):modinfo ext4
depmod — Regenera el archivo de dependencias modules.dep. Se ejecuta normalmente al instalar un nuevo kernel o módulo:sudo depmod -a
El kernel mantiene en memoria la lista de módulos cargados. El espacio de usuario accede a esos datos a través de archivos virtuales expuestos por procfs y sysfs, además de archivos en disco para metadatos y configuración.
| Comando | Fuente de datos principal | Tipo |
|---|---|---|
lsmod |
/proc/modules |
Virtual (procfs) |
insmod |
El archivo .ko que le pasas + syscall finit_module() |
Disco + kernel |
modprobe |
/lib/modules/$(uname -r)/modules.dep, /etc/modprobe.d/, /proc/modules |
Disco + virtual |
rmmod |
/proc/modules (comprobación) + syscall delete_module() |
Virtual + kernel |
modinfo |
El archivo .ko en /lib/modules/$(uname -r)/ |
Disco |
depmod |
Escanea /lib/modules/$(uname -r)/ y genera modules.dep y modules.* |
Disco |
/proc/modules — Lista en texto plano de los módulos cargados, su tamaño, el contador de uso, qué módulos dependen de ellos, su estado y su dirección de memoria. Es lo que lee lsmod.$ cat /proc/modules
ext4 933888 1 - Live 0xffffffffc0a00000
mbcache 16384 1 ext4, Live 0xffffffffc09f0000
...
/sys/module/ — Interfaz más rica vía sysfs. Cada módulo cargado tiene su propio directorio con subdirectorios como parameters/, sections/, refcnt, etc. Útil para inspeccionar parámetros en caliente:ls /sys/module/
cat /sys/module/usbcore/parameters/autosuspend
modprobe/lib/modules/$(uname -r)/ — Directorio donde viven los .ko del kernel actual./lib/modules/$(uname -r)/modules.dep — Mapa de dependencias generado por depmod. Sin este archivo, modprobe no sabría qué cargar antes de qué./lib/modules/$(uname -r)/modules.alias — Alias (incluyendo los basados en IDs de hardware PCI/USB) para que modprobe resuelva nombres alternativos./etc/modprobe.d/*.conf y /usr/lib/modprobe.d/*.conf — Configuración: alias, opciones por defecto, blacklists./etc/modules-load.d/*.conf — Módulos a cargar al arranque (lo procesa systemd-modules-load.service).lsmod y rmmod preguntan al kernel (vía /proc/modules) qué hay cargado en este instante.modprobe consulta tanto el disco (para saber qué puede cargar y con qué dependencias/configuración) como /proc/modules (para saber qué hay ya cargado y evitar duplicados).insmod y modinfo trabajan directamente sobre el archivo .ko, sin consultar el estado del kernel.Para que los módulos se carguen automáticamente al arrancar, se pueden añadir a:
/etc/modules-load.d/*.conf — Un nombre de módulo por línea./etc/modprobe.d/*.conf — Para definir alias, opciones o listas negras.dummy al inicio/etc/modules-load.d/dummy.conf:
dummy
/etc/modprobe.d/blacklist-nouveau.conf:
blacklist nouveau
options nouveau modeset=0
/etc/modprobe.d/usbcore.conf:
options usbcore autosuspend=2
lsmod
modinfo nombre_modulo
sudo modprobe nombre_modulo
sudo modprobe -r nombre_modulo
modprobe en el 99% de los casos: es seguro, resuelve dependencias y respeta la configuración del sistema.insmod solo cuando estás desarrollando un módulo propio o trabajando con un .ko que no está instalado en /lib/modules/.depmod -a tras instalar un nuevo módulo en el sistema, para que modprobe pueda encontrarlo por nombre.r nombre.