0

0

Linux 系统调用的完整执行路径

冰川箭仙

冰川箭仙

发布时间:2026-01-28 19:57:09

|

645人浏览过

|

来源于php中文网

原创

Linux系统调用入口是entry_SYSCALL_64汇编函数,位于arch/x86/entry/entry_64.S;它通过syscall指令触发,负责保存寄存器、切换栈并跳转到do_syscall_64,再经sys_call_table分发至具体sys_*函数。

linux 系统调用的完整执行路径

系统调用从用户态到内核态的入口在哪

Linux 系统调用不是直接跳进内核函数,而是通过一个受控的软中断或特殊指令触发上下文切换。x86-64 上最常见的是 syscall 指令,它会把控制权交给内核预设的入口点 entry_SYSCALL_64(位于 arch/x86/entry/entry_64.S)。这个入口负责保存寄存器、切换、检查是否为 compat 模式,并跳转到 C 层主调度函数。

  • 用户代码调用 glibc 封装的 open()read() 等,最终会执行 syscall 指令(而非 int 0x80,后者是旧模式)
  • syscall 指令前,系统调用号必须提前写入 %rax,参数依次放入 %rdi%rsi%rdx%r10%r8%r9
  • 内核不会信任用户传入的指针值,所有地址在进入具体处理函数前都要经 copy_from_user()access_ok() 校验

内核中如何找到对应系统调用的实现函数

系统调用号和函数指针的映射关系保存在 sys_call_table 数组里,定义于 arch/x86/entry/syscalls/syscall_64.tbl,编译时生成 arch/x86/entry/syscalls_64.c。比如 read 的调用号是 0,查表可知它对应 sys_read 函数。

  • sys_read 并非最终逻辑,它只是入口封装:做参数检查、获取文件描述符对应的 struct file *,再调用 file->f_op->read()(即具体文件系统的读操作函数)
  • 很多系统调用会进一步分发:如 openatdo_sys_openpath_openat → 各种路径解析和 inode 查找逻辑
  • 注意 sys_* 命名的函数运行在进程上下文中,可睡眠;而中断上下文中的函数(如 do_IRQ)不能调用它们

为什么 strace 能看到系统调用,但 perf trace 有时看不到完整路径

strace 依赖 ptrace 机制,在内核的系统调用入口/出口处插桩,捕获寄存器状态,因此能准确显示调用号、参数、返回值和耗时。而 perf trace 默认基于 ftrace 的 sys_enter/sys_exit 事件,虽然开销更低,但:

网趣购物系统加强升级版
网趣购物系统加强升级版

新版本程序更新主要体现在:完美整合BBS论坛程序,用户只须注册一个帐号,即可全站通用!采用目前流行的Flash滚动切换广告 变换形式多样,受人喜爱!在原有提供的5种在线支付基础上增加北京云网支付!对留言本重新进行编排,加入留言验证码,后台有留言审核开关对购物系统的前台进行了一处安全更新。在原有文字友情链接基础上,增加LOGO友情链接功能强大的6种在线支付方式可选,自由切换。对新闻列表进行了调整,

下载
  • 若内核未启用 CONFIG_FTRACE_SYSCALLS=yperf trace 就无法触发系统调用事件
  • 它不自动解析参数语义(比如不会把 fd=3 显示为 /dev/pts/0),需配合 --call-graph 和符号表才能看到后续调用链
  • 对于被优化掉的内联函数(如部分 __fget_light 调用),perf 可能跳过中间环节,只显示顶层 sys_read

自己加日志或调试时,该 hook 哪个位置才真正“刚进来”

如果想确认某次系统调用是否被执行,最靠前且稳定的打点位置是 sys_calltable 对应的 sys* 函数开头;若要观察更底层行为(比如是否被 seccomp 过滤、是否触发了 audit),则应在:

  • entry_SYSCALL_64 汇编入口(需内核模块 + kprobe,注意栈尚未切换完全)
  • do_syscall_64(位于 arch/x86/entry/common.c),这里完成调用号校验、seccomp 检查、然后索引 sys_call_table
  • __secure_computing(seccomp 触发点,可能直接 kill 当前进程)

别在 sys_read 里加 printk 然后奇怪“为什么有些 read 没打出来”——它可能被 seccomp kill 在之前,也可能被 ptrace 拦截并伪造返回值。真正“刚进来”的位置比想象中更靠前,也更难安全修改。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

443

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

544

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

93

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

197

2025.08.29

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

396

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1395

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

706

2023.06.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号