Linux系统调用详解:从原理到实践的完整指南
一提到服务,大家最先想到的一定是服务器,假设客户端是浏览器,浏览器发送http请求,服务器接收到请求后进行解析然后调用相应的hander,从本质上讲就是客户端触发了服务器端的某个函数的运行,这时我们
一说到服务,很多人首先想到的可能是服务器。假设客户端是浏览器,浏览器发送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函数所需要的参数是什么。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
AI开源化身股价“点火器”,美团大涨近9%
7月7日,美团-W(03690 HK)表现强势,盘中一度涨近9%,报81 65港元,股价创6月3日以来新高。据金融投资AI助手扣子APP分析,美团今天上涨的核心催化是近日宣布正式开源万亿参数大模型LongCat-2 0。该模型总参数达1 6T,平均激活约48B,专为真实的Agentic Coding
腾讯AI应用生成平台“吐司”iOS版上线,主打Vibe Coding
IT之家 7 月 7 日消息,腾讯旗下 AI 生成应用 App“吐司”昨日上线苹果 App Store,定位为“探索型氛围编程(Vibe Coding)产品”,安卓版本已在上个月推出。据最新介绍,腾讯吐司是一款 AI 生成应用的 App,可由 AI 梳理功能、精细化编辑打磨;平台设有灵感广场,精选优
首款eSIM AI游戏手机登场 联通联想启动战略合作
中国联通与联想集团在北京联合举办拯救者 Y70 新一代 "AI+eSIM " 游戏手机战略合作启动仪式。双方正式达成全渠道联合首发战略合作,共同推出国内首款支持eSIM的AI游戏手机。 小编 5月28日消息,联想拯救者Y70新一代手机是一款游戏定位手机,该机不仅提供了充满
摩尔线程完成腾讯Hy3和美团LongCat-2.0适配
同一天,摩尔线程完成两款国产大模型适配。7月6日,腾讯新一代大模型Hy3正式开源,摩尔线程旗舰级AI训推一体智算卡MTT S5000于同日实现Day-0极速适配。据了解,Hy3是由腾讯混元团队研发的快慢思考融合的混合专家模型,总参数量295B,激活参数21B,支持256K上下文长度。相比previe
机构:SaaS优质公司有望在Token时代涅槃重生,下半年看好高ROI场景下游应用价值重估
6月10日,中国银河发布了一篇计算机行业的研究报告,报告指出,重估高ROI场景下游应用。2026H1计算机行业先扬后抑跑输沪深300,AI算力领涨细分赛道,降本带来利润高增,合同负债预示收入将回暖。2026H1,计算机行业呈现“先扬后抑、震荡轮动”的走势,年初至今跑输沪深300。细分赛道涨幅居前的依
- 热门数据榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2026-07-16 14:52
2026-07-16 14:51
2026-07-16 14:50
2026-07-16 14:49
2026-07-16 14:46
2026-07-16 14:44
2026-07-16 14:42
2026-07-16 14:40
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

