Linux,系统调用表,32和x64

时间:2011-10-14 08:13:49

标签: linux system kernel

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

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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

答案 1 :(得分:1)

在Linux系统调用中没有地址。当然它们在某个地方,在内存中的某个地址,但调用程序通常不知道它们(甚至可以访问该内存)。通常它们由中断调用(例如,Linux使用0x80,MS-Dos,例如使用0x21)。调用进程只是请求软件中断,然后中断处理程序处理系统调用。调用类型和参数预先放入某些寄存器中,因此内核知道该怎么做。

在更现代的cpus中,设计师发明了特定的指令(例如Intel / AMD有SYSCALL / SYSENTER),因此没有使用中断方式来调用系统调用,但从用户的角度来看基本上是相同的。

当然有一些中断表,它的条目不同,取决于你是使用x64还是32。

相关问题