我一直试图想这个很长一段时间,而且我没有到达任何地方。
以下是我要做的事情: 如果IDTR中包含的值为0x3A000,则保护模式下的物理地址是中断向量编号3吗?
我想找到一个公式,它可以帮助我计算中断向量#3偏移量的每个字节的物理地址,以及中断向量#3段的每个字节的物理地址。
我一直在寻找互联网,并且没有可靠的解释IDTR如何计算这个,我真的很好奇。
我也很好奇如何为真实模式找到相同的物理地址......
如果有人可以帮我找到解决这类问题的通用公式,那将是一个爆炸!
答案 0 :(得分:5)
我找到了答案。 Tnx to Jester&链接。 :d
这是一个显示IDTR(中断描述符表寄存器)和IDT(中断描述符表)之间关系的图像。 (参考:英特尔手册):
这里还有一个pricture,显示IDT中的条目如何(参考:英特尔的手册):
IDT(中断描述表)的基地址(IDT启动的地址)由位16至47,16和47给出。要获取向量#3的地址,必须将前两个条目的大小添加到基址。要找到偏移位和段选择器所在的地址,需要找到向量的地址,然后根据第二个图片添加字节,这样就可以在IDT的一个条目内移动。
“IDT的基址应该在8字节边界上对齐,以最大化缓存行的性能 罢了。限制值以字节表示,并添加到基址以获取最后一个有效字节的地址。 限制值0导致恰好1个有效字节。因为IDT条目总是八个字节长,所以限制应该 总是小于八的整数倍(即8N - 1)。 IDT可以驻留在线性地址空间中的任何位置。如图6-1所示,处理器定位IDT 使用IDTR寄存器。该寄存器保存了IDT的32位基址和16位限制。“ - (参考:英特尔手册)
因此,应该按照手册中的说法调整表格以获得更好的性能。 出于教育目的,我将解释当IDTR包含3A000h时如何找到偏移字节的物理地址和段字节。
步骤:
首先,我将以二进制格式编写3A000h,以便更容易理解使用图片的数字。
因此3A000h变为:0000 0000 0000 0000 0000 0000 0000 0011 1010 0000 0000 0000 注意:它是一个48位数字,因为IDTR长48位。
基地址是从第16位开始到第47位结束的数字。所以:
基地址= 0000 0000 0000 0000 0000 0000 0000 0011 那是3小时。
所以第一个条目是物理地址3。
要获得第三个条目,请在其前面添加2个条目的大小,以便第三个条目的地址为:
3 + 2×8 = 19 = 13小时
2个条目乘以8,因为一个条目长度为8个字节。
现在要获取偏移字节的物理地址,我们只需要查看图6.2并看到条目如下所示:
所以从图片中读取
段选择器的物理地址是:
19 + 2和19 + 2 + 1
或
13h + 2h和13h + 2h + 1h
偏移字节的物理地址是(假设它是中断或陷阱门): 19,19 + 1,19 + 6,19 + 7
或
13h,13h + 1,13h + 6h,13h + 7h解决此类问题的一般程序:
BaseAddress = IDTR /(2 ^ 16) - >整数分部
限制= IDTR%(2 ^ 16)
VectorPhysicalAddress = BaseAddress +(VectorNumber-1)* 8
段选择器字节的物理地址是:VectorPhysicalAddress + 2和VectorPhysicalAddress + 3
偏移字节的物理地址是:VectorPhysicalAddress,VectorPhyscialAddress + 1,VectorPhysicalAddress + 6,VectorPhysicalAddress + 7
答案 1 :(得分:0)
我有点困惑为什么你没有阅读英特尔手册而不是“环顾互联网”。当然,也manuals are available on the internet说。
如果您想阅读Intel®64和IA-32架构软件开发人员手册第3A卷:系统编程指南,第1部分中的 6.10中断描述符表(IDT) 您将看到IDTR包含线性基址(位16-47)和限制(位0-15)。另请注意,手册中说限制应始终小于8 的整数倍,因此,0x3a000
的示例无效(3
不是特别明智的基地址。要获取物理地址,必须通过正常的分页机制(如果已启用)。每个中断的处理程序由表中的8字节描述符定义。有关详细信息,请参阅手册。
在实模式下,中断向量是从物理地址0开始的4字节远指针。