加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

Linux:系统调用会改变吗?

发布时间:2020-12-13 23:10:39 所属栏目:Linux 来源:网络整理
导读:Syscalls是内核的面向用户空间的接口.用户进程通常不会直接调用它们,而是使用libc来执行此操作. libc要么只是在系统调用周围提供一个瘦包装,要么在fork()和exec()的情况下做更多的工作 所以我的问题是 – 内核的syscall接口是否以非向后兼容的方式在内核版本
Syscalls是内核的面向用户空间的接口.用户进程通常不会直接调用它们,而是使用libc来执行此操作. libc要么只是在系统调用周围提供一个瘦包装,要么在fork()和exec()的情况下做更多的工作

所以我的问题是 – 内核的syscall接口是否以非向后兼容的方式在内核版本之间发生变化?或者,一旦建立了系统调用,它将永远不会改变?

解决方法

从应用程序代码的角度来看,syscall是基本原子操作(它是“虚拟机指令”).另见 syscalls(2).

ABI规定了它究竟是如何发生的.对于x86-64,你可以找到它here.参见x86 calling conventions.

对于某些系统调用,最近的内核提供了vdso(7)以使它们更快.

Linux内核努力保持二进制级别的兼容性.据传,15年前(静态链接)ELF可执行文件应该在最新的内核上保持不变.

但是,在实践中,您不直接在代码中执行系统调用(因为您需要在汇编中执行此操作,请参阅Linux assembly howto).你经常使用一些libc(例如GNU libc或MUSL libc).出于几个好的原因,您通常会将程序动态链接到libc.so.然后你可能会在很长一段时间内遇到一些不兼容问题(一些链接到旧libc的二进制程序可能不会运行得更新 – 或者更旧 – 一个).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读