Linux,系统调用表,32和x64

eki*_*tru 3 linux kernel system

我不清楚1.所有Linux机器的系统调用地址是否相同(或者它们依赖于编译选项)2.32x86和x64是否具有相同的系统调用地址?我在网上找到了一些引用,例如swapon有x87地址,但未指定是32位还是64位内核版本

小智 5

我认为你在这里混淆了两个非常重要的概念.有两种不同的"地址"可供理解:

  1. 实际,在内存地址中.这些将在内核编译之间有所不同,除非故意修复(我不相信它们)将在所使用的编译器之间有所不同.我的发行版中的每个新内核都有不同的系统调用函数地址.
  2. 系统呼叫号码.这些是在运行sysenter(或中断)之前使用的整数值,表示"执行系统调用".对于给定的ABI,这些总是相同的.ABI是应用程序二进制接口; 能够在机器之间获取已编译的程序并使其运行.

    x86 Linux和x86_64 Linux具有不同的ABI,因此系统调用号不同.但是在运行x86 Linux的两个不同发行版之间,ABI是相同的,所以这些系统是ABI兼容的,理论上你应该能够移植程序.

    实际上,它比那更复杂(共享库,路径等).

如果你想在你的系统上看到内核函数的地址System.map(你可能会这样做),试试:

cat /boot/System.map-`uname -r` | grep funcname
Run Code Online (Sandbox Code Playgroud)

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