Dee*_*oor 1 x86 interrupt osdev
需要6个字节来存储中断门描述符,每个描述符由32位段选择器和16位偏移量组成。中断描述符表的大小(以字节为单位)是多少?
通常,您有 256 个条目(因为每个 CPU 仅有 256 个可能的中断);因此,如果条目为 8 字节(保护模式),则 IDT 限制将为 2047(长模式下为 4095,因为条目为 16 字节)。
然而:
对于古代计算机(单CPU,无IO APIC),您只需要48个条目(32个异常条目加上16个PIC芯片IRQ条目)
对于“异常情况”(例如临时启动代码),您可以作弊(当IDT条目不存在/超出IDT限制时,使用一般保护故障异常的错误代码来确定中断/IRQ号);并通过 14 个 IDT 条目(足以应对一般保护故障,仅此而已)。
理论上,您可以动态调整IDT的大小(例如,开始时有足够的空间容纳256个条目,但只为48个条目分配RAM,然后自动检测硬件功能并通过分配更多RAM和调整IDT限制来增加IDT的大小) 。这通常不值得这么麻烦(例如,调整 IDT 大小的附加代码可能会花费您比节省的更多的 RAM)
请注意,对于大型服务器,针对不同的 NUMA 域或不同的 CPU 使用不同的 IDT 是有意义的;以避免“每台计算机的设备最多 256-32 个 IRQ”限制(并获得“每个 NUMA 域或每个 CPU 的设备最多 256-32 个 IRQ”限制)。不要忘记,每个支持 MSI 的 PCI 设备(理论上)可以需要一组最多 16 个 IRQ;因此,当有 14 个或更多 PCI 设备时,“大约 220 个 IRQ”的全局限制(理论上)可能会成为一个问题(用于查找/分配空闲 IDT 条目);由于中断优先级的工作方式(对于 APIC),单个全局 IDT 可以(理论上)开始“不太理想”,只需 2 个 PCI 设备(例如,如果它们都想要 16 个中断并且都“需要”相同的中断优先级)。实际上,所有 PCI 设备不太可能需要这么多中断,因此“实际上”并不像“理论上”那么糟糕。
注意:“最大 256-32 个 IRQ”来自最多 256 个 IDT 条目,减去 32 个异常条目,再减去一些杂项条目(用于处理器间中断、虚假 IRQ,如果使用软件中断,可能还包括内核 API) )。
归档时间: |
|
查看次数: |
878 次 |
最近记录: |