有没有错误列表会显示为“segfaults”,当他们没有真正的内存访问?

在这个问题中 ,我了解到,如果不在响铃0时尝试运行特权指令,可能会导致在用户进程中看起来像段错误,并有两个后续问题。

  1. 所有特权指令都是如此吗?
  2. 还有什么其他types的错误会导致假段错误,但与试图读取内存无关?

Solutions Collecting From Web of "有没有错误列表会显示为“segfaults”,当他们没有真正的内存访问?"

通读指令集参考,并查看#GP列在哪里以解决非内存问题。 不完整列表: CLICLTSHLTININT (具有无效向量), INVDINVLPGIRET (在情况下), LDMXCSR (设置保留位), LGDTLLDTLMSWLMSWLTRMONITOR (无效的ECX ), OUTRDMSRRDPMCSWAPGSSYSEXITSYSRETWBINVDWRMSRXGETBV (无效的ECX ), XRSTORXSETBV

它始终是一个无效的内存引用,但是,您可能正在考虑将MOV指令加载或保存到/无效内存位置的数据。

事实是任何访问任何“错误”的内存位置都会产生错误。 所以,如果你的JMP或CALL到一个无效的地址,你会得到相同的结果。 如果你从一个内存位置添加错误,那么同样的问题。

但是请注意,LEA指令实际上不会访问它生成的内存指针,所以不会产生这样的错误。

如果堆栈指针现在是错误的,那么处理堆栈的指令可能会得到一个SEGV,因此POP,PUSH,CALL或RET等指令也会产生这些错误(在CALL的情况下,即使目标地址有效;如果你不小心炸毁了你的堆栈内容,RET会这样做……考虑缓冲区溢出。)

最后,你的IP地址可能会出错,因为程序永远不会返回,另一个指令的下一个地址将在la la land …也可能产生一个SEGV。 如果你编写正确的代码,就不会发生什么事情(比如,确保所有函数的末尾都有一个RET,再加上汇编程序往往会将INT 3作为填充符号,这样代码就会中断,而不是继续下一步。 ..)