我无法理解这张图解释了Intel X86-64处理器中IDTR的含义。
IDT基地址的大小为64,我完全明白这一点,因为它可以几乎出现在内存的任何位置。
但是,为什么IDT限制为16位?我们为什么需要所有这些位?
每个向量的大小为16,并且有256个向量,因此我需要表示的最大加法是16*256 = 4096,可以用12位而不是16位进行表示。
我无法理解这张图解释了Intel X86-64处理器中IDTR的含义。
IDT基地址的大小为64,我完全明白这一点,因为它可以几乎出现在内存的任何位置。
但是,为什么IDT限制为16位?我们为什么需要所有这些位?
每个向量的大小为16,并且有256个向量,因此我需要表示的最大加法是16*256 = 4096,可以用12位而不是16位进行表示。
lidt
会加载一个32位的基地址和16位的限制值。
我认为使用16位限制有两个原因,即使12位就足够了:
1. lidt
采用与lgdt
相同格式的基地址/限制对(实际上这两个指令在Intel手册的同一页上有详细说明)。而lgdt
确实需要16位限制,因为全局描述符表可以高达64 Kbytes,相当于8K个每个8字节的条目(同样适用于32位机器)。这个数字显然是选择使用16位选择器,对应于8086的16位段寄存器,作为GDT的字节索引,同时屏蔽掉其低3位,这些位用于在LDT / GDT之间选择并指定请求者特权级别。
使用相同的格式来处理这两个指令可能允许它们共享微码,稍微降低了80386的成本和复杂性。
2. 由于最小的可寻址单元是字节,因此保存4位是相当无意义的,因为没有简单的方法将半个字节用于其他用途。我想Intel可以说限制字段的高4位是保留的,并且可能在以后的CPU中考虑了一些其他用途(例如启用新的中断处理功能),但是,他们没有这样做。