我正在尝试调试在iretq
指令期间显然出错的自定义内核。我按顺序将这些数据按顺序推送到堆栈,从最近到最近(下面的所有值都是8个字节),堆栈指针的当前位置如下所示:
trapno
trapfn
err
rip <- %rsp
cs
rflags
rsp
当我执行iretq
时,我理解它会从堆栈中弹出rip
,cs
,rflags
和rsp
值按此顺序,并将它们放入相应的寄存器中。但是,无论出于何种原因,CPU都会跳过rip
字段并从cs
开始。这样,%rip
具有%cs
的值,而%rflags
具有%rsp
的值。这导致崩溃,因为%cs
不包含有效的指令地址。
请注意,上面列表中位于rip
上方的字段是在堆栈上分配的大型结构的一部分,然后通过将%rsp
移回其开头后释放到{{ 1}}字段。我已经尝试调整移动rip
的数量,但没效果。