当前位置: 首页
科技数码
Linux系统调用详解:从原理到实践的完整指南

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

热心网友 时间: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。

同类文章
更多
微星 2026 款泰坦 18 Max 游戏本国行上市:7 热管 2 风扇,整机双烤 260W

微星 2026 款泰坦 18 Max 游戏本国行上市:7 热管 2 风扇,整机双烤 260W

微星泰坦 18 Max 2026款国行发布:极致双烤260W性能,散热系统全面解析 对于追求极致性能的游戏玩家和专业创作者而言,顶级游戏本市场迎来了一个重磅选项。近日,微星正式在国内推出了其旗舰级新品——2026款泰坦 18 Max(Raider 18 Max HX)游戏笔记本电脑,旨在重新定义高性

时间:2026-04-06 07:03
旗舰配置 25000Pa 吸力 + 95℃ 自清洁:石头 A30 CE 洗地机 1278 元免费用 15 天

旗舰配置 25000Pa 吸力 + 95℃ 自清洁:石头 A30 CE 洗地机 1278 元免费用 15 天

京东百亿补贴开启:石头 A30 CE 系列洗地机享“买贵双倍赔”与“15天免费试用” 如果您正在关注高品质清洁电器,那么现在有一个不容错过的限时机会。石头科技旗下的 A30 CE 系列智能洗地机现已加入“京东百亿补贴”专场。本次促销不仅带来极具竞争力的价格,更提供了两大核心保障:一是“买贵双倍赔”的

时间:2026-04-06 07:02
比官方预告时间更早:消息称“超级小爱”PC 客户端正推送给小米笔记本 Pro 14

比官方预告时间更早:消息称“超级小爱”PC 客户端正推送给小米笔记本 Pro 14

比官方预告时间更早:消息称“超级小爱”PC 客户端正推送给小米笔记本 Pro 14 四月份伊始,小米在AI落地应用方面便带来了令人惊喜的新进展。据知名数码博主@懒酱的日记本透露,备受期待的“超级小爱”PC客户端已开始向小米笔记本 Pro 14用户推送。此次推送的时间点,较官方之前公布的四月中旬计划明

时间:2026-04-06 07:01
红魔姜超“冒险爆料”:Pad 新品不是四月就是五月发布,一定不让大家失望

红魔姜超“冒险爆料”:Pad 新品不是四月就是五月发布,一定不让大家失望

红魔姜超透露:全新游戏平板将于四月或五月发布,承诺带来惊艳体验 游戏硬件领域即将迎来重磅更新。努比亚红魔游戏手机的产品线负责人姜超,近日通过社交媒体进行了一次颇具悬念的“前瞻剧透”,成功引发了广大游戏玩家和科技爱好者的高度关注。他明确指出,红魔全新一代游戏平板的发布日期已锁定在四月或五月,并使用了“

时间:2026-04-05 22:56
未来人类 X98W 移动“工作站”笔记本电脑上线官网,4 月内发售

未来人类 X98W 移动“工作站”笔记本电脑上线官网,4 月内发售

未来人类X98W移动工作站正式发布:重新定义移动端专业性能的新标杆 在专业移动计算领域,总有一些产品能够打破常规认知。近日,未来人类(TerransForce)正式在其官网上线了全新的X98W高性能移动工作站,并宣布将于本月内全面发售。这款设备的问世,无疑为那些在移动办公环境中仍需要桌面级别强悍性能

时间:2026-04-05 22:54
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程