Ich arbeite an einem Projekt mit engen Boot-Zeitanforderungen. Die Zielarchitektur ist ein IA-32-basierter Prozessor, der im 32-Bit-geschützten Modus läuft. Einer der identifizierten Bereiche, der verbessert werden kann, besteht darin, dass das aktuelle System die IDT (Interrupt-Deskriptor-Tabelle) des Prozessors dynamisch initialisiert. Da wir keine Plug-and-Play-Geräte haben und das System relativ statisch ist, möchte ich ein statisch aufgebautes IDT verwenden können.Statisch definiert IDT
Dies erweist sich jedoch als problematisch für den IA-32-Arch, da die 8-Byte-Interrupt-Gate-Deskriptoren die ISR-Adresse aufteilen. Die niedrigen 16 Bits des ISR erscheinen in den ersten 2 Bytes des Deskriptors, einige andere Bits füllen die nächsten 4 Bytes aus und dann erscheinen schließlich die letzten 16 Bits des ISR in den letzten 2 Bytes.
Ich wollte einen const-Array verwenden, um den IDT und dann einfach zeige das IDT-Register an, sie zu definieren, wie so:
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)},
usw.
Offensichtlich wird dies nicht funktionieren, da es illegal ist, um dies in C zu tun, weil myIsr nicht konstant ist. Sein Wert wird durch den Linker (der nur eine begrenzte Menge an Mathe ausführen kann) und nicht durch den Compiler aufgelöst.
Alle Empfehlungen oder andere Ideen, wie dies zu tun?
Danke,
Mein Vorschlag wäre, sicherzustellen, dass Ihre IDT und ISRs im selben Modul sind (und natürlich, dass der ISR an einer festen Position geladen wird) und dann Etiketten verwenden. Ich habe versucht, dies mit GCC zu tun, aber es nicht wie mit der '&& myIsr0' Syntax außerhalb einer Funktion und ich habe nicht die Inline-Assembler-Fähigkeiten, um die IDT mit' __asm__' Syntax zu erklären. Ich würde wahrscheinlich nur dieses eine Modul mit NASM (persönliche Präferenz) kompilieren, wobei die ISRs Stub-Aufrufe an C-Funktionen sind. Das wäre mein Vorschlag, obwohl ich kann auf jeden Fall nicht behaupten, ein Experte zu sein :) – Justin
Hier ist eine Art ärgerlich Vorschlag, den ich geben würde: Verwendung Montag. Wenn Sie sehr spezifische Prozessor-Features oder extrem niedrige Level-Konstrukte verwenden, rufen Sie eine Assembly auf. Es macht es einfacher. – Linuxios
Das ist nicht meine Stärke; Kann mir jemand kurz erklären oder wieso das illegal ist? – taz