Waa maxay IRQL (Heerka Codsiga Kala Goosashada) ee Windows iyo sidee ayay ula xiriirtaa BSODs?

Cusbooneysiintii ugu dambeysay: 01/10/2025
Author: Isaac
  • IRQL define prioridades de ejecución y enmascara interrupciones por nivel, por encima de DISPATCH manda el IRQL, no la prioridad de hilos.
  • ka BSOD 0xA/0xD1 suelen deberse a accesos a memoria paginable o inválida a IRQL alto y a direcciones o código paginable incorrectos.
  • WinDbg y Driver Verifier son claves: usa !analyze, !irql, ln, .trap, !pool, !address y examina parámetros 1, 3 y 4.
  • En darawallada, evita page faults a IRQL alto, usa memoria no paginada y spin locks; en usuario, actualiza/aisla drivers problemáticos.

irq

Si alguna vez te ha saltado una pantalla azul con mensajes tipo IRQL_NOT_LESS_OR_EQUAL o DRIVER_IRQL_NOT_LESS_OR_EQUAL, seguramente te habrás topado con un concepto poco conocido fuera del mundo de los drivers: el IRQL (Interrupt Request Level). En Windows, este nivel de prioridad de interrupciones manda más que la prioridad de los hilos cuando el sistema está por encima de cierto umbral, y eso tiene consecuencias directas en estabilidad.

Sadarka xiga waxaad ka heli doontaa una hage dhameystiran y en español de España sobre qué es el IRQL, cómo funciona, por qué dispara pantallas azules, cómo diagnosticar el problema con WinDbg y qué hacer tanto si eres usuario que sufre el fallo como si desarrollas drivers en modo kernel. Vamos al lío.

¿Qué es el IRQL (Interrupt Request Level) en Windows?

Daaqadaha, the IRQL define la prioridad de hardware a la que opera un procesador en un instante dado. Dentro del Windows Driver Model (WDM), el código que está ejecutándose a un IRQL bajo puede ser interrumpido por código que corre a un IRQL más alto. De hecho, en un mismo equipo con varios núcleos, cada CPU puede estar en un IRQL distinto, lo que complica la sincronización.

Existe una regla clave: cuando una CPU ejecuta a un IRQL por encima de PASSIVE_LEVEL, sólo puede ser preemptada por actividad a un IRQL todavía mayor. Esto organiza la convivencia entre código de usuario, funciones del kernel, llamadas diferidas (DPC) y rutinas de servicio de interrupciones (ISR) de dispositivos.

Khaladka 0x0000000A
Maqaalka laxiriira:
Khaladka 0x0000000a (Shaashada Buluugga ah ee Dhimashada). 6 Xalka

Niveles y prioridades: PASSIVE_LEVEL, APC_LEVEL, DISPATCH_LEVEL y DIRQL

Guud ahaan, en x86 se usan valores de IRQL entre 0 y 31; en x64, entre 0 y 15. El significado práctico es el mismo: IRQL 0 (PASSIVE_LEVEL) es donde se ejecuta el código normal de usuario y muchas funciones de driver; APC y fallos de página suelen mapearse a IRQL 1 (APC_LEVEL); IRQL 2 (DISPATCH_LEVEL) engloba el planificador de hilos y las DPC. Por encima de DISPATCH_LEVEL hay niveles reservados para interrupciones de dispositivos (conocidos como DIRQL) y otros usos internos como HIGH_LEVEL.

En el ecosistema de drivers, muchas rutinas comunes corren a DISPATCH_LEVEL: por ejemplo, DPC y StartIo. Ese diseño garantiza que, mientras una de ellas está tocando colas internas u otros recursos compartidos, otra rutina al mismo nivel no la preempta en esa CPU, porque la regla de preempción sólo permite interrumpir por niveles más altos.

Entre DISPATCH_LEVEL y los niveles de perfilado/alto hay hueco para las interrupciones de hardware de cada dispositivo (DIRQL). El IRQL de un dispositivo define su prioridad frente a otros dispositivos. Un driver WDM obtiene ese DIRQL durante IRP_MJ_PNP con IRP_MN_START_DEVICE. Este IRQL de dispositivo no es un valor fijo global, sino el asociado a la línea de interrupción concreta.

IRQL frente a prioridad de hilo

