首页
科技
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。

同类文章

东方甄选启示录:告别流量喧嚣,做产品才是电商出路

当直播电商行业仍在为流量争夺而陷入内卷时,东方甄选已悄然开启一场从“流量至上”到“产品为王”的深度变革。这场变革不仅重塑了企业的增长逻辑,更在行业格局中刻下新的坐标。最新财报数据显示,东方甄选的战略

2025-10-30.

江苏纳芯微港股上市:252亿市值背后,年销芯片超30亿颗

江苏苏州的模拟芯片龙头企业纳芯微,近日向港交所重新提交了上市申请。这家成立于2013年的公司,在模拟芯片领域已占据重要地位。按2024年中国模拟芯片市场收入计算,纳芯微位列中国模拟芯片厂商第五、汽车

2025-10-30.

iQOO Neo11起价2599元:骁龙8至尊版双芯+同档唯一2K LTPO屏

10月30日消息,iQOO Neo11今晚正式发布,首发限时优惠,起售价只要2599元。具体配置如下:屏幕:6 78英寸2K 144Hz珠峰屏,联合研发BOE最新Q10+发光材料,支持硬件级圆偏振光

2025-10-30.

胡润谈雷军财富暴增:弯腰捡钱反亏万元的商业启示

在最新发布的2025胡润百富榜中,小米集团创始人雷军以3260亿元身家位列第五,成为本年度财富增长最快的企业家。数据显示,其个人财富较上一年度激增1960亿元,平均每小时财富增值达37万元,相当于每

2025-10-30.

2025年Q3手机市场:三星苹果领跑,小米稳居全球第三

根据Omdia(原Canalys)发布的最新市场研究报告,2025年第三季度全球智能手机出货量达到3 201亿台,较去年同期增长3%。这一增长态势反映出全球消费电子市场在经历波动后逐步企稳,头部品牌

2025-10-30.

热门教程

更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程

最新下载

更多
拳击大作战
拳击大作战 体育竞技 2025-10-31更新
查看
小黄人快跑国际
小黄人快跑国际 休闲益智 2025-10-31更新
查看
愤怒的小鸟2国际服
愤怒的小鸟2国际服 休闲益智 2025-10-31更新
查看
Melon Sandbox国际
Melon Sandbox国际 休闲益智 2025-10-31更新
查看
死亡扳机手游
死亡扳机手游 飞行射击 2025-10-31更新
查看
进击的巨人Brave Order正
进击的巨人Brave Order正 角色扮演 2025-10-31更新
查看
海岛奇兵腾讯
海岛奇兵腾讯 棋牌策略 2025-10-31更新
查看
海岛奇兵应用宝
海岛奇兵应用宝 棋牌策略 2025-10-31更新
查看
海岛奇兵昆仑
海岛奇兵昆仑 棋牌策略 2025-10-31更新
查看
西奥小镇正
西奥小镇正 休闲益智 2025-10-31更新
查看