Pracuję nad projektem, który ma napięte wymagania dotyczące czasu rozruchu. Docelową architekturą jest procesor oparty na IA-32 działający w 32-bitowym trybie chronionym. Jednym z zidentyfikowanych obszarów, które można ulepszyć, jest to, że obecny system dynamicznie inicjuje IDT procesora (tabela deskryptorów przerwań). Ponieważ nie mamy żadnych urządzeń typu "plug-and-play", a system jest stosunkowo statyczny, chcę móc używać statycznie zbudowanego IDT.Statycznie zdefiniowany IDT
Jednak to okazało się kłopotliwe dla łuku IA-32, ponieważ 8-bajtowe deskryptory bramek podziału dzieli adres ISR. Niskie 16 bitów ISR pojawia się w pierwszych 2 bajtach deskryptora, inne bity wypełniają kolejne 4 bajty, a na końcu ostatnie 16 bitów ISR pojawia się w ostatnich 2 bajtach.
chciałem użyć const tablicy do określenia IDT, a następnie po prostu wskazać rejestr IDT na to tak:
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)},
itp
Oczywiście to nie będzie działać, ponieważ jest to niezgodne z prawem zrobić to w C, ponieważ myIsr nie jest stały. Jego wartość jest rozwiązywana przez linker (który może wykonać tylko ograniczoną ilość matematyki), a nie przez kompilator.
Wszelkie zalecenia lub inne pomysły, jak to zrobić?
Dzięki,
Moja sugestia polegałaby na upewnieniu się, że IDT i ISR znajdują się w tym samym module (i oczywiście, że ISR jest załadowany w stałej pozycji), a następnie używają etykiet. Próbowałem to zrobić z GCC, ale nie lubiłem używać składni '&& myIsr0' poza funkcją i nie posiadałem wbudowanych umiejętności składania, aby zadeklarować IDT używając składni" __asm__ ". Najprawdopodobniej skompilowałbym ten jeden moduł przy użyciu NASM (osobiste preferencje), a ISR-y są wywoływaniem skrótów do funkcji C. To byłaby moja sugestia, chociaż zdecydowanie nie mogę twierdzić, że jestem ekspertem :) – Justin
Oto rodzaj denerwującej sugestii, którą dałbym: użyj zestawu. Podczas korzystania z bardzo specyficznych funkcji procesora lub konstruktów o bardzo niskim poziomie, wywołaj niektóre podzespoły. To ułatwia. – Linuxios
To nie jest moja mocna strona; Czy ktoś może mi krótko wyjaśnić lub wskazać, dlaczego jest to nielegalne? – taz