Conviene no confundir conceptos: la prioridad de hilo decide cuándo el planificador preempta y cuál hilo ejecuta; el IRQL controla qué tipo de actividad puede ejecutar y qué interrupciones quedan enmascaradas. Por encima de DISPATCH_LEVEL no hay conmutación de hilos: lo que manda es el IRQL, no la prioridad de los hilos.

  Valve Fremont: Tilmaamaha Fasaxa ah iyo Tilmaamaha Muhiimka ah

IRQL y paginación: lo que no debes hacer

Un efecto inmediato de levantar IRQL es que el sistema no puede atender fallos de página. Regla de oro: código que ejecuta a DISPATCH_LEVEL o por encima no puede provocar page faults. En la práctica, esto implica que esas rutinas y los datos que tocan deben residir en memoria no paginada. Además, ciertos helpers del kernel restringen su uso según IRQL: por ejemplo, KeWaitForSingleObject sólo se puede invocar a DISPATCH_LEVEL si no vas a bloquear (timeout cero) y, para timeouts no nulos, hace falta estar por debajo de DISPATCH_LEVEL.

Control implícito y explícito del IRQL

La mayor parte del tiempo, el propio sistema invoca tus rutinas al IRQL correcto para lo que deben hacer. Las dispatch routines para IRP llegan a PASSIVE_LEVEL (pueden bloquear o llamar a cualquier helper), StartIo y DPC corren a DISPATCH_LEVEL para proteger colas compartidas, y las ISR se ejecutan a DIRQL.

Si necesitas controlarlo de forma explícita, puedes subir y bajar el IRQL con KeRaiseIrql y KeLowerIrql. Hay un atajo muy usado: KeRaiseIrqlToDpcLevel() devuelve el IRQL anterior y te deja en DISPATCH_LEVEL. Importante: nunca bajes IRQL por debajo del valor que tenías cuando te llamó el sistema; romper esa sincronía puede abrir ventanas de carrera muy serias.

Errores de pantalla azul ligados a IRQL: IRQL_NOT_LESS_OR_EQUAL y DRIVER_IRQL_NOT_LESS_OR_EQUAL

irql

Dos bug checks clásicos asociados a estos temas son IRQL_NOT_LESS_OR_EQUAL (0xA) y DRIVER_IRQL_NOT_LESS_OR_EQUAL (0xD1). Ambos indican que se intentó acceder a una dirección paginable (o inválida) a un IRQL demasiado alto. Suele deberse a controladores que usan direcciones incorrectas, desreferencian punteros malos o ejecutan código paginable en niveles inadecuados.

Xaaladda gaarka ah ee DRIVER_IRQL_NOT_LESS_AMA_EQUAL (0x000000D1), los parámetros son muy informativos: 1) dirección de memoria referenciada; 2) IRQL en ese momento; 3) tipo de acceso (0 lectura, 1 escritura, 2/8 ejecución); 4) dirección de la instrucción que referenció la memoria. Con el depurador puedes usar ln sobre el parámetro 4 para listar el símbolo más cercano y saber qué función estaba ejecutándose.

Causas habituales que conviene tener en mente

Más allá del código específico, hay patrones que se repiten. Desreferenciar un puntero inválido a DISPATCH_LEVEL o superior es una receta segura para el desastre. Acceder a datos paginables a ese nivel, o ejecutar código paginable (por ejemplo, una función marcada como paginable), también dispara el bug check.

Otros casos frecuentes incluyen llamar a una función en otro driver que ya fue descargado (puntero a función colgante), o invocar indirectamente mediante un puntero de función inválido. A menudo, si el sistema logra identificar un módulo, verás su nombre en la propia pantalla azul y también queda guardado en KiBugCheckDriver, la heli karo dx KiBugCheckDriver desde WinDbg.

Faahfaahin wax ku ool ah: en la mayoría de D1/A, el problema real no es el IRQL en sí, sino la dirección de memoria referenciada. Por eso los parámetros 1, 3 y 4 son oro para centrar el diagnóstico.

Diagnóstico con WinDbg: comandos útiles y lectura de parámetros

