¿Por qué menos IRQL en 64 bits, aunque un APIC tiene más líneas de interrupción?

7

A medida que las computadoras x86 pasaron de 32 bits a 64 bits, también cambiaron de usar los Controladores de Interrupción Programables estilo 8259 con 8 líneas de interrupción. (O dos PIC multiplexados para un total de 15 líneas de interrupción). Luego, si tuviera que instalar Windows de 32 bits para un sistema operativo, Windows implementaría 32 IRQL de software (niveles de solicitud de interrupción) con IRQL de 3 a 26 (o así) siendo reservado para dispositivos.

Luego vino la plataforma x64. Necesita una máquina con un APIC, que tiene 256 líneas de interrupción, para instalar Windows de 64 bits en él. Sin embargo, Windows de 64 bits solo implementa 16 IRQL.

Entonces, mi pregunta es, ¿alguien sabe por qué Windows de 64 bits implementaría menos IRQL que su contraparte de 32 bits a pesar de que tiene muchas más líneas de interrupción de hardware a su disposición?

    
pregunta Ryan Ries 07.08.2012 - 18:09

3 respuestas

1

Debido a que con un sistema de tipo DOS, en general necesitaba una IRQ para cada evento y, por lo tanto, muchos niveles de IRQ para permitir que los eventos enmascaren otros eventos de manera simple. Con un sistema operativo real, prácticamente solo necesitas un evento único y dejar que el kernel resuelva todo lo demás (en realidad es conveniente tener un par de niveles para NMI y en tiempo real).

Así que supongo que con 64 bits y sabiendo que no es compatible con versiones anteriores que admiten alguna aplicación DOS en un 386, aprovecharon la oportunidad para simplificar.

    
respondido por el Martin Beckett 07.08.2012 - 19:47
0

Solo quiero agregar un par de puntos más sobre las interrupciones en un sistema moderno. Intentaré que el diseño sea más claro.

La tabla del descriptor de interrupción (IDT) es el reemplazo del modo protegido para la tabla de vectores de interrupción (IVT). La dirección base para el IDT se almacena en un registro de CPU y se puede ubicar en casi cualquier lugar de la memoria.

Puede ver el contenido del IDT si tiene el depurador del kernel utilizando el botón! comando idt. Además de los 32 controladores de excepciones impares y algunos dispositivos heredados, no encontrará mucho en el IDT moderno. Intentaré explicar por qué más adelante.

Cada interrupción hace que la CPU ingrese al modo kernel, por lo que el código del modo kernel puede manejarlos.

El nivel de solicitud de interrupción (IRQL) cero no es realmente un nivel, ya que todas las interrupciones están permitidas. El código de modo de usuario generalmente se ejecuta en cero IRQL.

El kernel y los controladores utilizan interrupciones de software para emitir llamadas a procedimiento diferido (DPC), subprocesos de sheduleing y llamadas a procedimiento asíncrono (APC). DPC / thread dispatch se realiza en IRQL dos y APC en el nivel uno.

El kernel y los controladores siempre intentan mantener el IRQL lo más bajo posible. En estos días, las rutinas de servicio de interrupción del conductor a menudo hacen poco más que conocer la interrupción antes de llamar a un DPC para realizar cualquier transferencia de datos. De esta manera, el IRQL se puede eliminar del nivel del dispositivo lo más rápido posible.

Lo siento, dije que explicaría la falta de entradas de IDT, pero tengo que salir. Mensaje señalado como interrupciones, MSI-X y x2 APIC local son la causa. Si alguien está interesado por favor pregunte

respondido por el Wheels-of-Fire 06.07.2017 - 10:30
-2

Me temo que es un poco más complicado. Todavía no he llegado al fondo, pero voy a decir lo que sé. Windows mantiene una nota del uso de IRQL para CADA CPU lógica en lo que llama un bloque de control del procesador que es solo una estructura de datos y no cualquier tipo de registro. También hay una tabla de descriptor de interrupciones con 256 entradas que apuntan eventualmente a interrumpir las rutinas de servicio. Digo eventualmente porque primero pasamos por un objeto de interrupción que mantiene una nota de las interrupciones asignadas a IRQL y también del despachador de interrupciones. Las CPUs de 32 bits X86 no tenían ninguna noción de IRQL como tal, pero los diseñadores de Windows decidieron que tendrían 32 de ellos. El IRQL de un dispositivo se decidió tomando su número de vector y dividiéndolo por 16. Recuerde que el número de vector no es el mismo que el número de pin de IRQ (cualquier pin puede tener cualquier vector entre 32 y 255 porque los primeros 32 vectores están reservados para excepciones). Para hacer que esto funcione, Windows tiene que programar el chip PIC para enmascarar los pines de interrupción que están por debajo del nivel que ha registrado para la CPU. Esto cambió con X64 porque a la CPU se le asignó un registro específico del modelo que realmente establece la CPU en un IRQL entre 0 y 15. Los diseñadores de Windows han hecho uso de esto para simplificar las cosas.

    
respondido por el Wheels-of-Fire 06.07.2017 - 00:45

Lea otras preguntas en las etiquetas