汇编CALL指令,写入错误?

Jes*_*mos 1 assembly kernel linux-kernel page-fault

在使用某些操作码反汇编的linux内核的页面错误处理程序中,我发现在x86架构上,CALL或0xE8指令偶尔会抛出写入错误,ESI和EDI都是NULL.我想知道是否有一个特定的原因,因为CALL占用一个内存地址,只是将EIP更改为该值,并且不需要页面,因为它只是EIP + relative_offset.如果有人能够清除它,将非常感激.

pax*_*blo 8

call指令不仅仅是改变eip- 它还必须eip在该改变之前将当前(更新为指向下一条指令)写入堆栈.A jmp型指令会按照您的建议行事,但call稍有不同,因为您必须能够在ret以后的当前位置.

我不能确定,因为你没有给我们代码,完整的注册内容和页面表(这是一个问题的大量信息),但在我看来最有可能的解释是堆栈是当前退出,需要重新买回来.

我最初想到的另一种可能性是你跳到的地址是非居民的,但我认为这不会导致call自身出错.

导致故障很快事后为CPU试图取出下一条指令,但我不认为这就是你的描述表示,因为:

  • 你说它发生在call; 和
  • 这将是一个读错,而不是写错.

esiedi值是一个非问题-他们采取不参与一个call.