Para trabajar estos casos, WinDbg es la herramienta clave, y si la BSOD menciona ntoskrnl.exe ese dato orienta mucho sobre si el fallo es de subsistema kernel. Empieza por !analyze -v para obtener un resumen del bug check, el stack y, si hay suerte, el módulo implicado. Si el volcado incluye un marco de captura, .trap te sitúa en el contexto de CPU que falló.

ka amarada de pila como k, kb, kc, kd, kp, kP, kv te muestran distintos niveles de detalle del backtrace. Con ln sobre el parámetro 4 puedes saltar a la instrucción que referenció la memoria y obtener el símbolo cercano. Y si sospechas del nivel de prioridad en ejecución antes de la interrupción, !irql te muestra el IRQL guardado para el procesador objetivo (por ejemplo, DISPATCH_LEVEL).

  Sida loo xakameeyo shaashadda Android kaaga SCRCPY ee Windows

Para analizar la dirección del parámetro 1, !pool te dirá si pertenece a pool paginado; !address y !pte profundizan en el mapeo de memoria de esa zona. Puedes usar los comandos de visualización de memoria para inspeccionar el contenido al que se intentó acceder. Finalmente, u, ub, uu te permiten desensamblar alrededor de la dirección del parámetro 4.

Ha iloobin lm t n para listar módulos cargados y !memusage para el estado general de memoria. Si KiBugCheckDriver tiene algo, dx KiBugCheckDriver te devolverá el nombre del módulo Unicode: en un ejemplo típico se veía «Wdf01000.sys» como driver involucrado durante el bug check.

Herramientas del sistema: Driver Verifier, Visor de eventos y diagnósticos

El Xaqiijiye Darawalka examina en tiempo real el comportamiento de los drivers y fuerza errores cuando detecta usos incorrectos de recursos (como el pool), provocando una excepción para aislar la zona problemática del código. Se lanza con verifier ka amar degdeg ah y conviene seleccionar el menor conjunto de controladores posibles para no añadir demasiada sobrecarga.

Si no te ves con WinDbg, aplica medidas básicas: revisa el registro del sistema en el Visor de eventos buscando errores que apunten a un dispositivo/driver concreto; actualiza o deshabilita el controlador citado por la pantalla azul; verifica la compatibilidad del hardware con tu versión de Windows y usa el Diagnóstico de memoria de Windows si sospechas de RAM. Estas acciones, aunque sencillas, resuelven una gran cantidad de casos.

Casos reales: cuándo los BSOD parecen aleatorios

Un usuario con Windows 10 Pro (CPU AMD Ryzen 5 3400G, GPU NVIDIA GeForce GTX 1660 Ti y placa Gigabyte B450 AORUS PRO WIFI, 16 GB de RAM) sufría pantallazos «IRQL_LESS_OR_NOT_EQUAL» de forma intermitente. Ya había actualizado drivers esenciales (red, gráfica), instalado todas las actualizaciones de Windows y pasado la herramienta de memoria, sin detectar problemas.

En escenarios así, lo siguiente es analizar volcados con WinDbg y buscar patrones: procesos implicados cuando cae (por ejemplo, explorer.exe), módulos de interfaz gráfica (win32kfull.sys) iyo shaqooyin ay ka mid yihiin xxxProcessNotifyWinEvent apareciendo en el stack. Aunque ese módulo es de Windows, muchas veces el detonante es un tercer controlador (gráfica, input, superposición/overlay, capturadoras) que pisa memoria a un IRQL inadecuado y el fallo aflora dentro de win32k.

La recomendación práctica aquí es desactivar temporalmente software de overlay (captura, OSD de GPU), controladores de periféricos con software agresivo (ratones/teclados con macros) y versiones beta de drivers gráficos, e ir acotando. Driver Verifier sobre sospechosos puede ayudar a que el problema caiga con un stack más claro.

Un patrón muy común en red: ndis.sys no siempre es el culpable

Kiis kale oo caadi ah: pantallazo con ndis.sys (la capa de red de Windows). En un equipo real, el sistema caía nada más arrancar. La solución práctica fue iniciar en Qaab nabdoon sin funciones de red, abrir el Maareeyaha Aaladda y desactivar adaptadores bajo «Adaptadores de red» para aislar el problemático.

