Estoy trabajando en un proyecto que tiene requisitos estrictos de tiempo de arranque. La arquitectura de destino es un procesador basado en IA-32 que se ejecuta en modo protegido de 32 bits. Una de las áreas identificadas que se puede mejorar es que el sistema actual inicializa dinámicamente el IDT del procesador (tabla de descriptores de interrupción). Como no tenemos ningún dispositivo plug-and-play y el sistema es relativamente estático, quiero poder usar un IDT construido estáticamente.IDT estáticamente definido IDT
Sin embargo, esto demuestra ser problemático para el arco IA-32 ya que los descriptores de puerta de interrupción de 8 bytes dividen la dirección ISR. Los 16 bits bajos del ISR aparecen en los primeros 2 bytes del descriptor, otros bits se completan en los siguientes 4 bytes y, finalmente, los últimos 16 bits del ISR aparecen en los últimos 2 bytes.
que quería utilizar una matriz const para definir el IDT y luego simplemente apunte el registro de IDT en ello de esta manera:
typedef struct s_myIdt {
unsigned short isrLobits;
unsigned short segSelector;
unsigned short otherBits;
unsigned short isrHibits;
} myIdtStruct;
myIdtStruct myIdt[256] = {
{ (unsigned short)myIsr0, 1, 2, (unsigned short)(myIsr0 >> 16)},
{ (unsigned short)myIsr1, 1, 2, (unsigned short)(myIsr1 >> 16)},
etc.
Obviamente esto no funcionará, ya que es ilegal hacer esto en C porque myIsr no es constante. Su valor es resuelto por el vinculador (que puede hacer solo una cantidad limitada de matemática) y no por el compilador.
¿Alguna recomendación u otra idea sobre cómo hacer esto?
Gracias,
Mi sugerencia sería asegurarme de que su IDT e ISR están en el mismo módulo (y obviamente que el ISR está cargado en una posición fija) y luego use etiquetas. Intenté hacer esto con GCC pero no me gustó usar la sintaxis '&& myIsr0' fuera de una función y no tengo las habilidades de ensamblaje en línea para declarar el IDT usando la sintaxis' __asm__'. Probablemente solo compile este módulo usando NASM (preferencia personal) con los ISR como stub calls para las funciones C. Esa sería mi sugerencia, aunque definitivamente no puedo decir que soy un experto :) – Justin
Aquí hay un tipo de sugerencia molesta que le doy: use assembly. Cuando utilice funciones de procesador muy específicas o construcciones de nivel extremadamente bajo, llame a algún ensamblaje. Lo hace más fácil. – Linuxios
Este no es mi fuerte; ¿alguien puede explicarme brevemente o señalarme por qué esto es ilegal? – taz