据我所知(我可能错了),没有办法在x86-64系统上执行一个指令。也许您可以执行“ud2”操作码后面的指令来触发信号 - 但是您必须担心指令修改控制流并转到其他地方。
然而,如果我理解正确,ptrace()系统调用具有一个只执行单个指令的SINGLESTEP选项。这是如何实现的?我无法想象内核有某种反汇编程序来识别它的指令和原因。那么,是否有一些我不知道的建筑功能呢?还是完全不同的东西?
答案 0 :(得分:5)
是的,这是一个架构的单步标志。从内核返回到用户空间使内核有机会同时设置RIP / RFLAGS,因此它可以为用户空间设置单步,而无需在内核指令上触发。
出于某种原因,Trap Flag有自己的维基百科文章!另请参阅wikipedia's EFLAGS article。
请参阅x86标记维基,获取英特尔架构手册的链接,该手册记录了所有这些内容。
也许您可以执行“ud2”操作码后面的指令来触发信号
然后你需要代码来确定解码x86指令长度。并且您不会使用ud2
,而是使用int3
which exists for this purpose.