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

Cod*_*kie 1 assembly cpu-registers memory-segmentation

我一直在努力想象这个很长一段时间,而且我没有到达任何地方.

这是我正在尝试做的事情:如果IDTR中包含的值是0x3A000,那么在保护模式下的物理地址是中断向量3的位置?

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

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

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

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

Cod*_*kie 5

我找到了答案.Tnx到Jester和链接.:d

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

在此输入图像描述

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

在此输入图像描述

IDT(中断描述表)的基地址(IDT启动的地址)由位16至47,16和47给出.要获取向量#3的地址,必须将前两个条目的大小添加到基址.为了找到偏移位和段选择器所在的地址,需要找到向量的地址,然后根据第二个图像添加字节,这样就可以在IDT的一个条目内移动.

"IDT的基址应该在8字节边界上对齐,以最大限度地提高缓存行填充的性能.限制值以字节表示,并添加到基址以获取最后一个有效字节的地址. 0的值恰好是1个有效字节.因为IDT条目总是8个字节长,所以限制应该总是小于8的整数倍(即8N - 1).IDT可以驻留在线性地址的任何地方.如图6-1所示,处理器使用IDTR寄存器定位IDT.该寄存器保存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,即3h.

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

要获得第三个条目,需要在它之前添加2个条目的大小,以便第三个条目的地址为:

3 + 2×8 = 19 = 13H

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