Sto lavorando a un progetto che ha requisiti di avvio rigidi. L'architettura mirata è un processore basato su IA-32 in esecuzione in modalità protetta a 32 bit. Una delle aree identificate che possono essere migliorate è che il sistema corrente inizializza dinamicamente l'IDT del processore (tabella dei descrittori degli interrupt). Dal momento che non abbiamo alcun dispositivo plug-and-play e il sistema è relativamente statico, voglio poter usare un IDT costruito staticamente.IDT definito staticamente
Tuttavia, questo risulta essere problematico per l'arco IA-32 poiché i descrittori del gate di interruzione a 8 byte suddividono l'indirizzo ISR. I 16 bit bassi dell'ISR appaiono nei primi 2 byte del descrittore, altri bit riempiono i successivi 4 byte e infine gli ultimi 16 bit dell'ISR appaiono negli ultimi 2 byte.
ho voluto utilizzare un array const per definire l'IDT e poi semplicemente puntare registro IDT in questo modo:
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)},
ecc
Ovviamente questo non funziona come è illegale per fare ciò in C perché myIsr non è costante. Il suo valore è risolto dal linker (che può fare solo un numero limitato di calcoli matematici) e non dal compilatore.
Eventuali raccomandazioni o altre idee su come farlo?
Grazie,
Il mio suggerimento sarebbe quello di assicurarsi che i vostri IDT e ISR siano nello stesso modulo (e ovviamente che l'ISR sia caricato in una posizione fissa) e quindi utilizzare le etichette. Ho provato a farlo con GCC, ma non mi piace usare la sintassi '&& myIsr0' al di fuori di una funzione e non ho le abilità di assemblaggio inline per dichiarare l'IDT usando la sintassi' __asm__'. Probabilmente mi piacerebbe semplicemente compilare questo modulo usando NASM (preferenza personale) con gli ISR che sono chiamate stub alle funzioni C. Questo sarebbe il mio suggerimento, anche se non posso assolutamente affermare di essere un esperto :) – Justin
Ecco una sorta di suggerimento fastidioso che vorrei dare: usare l'assemblaggio. Quando si utilizzano caratteristiche del processore molto specifiche o costrutti di livello estremamente basso, chiamare in alcuni assembly. Lo rende più facile. – Linuxios
Questo non è il mio forte; qualcuno può spiegarmi brevemente o indicarmi perché è illegale? – taz