当它们与内存访问没有真正关联时,是否有错误列表将显示为“segfaults”?

时间:2014-03-10 05:54:00

标签: linux assembly x86

this question中,我了解到在不在0环时尝试运行特权指令可能会导致用户进程中看起来像segfault,并且我有两个后续问题。

  1. 所有特权指示都是如此吗?
  2. 哪些其他类型的错误可能会导致假段错误但与尝试读取内存无关?

2 个答案:

答案 0 :(得分:2)

通读指令集参考,并查看列出非内存问题#GP的位置。不完整列表:CLICLTSHLTININT(带有无效的向量),INVDINVLPGIRET(在某些情况下),LDMXCSR(设置保留位),LGDTLIDTLLDTLMSW,{{1} },LTR(包含MONITOR),ECX != 0(至MOVCRx),DRx(无效MWAIT) ,ECXOUTRDMSRRDPMCSWAPGSSYSEXITSYSRETWBINVD,{ {1}}(无效WRMSR),XGETBVECX

答案 1 :(得分:-1)

它始终是无效的内存引用,但是,您可能会想到MOV指令从/向无效的内存位置加载或保存数据。

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

但请注意,LEA指令实际上并不访问它生成的内存指针,因此不会产生此类错误。

如果堆栈指针现在出错,处理堆栈的指令也可能会出现SEGV,因此POP,PUSH,CALL或RET等指令也会产生这些错误(如果是CALL,即使目标地址是如果您无意中炸掉了堆栈内容,RET会执行此操作...认为缓冲区溢出。)

最后,你的IP地址可能会出错,因为程序永远不会返回,而另一条指令的下一个位置也会在la la land ...也可能产生一个SEGV。如果你编写了正确的代码,就不会发生这种情况(即确保在所有函数的末尾都有一个RET,加上汇编程序倾向于将INT 3添加为填充,这样你的代码就会破坏,而不是继续下一步。 ..)