En ese equipo convivían un Realtek PCIe GBE Family Controller y un Atheros AR5007G. Desactivando uno y otro, se detectó que la causa real era el athrx.sys (Atheros), aunque la pantalla azul mencionara ndis.sys. El volcado así lo confirmaba: el stack pasaba por ndis!NdisFreeTimerObject pero el módulo culpable era athrx.sys. La corrección definitiva fue desinstalar el dispositivo y poner drivers oficiales actualizados desde el sitio del fabricante de Atheros. Moral: el módulo citado en la BSOD puede ser parte del subsistema que sufre las consecuencias, no el origen.

  Sida loo rakibo Arduino IDE Windows 11 talaabo talaabo

Respuesta típica de soporte y pasos rápidos para usuarios

En un intercambio genuino de soporte, un técnico contestaba: «Lamento el inconveniente, es posible un fallo de drivers, memoria o antivirus; actualiza drivers y, si se repite, ejecuta el diagnóstico de memoria». Es un consejo básico pero válido; no obstante, si los errores persisten, conviene ir más allá con Verifier y análisis de volcados.

Para usuarios no técnicos, un protocolo razonable sería: 1) revisar eventos del sistema, 2) actualizar controladores claves (chipset/red/gráfica), 3) comprobar RAM con la herramienta integrada, 4) probar kabaha limpio sin software de terceros que inserte hooks en kernel/GUI, y 5) usar Verifier sobre drivers de terceros si no aparece nada claro.

Buenas prácticas para desarrolladores de drivers

Si estás desarrollando y tropiezas con D1/A, verifica que la rutina en ejecución no esté marcada como paginable ni llame a funciones paginables mientras corre a DISPATCH_LEVEL o superior. Esto incluye evitar referencias a datos en secciones paginadas y respetar las restricciones de IRQL de los helpers del kernel descritas en el DDK.

Para sincronizar datos compartidos, aplica la regla «accede siempre a los datos compartidos al mismo IRQL elevado» y usa spin locks cuando corresponda. En multiprocesador, el IRQL por sí solo no garantiza exclusión entre CPUs distintas; los spin locks elevan IRQL (a DISPATCH_LEVEL) y coordinan acceso entre núcleos. Si necesitas operar sobre registros de hardware sensibles, KeSynchronizeExecution te ayuda a ejecutar secciones críticas al DIRQL adecuado.

Cuando el plan requiere elevar IRQL, USA KeRaiseIrqlToDpcLevel para DISPATCH_LEVEL o KeRaiseIrql si taxaddar leh, guardando el IRQL anterior y restaurándolo exactamente con KeLowerIrql. Bajar por debajo del IRQL de entrada, aunque sea «un instante», es un error grave de sincronización.

Relación con interrupciones y el hardware

IRQL es el mecanismo con el que Windows ordena las prioridades de interrupción y ciertas tareas internas. A nivel de arquitectura, se relaciona con conceptos como «Interrupt», «Interrupt handler» o «Interrupt priority level» y, en plataformas clásicas, con el Xakamaynta Joojinta Barnaamijyada (PIC). En otros sistemas, el control de prioridades se expresa vía mecanismos como spl en Unix; la idea general es la misma: quién puede interrumpir a quién.

Consejos avanzados de depuración

En dumps donde el stack apunta a win32kfull!xxxProcessNotifyWinEvent con bug check 0xA/0xD1, inspecciona contexto con .process y .thread (si están disponibles), mira procesos como explorer.exe en !process 0 1 y comprueba overlays y drivers de interacción con la GUI. Muchas veces el problema es memoria corrompida por un tercero que aflora en esa ruta.

No olvides verificar el IRQL con !irql, y contrastar: si estás en DISPATCH_LEVEL (2) y el parámetro 3 indica lectura/escritura/ejecución sobre una página paginable, ya tienes una pista de por qué ha caído. Cruza esa pista con ln en el parámetro 4 para obtener la función concreta.

Faham qué es el IRQL y cómo encaja en la ejecución del kernel ayuda a separar el ruido de las señales. Si eres usuario, céntrate en drivers y hardware (con Verifier, eventos y pruebas por descarte). Si desarrollas, respeta a rajatabla las reglas de IRQL, memoria no paginada y sincronización con spin locks. Con las herramientas adecuadas (WinDbg, Verifier) y una lectura cuidadosa de parámetros (1, 3 y 4), estos bug checks dejan de ser un misterio y pasan a ser problemas abordables con método.