如何查找程序使用哪种类型的系统调用
我正在 x86_64 机器上工作。我的linux内核也是64位内核。由于实现系统调用有不同的方法(int 80、syscall、sysenter),我想知道我的机器正在使用什么类型的系统调用。我是linux新手。我写了一个演示程序。
#include <stdio.h>
int main()
{
getpid();
return 0;
}
getpid() 执行一个系统调用。任何人都可以给我一个方法来查找我的机器将使用哪种类型的系统调用来执行此程序..谢谢....
I am working on x86_64 machine. My linux kernel is also 64 bit kernel. As there are different ways to implement a system call (int 80, syscall, sysenter), i wanted to know what type of system call my machine is using. I am newbie to linux. I have written a demo program.
#include <stdio.h>
int main()
{
getpid();
return 0;
}
getpid() does one system call. Can anybody give me a method to find which type of system call will be used by my machine for this program.. Thank you....
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
看起来我们对 getpid() 的调用实际上是一个库调用。让我们在那里设置一个断点并继续。
getpid() 库中隐藏的是系统调用汇编指令。这是一条 AMD64 指令,支持快速上下文切换到ring0以进行系统调用。
Looks like our call to getpid() is actually a library call. Let's set a breakpoint there and continue.
Buried in the getpid() library is the syscall assembler instruction. This is an AMD64 instruction that supports a fast context switch to ring0 for the purpose of system calls.
在linux下,可以使用strace来记录特定进程进行了哪些系统调用。
Under linux, you can use strace to record which system calls are made by a particular process.
一种方法是使用 gdb 逐步执行机器代码(使用
stepi
),直到找到启动系统调用的指令。因为不同的机器将指令放在不同的位置(有时在系统调用包装器本身中,有时在系统调用包装器调用的函数中),所以我无法预测指令的确切位置。例如,在一台旧机器上,
getpid
本身执行了int 0x80
,而在一台较新的机器上,getpid
执行了call *gs :0x10
将其带到__kernel_vsyscall
执行sysenter
One way is to use the gdb to step through the machine code (using
stepi
) until you get to the instruction that initiates the system call. Because different machines put the instruction in different places (sometimes in the system call wrapper itself and sometimes in a function called by the system call wrapper), I can't predict where exactly the instruction will be.For example, on one old machine,
getpid
itself did aint 0x80
while in a newer machine,getpid
does acall *gs:0x10
which brings it to__kernel_vsyscall
which does asysenter
我为此创建了一个基于 strace 的简单工具。
它完全按照您的要求执行:
https://github.com/avilum/syscalls
I created a simple tool for that, based on strace.
It performs exactly what you asked for:
https://github.com/avilum/syscalls