首页 游戏 软件 资讯 排行榜 专题
首页
科技数码
Linux系统调用详解:从原理到实践的完整指南

Linux系统调用详解:从原理到实践的完整指南

热心网友
59
转载
2025-10-30

一说到服务,很多人首先想到的可能是服务器。假设客户端是浏览器,浏览器发送HTTP请求,服务器接收请求后解析并调用相应的handler。从本质上讲,这就是客户端触发了服务器端某个函数的执行,这时我们便说客户端请求了服务器端上的服务。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

系统调用与普通的函数调用并无本质区别。普通函数调用通常调用我们编写的函数或其他库函数,而系统调用则是调用了内核中的函数。更学术一点的说法是:所谓系统调用,是指用户态程序请求操作系统提供的服务。

一提到服务,大家最先想到的通常是服务器。假设客户端是浏览器,浏览器发送HTTP请求,服务器接收到请求后进行解析,然后调用相应的handler。本质上,这是客户端触发了服务器端某个函数的运行,此时我们就可以说客户端请求了服务器端上的服务。

而系统调用与此类似,只不过用户态程序并非通过HTTP来触发操作系统中某个函数的执行,而是通过机器指令来实现的。因为用户态的App和操作系统运行在同一台计算机系统中,而客户端和服务器端则运行在不同的计算机系统里(绝大多数情况下),因此客户端只能通过网络协议HTTP与服务器进行通信。

图片图片

更通俗的说法是这样的:所谓系统调用,指的是用户态的某个函数调用内核中的某个函数。

接下来,我们用一段简单的hello world程序来看看系统调用,这段程序需要运行在x86_64架构下:

.section .datamsg: .ascii "Hello, world! " # 字符串定义,包含换行符 len = . - msg # 计算字符串长度(包含换行符).section .text.global _start_start: # 调用 write(1, msg, len) movq $1, %rax # syscall 1 (write) movq $1, %rdi # fd = 1 (stdout) movq $msg, %rsi # 字符串地址 movq $len, %rdx # 字符串长度 syscall # 调用 exit(0) movq $60, %rax # syscall 60 (exit) xorq %rdi, %rdi # status = 0 syscall

使用以下命令编译:

$ gcc -c test.S$ ld -o test test.o

然后执行:

./testHello, world!

这段汇编代码成功地打印出了hello world。那么这段代码具体是什么意思呢?

我们来看.data这一段,这里说的是程序定义了哪些数据,而.text段则包含了程序的执行部分。我们之前提到进程的内存布局时,总是会谈到数据段和代码段,这里的数据段指的就是汇编中的.data段,代码段就是汇编中的.text段。现在你应该明白了吧。

图片图片

在.text段中,我们看到了一条略显奇怪的指令——syscall,这条指令到底是什么意思呢?

我们来查阅一下Intel的开发手册:

SYSCALL invokes an OS system-call handler at privilege level 0. It does so by loading RIP from the IA32_LSTAR MSR (after saving the address of the instruction following SYSCALL into RCX). (The WRMSR instruction ensures that the IA32_LSTAR MSR always contain a canonical address.)

这段话告诉我们,Intel处理器在执行syscall指令时,会在内核态调用操作系统的某个函数,即syscall-call handler。那么CPU是如何知道某个syscall-call handler在内存中的地址呢?

原来,syscall-call handler所在的内存地址存储在MSR寄存器中。那么又是谁将这个地址存储在了MSR寄存器中呢?很显然,是操作系统。接下来我们以Linux为例进行说明。

Linux内核在初始化时会将syscall-call handler,也就是Linux内核中entry_SYSCALL_64函数的地址写入MSR寄存器中:

wrmsrl(MSR_LSTAR, entry_SYSCALL_64);

其中,syscall-call handler也就是entry_SYSCALL_64定义在Linux源码中的arch/x86/entry/entry_64.S中。上述初始化MSR寄存器的代码定义在了arch/x86/kernel/cpu/common.c中。

现在我们知道了,当CPU执行syscall时会无条件跳转到MSR寄存器中保存的函数地址,也就是entry_SYSCALL_64函数。那么很显然,所有系统调用的入口都是entry_SYSCALL_64函数。那么操作系统该如何区分到底是调用的read系统调用还是write等系统调用呢?

原来,操作系统中给每种系统调用分配了一个序号,就像Linux中这样:

0common read sys_read1common write sys_write2common open sys_open3common close sys_close4common stat sys_newstat5common fstat sys_newfstat6common lstat sys_newlstat7common poll sys_poll8common lseek sys_lseek9common mmap sys_mmap...

可以看到,0号系统调用表示的是内核中的read函数,1号系统调用表示的是内核中的write函数。在进行系统调用时,会表示系统调用类别的序号写入通用寄存器中。

从上面这个表格可以看到,write系统调用的序号是1,因此在hello world程序中我们将1写入寄存器rax中:

movq $1, %rax

这条指令表示我们将要调用第1号系统调用,也就是sys_write。hello world程序中后续三条机器指令的功能分别是:

# 写入文件描述符1movq $1, %rdi# 保存指向字符串的指针movq $msg, %rsi# 写入数据的大小movq $len, %rdx

实际上,这四条机器指令都是为执行syscall进行的铺垫,即执行syscall所需要的参数。可以看到,我们进行系统调用传递参数时都是通过寄存器来完成的。

这样当CPU执行syscall指令时,就会跳转到Linux内核中的write函数,同时在执行该函数时也能知晓write函数所需要的参数是什么。

