Linux:系统调用会改变吗?

Linux:系统调用会改变吗?,linux,kernel,system-calls,Linux,Kernel,System Calls,系统调用是内核面向用户空间的接口。用户进程通常不直接调用它们,而是使用libc来实现。libc要么只是为系统调用提供了一个薄薄的包装器,要么像fork()和exec() 所以我的问题是-内核的syscall接口是否在内核的不同版本之间以不向后兼容的方式进行过更改?还是一旦建立了系统调用,它就永远不会更改?由于以下原因,预计不会有大的更改: 虽然它们主要是通过libc调用的,但是libc是可以更改的——它在内核和libc版本之间产生了兼容性问题,这需要避免 系统调用与libc调用完全一样标准化 f

系统调用是内核面向用户空间的接口。用户进程通常不直接调用它们,而是使用libc来实现。libc要么只是为系统调用提供了一个薄薄的包装器,要么像
fork()
exec()


所以我的问题是-内核的syscall接口是否在内核的不同版本之间以不向后兼容的方式进行过更改?还是一旦建立了系统调用,它就永远不会更改?

由于以下原因,预计不会有大的更改:

  • 虽然它们主要是通过libc调用的,但是libc是可以更改的——它在内核和libc版本之间产生了兼容性问题,这需要避免
  • 系统调用与libc调用完全一样标准化
  • fork()
    exec()
    的libc版本非常小,它们与系统调用完全相同。也许您正在考虑
    system()
    ,它实际上是fork-s,使用exec调用shell并等待其终止

    还有一些重要性要低得多的系统调用,Linus和核心团队并不喜欢它们,例如以_reiser4…开头的系统调用,他们有更大的机会在未来改变

    但是标准的系统调用,例如
    sys\u open
    sys\u close
    ,在最近的将来不会改变


    还有一件事是可以改变的,不是系统调用,而是如何调用方法。在远古时代,linux/i386通过
    int0x80
    来使用它,其中系统卡的数量必须输入
    eax
    。此后,也出现了更好/更快的解决方案,例如,有一个特定于CPU的
    SYSENTER
    asm操作码,也可以使用它。它们的可用性是特定于cpu的,因此这是第一次,当内核需要提供用户空间代码时,如何调用其系统调用。如果您键入一个
    cat/proc/$$/maps
    ,您将在末尾看到一个
    [vdso]
    或一个
    [vsyscall]
    内存区域,这是。较旧的内核(可能在2.4之前?)没有。从应用程序代码的角度来看,A是一种基本的原子操作(它是一种“虚拟机指令”)。另见

    指定其具体发生方式。对于x86-64,您可以找到它。另见

    对于某些系统调用,最近的内核提供了使其更快的方法

    Linux内核努力保持二进制级别的兼容性。有传言说,一个15年的(静态链接的)可执行文件应该在最新的内核上运行不变


    然而,在实践中,您不会在代码中直接执行系统调用(因为您需要在汇编中执行,请参阅)。为此,您经常使用一些
    libc
    (例如,或)。出于一些好的原因,您通常会将程序动态链接到
    libc.so
    。那么,从长远来看,您可能会遇到一些不兼容问题(一些链接到旧的
    libc
    的二进制程序可能无法与更新得多或旧得多的libc运行)。

    请允许我引用
    open(2)
    手册页中的内容:“符合”。你到底问什么?@BasileStarynkevitch我想用静态libc(如musl)编译我的应用程序,并确保它永不中断:)“永不”没有任何意义。但你的应用程序可能在十几年内(或更短的时间内)不会崩溃。如果这还不够,那就让它成为自由软件(希望有人能在2030年或2040年将源代码改编成相关标准)!