我正在尝试在QEMU中启动自定义内核。由于计算地址跳转到处理中断时出错,因此在中断启用后可怕地崩溃。
我有一些汇编代码可以从偏移in a C structure中检索值。具体来说,我正在尝试获取字段trapno
,trapfn
和err
。请注意,在我尝试检索它们之前,我push
这三个字段的值到了堆栈的末尾。 Here is the code that does the push
ing
但是,运行代码时,我会分别获得rip
,cs
和rflags
字段的值。崩溃的原因是cs
不是有效的trapfn
函数地址。以下是执行顺序的概述,因为它实际上比上面的解释所暗示的要复杂得多:
push
将错误编号或取代其位置的虚拟编号(因为并非所有中断都有错误编号)添加到堆栈中。 (Source)trapfn
的值)是push
到堆栈上的。 (Source)push
到堆栈上。 (Source)struct x86_saved_state
的字段中,位于其偏移位置。据我所知,这一步很好。 (Source)trapno
由struct x86_saved_state
内的偏移量提取并存储到ebx中。 此步骤有错误;而是返回rip
字段的值。trapfn
由struct x86_saved_state
内的偏移量提取并存储到edx中。 此步骤也有错误;而是返回cs
字段的值。cs
字段由struct x86_saved_state
内的偏移量提取并存储到esi中。 此步骤可能有错误;我现在还说不出来。 (步骤6-8的Source)(注意:Here是包含所用偏移量的文件。)
有没有人知道为什么步骤6-8会显示上述错误?非常感谢你的努力;这个特殊的崩溃现在已经困扰了我好几个月了!