来源:https://www.51cto.com/article/828117.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

wsl安装OpenClaw
AI
wsl安装OpenClaw

参考指南与学习资料 若您希望在本地快速搭建并部署一个个人智能助手,OpenClaw 框架是一个理想的入门选择。为了帮助开发者更高效地上手,社区中已有丰富的学习资源与讨论可供参考,主要包括:OpenClaw 新手入门教程、核心命令行工具使用指南(openclaw -h 查看帮助)、配置文件的参数详解,

热心网友
04.02
openclaw 究极离谱的坑
AI
openclaw 究极离谱的坑

1 openclaw 工具权限报错解决方案:无法使用 exec read write webfetch 等工具的修复方法 当您在配置 openclaw 时遇到工具权限报错,提示缺少 exec、read、write、webfetch 等关键工具的使用权限,通常无需深入排查复杂的系统环境。此问题在多数

热心网友
04.02
OpenClaw 安装教程(Linux)
AI
OpenClaw 安装教程(Linux)

本次部署指南的核心目标非常明确:在 Linux 环境中,无论是云服务器还是本地物理机,我们都需要完整地完成 OpenClaw 智能体框架的安装与部署,并通过基础的健康检查与功能验证,确保整个系统能够成功启动并稳定运行。 一、环境要求 在开始动手安装之前,我们首先需要确认系统满足所有的基础运行环境要求

热心网友
04.02
【openclaw】linux安装openclaw排坑
AI
【openclaw】linux安装openclaw排坑

场景一:npm install 安装失败问题详解与解决方案 在进行前端开发或是安装Node js工具时,你是否经常遇到令人困扰的“npm install failed”报错?这个问题通常表现为命令行输出一串红色错误信息,最终停止在安装失败的提示上。深入分析这些报错日志,你会发现一个关键提示:缺少C+

热心网友
04.02
笔记本厂商 Framework 赞助 KDE,协助改善 Linux 桌面体验
科技数码
笔记本厂商 Framework 赞助 KDE,协助改善 Linux 桌面体验

Framework笔记本携手KDE社区:共同推进Linux桌面深度优化方案 近期,模块化笔记本领域的领导者Framework公司宣布与全球知名的开源社区KDE达成战略合作,正式成为KDE的重要赞助伙伴。这一举措不仅象征着Framework在推动开源生态发展上迈出关键一步,也标志着硬件创新厂商与顶级L

热心网友
04.02

最新APP

火柴人传奇
火柴人传奇
动作冒险 04-01
街球艺术
街球艺术
体育竞技 04-01
飞行员模拟
飞行员模拟
休闲益智 04-01
史莱姆农场
史莱姆农场
休闲益智 04-01
绝区零
绝区零
角色扮演 04-01

热门推荐

解限机天袭者滨湾运输中心怎么实战
游戏攻略
解限机天袭者滨湾运输中心怎么实战

解限机天袭者滨湾运输中心实战教学:制霸空中与地形的终极指南 在《解限机》游戏的所有对战地图中,滨湾运输中心无疑是对玩家战术素养与地图掌控力的顶级试炼场。这片区域地形结构极为复杂,高楼耸立,集装箱遍布,形成了无数视野盲区与火力交叉点。若想在滨湾运输中心取得胜利,空有强大机甲与火力是远远不够的,关键在于

热心网友
04.06
Soul聊天记录如何批量删除
手机教程
Soul聊天记录如何批量删除

Soul聊天记录一键清理:批量删除完整步骤与隐私保护技巧 管理社交应用,如同定期整理你的数字家园。随着使用时间增长,Soul中的聊天记录会不断累积,无论是为了释放宝贵的手机存储空间,还是出于对个人隐私安全的重视,掌握批量删除功能都显得尤为必要。本文将为你提供一份清晰、易操作的Soul聊天记录批量删除

热心网友
04.06
GTA6不再延期 开发进入最终收尾阶段
游戏资讯
GTA6不再延期 开发进入最终收尾阶段

知名爆料人Kiwi Talkz近日透露,《GTA6》开发已进入最终收尾阶段,游戏确认不会再次延期。据爆料消息指出,其他游戏厂商要追赶R星在《GTA6》中达成的技术与内容高度,恐需15至20年时间。R星团队在部分技术目标上的规划极具突破性,展现了远超行业当前水准的雄心。 对于持续等待的全球玩家来说,这

热心网友
04.06
鸣潮奥古斯塔怎么培养
游戏攻略
鸣潮奥古斯塔怎么培养

《鸣潮》奥古斯塔养成全攻略:核心材料解析与高效培养路线 若想在《鸣潮》中将强力角色奥古斯塔培养成真正的战场主宰,详尽了解其养成材料是至关重要的第一步。这些资源直接决定了角色从前期成长到后期成型的完整路径,规划是否合理将极大影响实战表现与队伍构建。 首先,系统梳理奥古斯塔所需的各类养成素材是基础。经验

热心网友
04.06
索尼PC移植策略生变 第一方重回独占
游戏资讯
索尼PC移植策略生变 第一方重回独占

索尼工作室悄然修改措辞,PlayStation独占策略或将全面收紧,引发行业热议 近期,游戏行业内部关注到一个值得玩味的现象:索尼互动娱乐旗下多家核心第一方工作室,静悄悄地更新了其官方网站的简介说明。仔细对比可以发现,更新后的措辞发生了微妙但关键的转变——此前涉及PC平台的描述已基本被移除,取而代之

热心网友
04.06