Linux,系统调用表,32和x64
收藏

我不明白
一。所有Linux机器的系统调用地址是否相同(或者取决于编译选项)
2.32x86和x64是否具有相同的系统调用地址?我在web中找到了一些引用,例如swapon有x87地址,但是没有指定它是32位还是64位内核版本


最佳答案:

我认为你混淆了两个非常重要的概念。有两种不同的“地址”可以理解:
实际的内存地址。这些问题在内核编译之间会有所不同,除非有意修复(我不相信它们是如此),否则在使用的编译器之间会有所不同。我发行版中的每个新内核都有不同的系统调用函数地址。
系统呼叫号码。这些是运行sysenter(或中断)之前使用的整数值,表示“执行系统调用”。对于给定的abi,这些总是相同的。ABI是应用程序二进制接口;在机器之间获取编译程序并使其运行的能力。
x86 linux和x86u64linux具有不同的abi,因此系统调用号码不同。但是在运行x86 linux的两个不同发行版之间,abi是相同的,因此这些系统是abi兼容的,理论上您应该能够移植程序。
实际上,它比那更复杂(共享库、路径等)。
如果您想查看系统上内核函数的地址,并且您有System.map(可能有),请尝试:

cat /boot/System.map-`uname -r` | grep funcname

系统的系统调用表分别在/usr/include/asm/unistd_32.h/usr/include/asm/unistd_64.h中定义。

    公众号
    关注公众号订阅更多技术干货!