手动确定物理地址(IDTR寄存器)

时间:2013-01-27 19:43:01

标签: assembly cpu-registers memory-segmentation

我一直试图想这个很长一段时间,而且我没有到达任何地方。

以下是我要做的事情: 如果IDTR中包含的值为0x3A000,则保护模式下的物理地址是中断向量编号3吗?

我想找到一个公式,它可以帮助我计算中断向量#3偏移量的每个字节的物理地址,以及中断向量#3段的每个字节的物理地址。

我一直在寻找互联网,并且没有可靠的解释IDTR如何计算这个,我真的很好奇。

我也很好奇如何为真实模式找到相同的物理地址......

如果有人可以帮我找到解决这类问题的通用公式,那将是一个爆炸!

2 个答案:

答案 0 :(得分:5)

我找到了答案。 Tnx to Jester&链接。 :d

这是一个显示IDTR(中断描述符表寄存器)和IDT(中断描述符表)之间关系的图像。 (参考:英特尔手册):

enter image description here

这里还有一个pricture,显示IDT中的条目如何(参考:英特尔的手册):

enter image description here

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位结束的数字。所以:

enter image description here

基地址= 0000 0000 0000 0000 0000 0000 0000 0011 那是3小时。

所以第一个条目是物理地址3。

要获得第三个条目,请在其前面添加2个条目的大小,以便第三个条目的地址为:

3 + 2×8 = 19 = 13小时

2个条目乘以8,因为一个条目长度为8个字节。

现在要获取偏移字节的物理地址,我们只需要查看图6.2并看到条目如下所示:

enter image description here

所以从图片中读取

段选择器的物理地址是:

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字节远指针。