我正在开发一个对启动时间有严格要求的项目。目标架构是在 32 位保护模式下运行的基于 IA-32 的处理器。确定可以改进的领域之一是当前系统动态初始化处理器的 IDT(中断描述符表)。由于我们没有任何即插即用的设备并且系统是相对静态的,我希望能够使用静态构建的 IDT。
然而,这对于 IA-32 架构来说是很麻烦的,因为 8 字节的中断门描述符拆分了 ISR 地址。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)},
等等
显然这不起作用,因为在 C 中这样做是非法的,因为 myIsr 不是常量。它的值由链接器解析(它只能做有限的数学运算)而不是编译器。
关于如何做到这一点的任何建议或其他想法?
谢谢,