结构偏移误差

时间:2014-10-08 23:01:20

标签: assembly kernel intel

我正在尝试在QEMU中启动自定义内核。由于计算地址跳转到处理中断时出错,因此在中断启用后可怕地崩溃。

我有一些汇编代码可以从偏移in a C structure中检索值。具体来说,我正在尝试获取字段trapnotrapfnerr。请注意,在我尝试检索它们之前,我push这三个字段的值到了堆栈的末尾。 Here is the code that does the pushing

但是,运行代码时,我会分别获得ripcsrflags字段的值。崩溃的原因是cs不是有效的trapfn函数地址。以下是执行顺序的概述,因为它实际上比上面的解释所暗示的要复杂得多:

  1. IDT输入函数push将错误编号或取代其位置的虚拟编号(因为并非所有中断都有错误编号)添加到堆栈中。 (Source
  2. 中断处理程序的地址(trapfn的值)是push到堆栈上的。 (Source
  3. 中断号为push到堆栈上。 (Source
  4. 在堆栈上分配缓冲区以保存通用寄存器的值。此结构的大小等于struct x86_saved_state的大小减去struct x86_64_intr_stack_frame的大小。
  5. 所有通用寄存器都保存在struct x86_saved_state的字段中,位于其偏移位置。据我所知,这一步很好。 (Source
  6. trapnostruct x86_saved_state内的偏移量提取并存储到ebx中。 此步骤有错误;而是返回rip字段的值。
  7. trapfnstruct x86_saved_state内的偏移量提取并存储到edx中。 此步骤也有错误;而是返回cs字段的值。
  8. cs字段由struct x86_saved_state内的偏移量提取并存储到esi中。 此步骤可能有错误;我现在还说不出来。 (步骤6-8的Source
  9. (注意:Here是包含所用偏移量的文件。)

    有没有人知道为什么步骤6-8会显示上述错误?非常感谢你的努力;这个特殊的崩溃现在已经困扰了我好几个月了!

0 个答案:

没有答案