我是操作系统新手,IDT 的大小是多少?

I am new to operating system, What is size of IDT?

需要6个字节来存储中断门描述符,每个描述符由32位段选择符和16位偏移量组成。中断描述符的字节大小是多少 Table?

通常,您有 256 个条目(因为每个 CPU 只有 256 个可能的中断);因此,如果一个条目是 8 个字节(保护模式),则 IDT 限制将是 2047(在长模式下是 4095,因为条目是 16 个字节)。

但是:

  • 对于古老的计算机(单CPU,无IO APICs)你只需要48个条目(32个异常条目加上16个PIC芯片IRQ条目)

  • for "unusual situations" (e.g. temporary boot code) 你可以作弊(当 IDT 条目没有 exist/was超出IDT的限制);并获得 14 个 IDT 条目(足以应对一般保护故障,仅此而已)。

  • 理论上,您可以动态调整 IDT 的大小(例如,从足够 space 开始 256 个条目,但只为 48 个条目分配 RAM,然后自动检测硬件功能和通过分配更多 RAM 和调整 IDT 限制来增加 IDT 的大小)。这基本上不值得麻烦(例如,调整 IDT 大小的额外代码可能会花费您比节省更多的 RAM)

请注意,对于大型服务器,为不同的 NUMA 域或不同的 CPU 使用不同的 IDT 是有意义的;以避免 "maximum of 256-32-some IRQs from devices per computer" 限制(并获得 "maximum of 256-32-some IRQs from devices per NUMA domain or per CPU" 限制)。不要忘记每个支持 MSI 的 PCI 设备(理论上)都需要一组最多 16 个 IRQ;因此,当有 14 个或更多 PCI 设备时,"about 220 IRQs maybe" 的全局限制(理论上)会成为一个问题(对于 finding/allocating 免费 IDT 条目);并且由于中断优先级的工作方式(对于 APICs),单个全局 IDT(理论上)可以开始 "less than ideal" 少至 2 个 PCI 设备(例如,如果它们都需要 16 个中断并且两者 "need" 相同的中断优先级)。实际上,不太可能所有 PCI 设备都需要这么多中断,因此 "in practice" 不如 "in theory".

注意:"maximum of 256-32-some IRQs" 来自最多 256 个 IDT 条目,减去 32 个异常条目,减去一些杂项条目(用于处理器间中断、虚假 IRQ 和内核 API 如果它使用软件中断)。