起動時間の要件が厳しいプロジェクトに取り組んでいます。対象となるアーキテクチャは、32ビットプロテクトモードで動作するIA-32ベースのプロセッサです。改善できると特定された領域の1つは、現在のシステムがプロセッサのIDT(割り込み記述子テーブル)を動的に初期化することです。プラグアンドプレイデバイスがなく、システムが比較的静的であるため、静的に構築されたIDTを使用できるようにしたいと思います。
ただし、8バイトの割り込みゲート記述子がISRアドレスを分割するため、これはIA-32アーチにとって厄介であることがわかります。ISRの下位16ビットは記述子の最初の2バイトに表示され、他のいくつかのビットは次の4バイトを埋め、最後にISRの最後の16ビットが最後の2バイトに表示されます。
const配列を使用してIDTを定義し、IDTレジスタを次のようにポイントするだけです。
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)},
等
myIsrは一定ではないため、Cでこれを行うことは違法であるため、明らかにこれは機能しません。その値は、コンパイラではなく、リンカ(限られた量の計算しか実行できない)によって解決されます。
これを行う方法に関する推奨事項やその他のアイデアはありますか?
ありがとう、