这可能是一个愚蠢的问题,但我正在debugging一个gdb试图“反向工程”的二进制文件,并达成了一个系统调用的指令后,我想要反向工程的效果出现。 我假设另一个进程正在接pipe并执行工作,所以我想知道是否可以debugging用gdb处理系统调用的内核代码。
下面是使得系统调用(它看起来是sys_getpid)的x86程序集片段:
0x00007ffff7660d3e <+14>: movsxd rdx,edx 0x00007ffff7660d41 <+17>: movsxd rdi,edi 0x00007ffff7660d44 <+20>: mov eax,0x14 0x00007ffff7660d49 <+25>: syscall
syscall
(或sysenter
或int 0x80
等)机器指令是用于根据定义由Linux内核处理的系统调用 。 详细信息在x86-64 ABI规范中定义。 阅读高级Linux编程以获得其中大部分的概述。 另请参阅Linux组件HowTo 。
从用户应用程序的角度来看,系统调用是一个虚拟的原子指令。
没有特定的userland进程正在处理系统调用,内核的工作就是处理它们,而这几乎是应用程序与内核进行交互的唯一方式。
内核对系统调用的处理被认为是系统CPU时间,例如按时间(1)
syscalls(2)给出了文档化的系统调用列表。 另请参阅<asm/unistd.h>
和<asm/unistd_64.h>
等…标题。
您可以使用strace(1)来了解特定运行(某个进程)完成的系统调用的顺序。
另见vdso(7) 。