服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

深入理解Linux系统调用

日期: 来源:码农的荒岛求生收集编辑:码农的荒岛求生
大家好,我是小风哥。

在前两篇文章《为什么计算机需要操作系统》《系统调用与函数调用有什么区别》中我们了解了什么是系统调用、为什么需要系统调用、系统调用与函数调用有什么区别,那么在今天的文章中我们从理论来到现实,看看Linux中的系统调用是怎样实现的。

首先我们先来简单复习下之前讲解过的知识。

系统调用和普通的函数调用没有本质区别,普通的函数调用一般调用的是我们自己编写的函数或者其它库函数,而系统调用调用的则是内核中的函数,更学术一点的说法是这样的,所谓系统调用是指用户态程序请求操作系统提供的服务。

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

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

更通俗的说法就是所谓系统调用是指用户态的某个函数调用内核中的某个函数。
接下来我们用一段简单的hello world程序看下系统调用,这段程序需要运行在x86_64下:
.datamsg:    .ascii "Hello, world!\n"    len = . - msg.text    .global _start_start:    movq  $1, %rax    movq  $1, %rdi    movq  $msg, %rsi    movq  $len, %rdxsyscall    movq  $60, %rax    xorq  %rdi, %rdisyscall
使用以下命令编译:
$ 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执行某个函数时必须知道某个函数在内存中的地址,那么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中这样:
0  common  read      sys_read1  common  write      sys_write2  common  open      sys_open3  common  close      sys_close4  common  stat      sys_newstat5  common  fstat      sys_newfstat6  common  lstat      sys_newlstat7  common  poll      sys_poll8  common  lseek      sys_lseek9  common  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函数所需要的参数是什么。

好啦,这篇就到这里,最后,我准备开通知识星球啦,我会把所有文章中留下的问题总结在这里,同时也鼓励大家在这里输出自己的深度、系统性的思考,沉淀出属于自己的知识。


相关阅读

  • 再见, 8 点网格系统!

  • 过去,我们一直在使用8点网格系统,它帮助我们在UI界面中,或者一致性上做了有力的贡献。但是今天我想说8点网格系统其实并非最完美的,我们可以选择4点网格系统,他灵活性更强,今天文
  • 重磅,avantage开始支持win11

  • 写在前面:有需要的可以在win11试试,找了几个小伙伴是成功了,至于是不是所有的都能成功,我不知道。之前我们介绍过avantage的多个安装教程,在之前59系列一般适用于win10系统,只有极
  • 北斗深度服务地图导航,日定位量超3000亿次

  • 近日,高德地图与千寻位置在北京举行新闻发布会,宣布双方达成战略合作协议,共同发起“北斗出行应用创新计划”,助力北斗系统在交通出行场景更广泛落地。该计划旨在联合各界技术力
  • 产品更新 | 网镜国产化操作系统版本正式上线

  • 关于本次网镜更新推文,小编想说我们为什么要做支持国产化操作系统的应用。为什么要毫不动摇坚持自主可控的“国产化”道路?不自主意味着需要在国际市场上高价采购;不可控意味着
  • elementary OS 7 安装指南(附截图) | Linux 中国

  • 导读:在这篇文章中,我们将介绍如何在笔记本电脑或台式机上一步一步地安装 elementary OS 7,并附有截图。本文字数:1931,阅读时长大约:2分钟在这篇文章中,我们将介绍如何在笔记本电
  • 智能家居大百科二|智能家居起源与运用

  • 点击上方“蓝字”,关注更多精彩据申万宏源测算,2022年全屋智能市场规模将达到215亿元,2025年则有望突破500亿元,对智能家居行业贡献将超过15%。智能家居市场正在飞速发展,它是如
  • 摊牌了,我不飘了

  • 对于一个在手表定位上有所追求的手表厂商,我们最怕收到的反馈就是↓遇到这种情况,对待用户我们自然是唯唯诺诺,对待同事那肯定要重拳出击,对负责定位的产品经理重则将其祭天,轻则

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • 深入理解Linux系统调用

  • 大家好,我是小风哥。在前两篇文章《为什么计算机需要操作系统》《系统调用与函数调用有什么区别》中我们了解了什么是系统调用、为什么需要系统调用、系统调用与函数调用有什
  • 世界糖尿病日||中医话中医糖尿病“消渴病”

  • 2022.11.14世 界 糖 尿 病 日控制血糖全身健康- 人人享有糖尿病健康管理 -中医话·糖尿病西医学中的糖尿病在中医归属于“消渴病”的范畴,消渴是以多饮、多食、多尿、身体消
  • 喜讯!25项科研成果获奖,获奖数创历史新高!

  • 本文转自北京中医药大学官方公众号近日,中华中医药学会公布了2022年度中华中医药学会科学技术奖励评审结果。我校前期积极进行相关宣讲、做好组织申报工作,并召开多轮专家论证
  • ChatGPT与超级个体的诞生

  • 大家好,我是小风哥,这是一份迟来的chatGPT评测。今天简单试了下,试完有想充会员的冲动,Google这么慌是有道理的,这东西的确有点颠覆的意思,使用过程中后背阵阵发凉,这个工具会让能
  • 拖了个拖,快给自己一颗抗拖延妙药吧

  • 本文转自北京中医药大学官方公众号\ | /想想今晨的你是不是窝在宿舍暖洋洋的床上在计划应该学习的时间里打开手机摸着鱼是不是为了双十一熬了夜红了眼守着整点去抢个限时秒
  • 【招办日报】早八防困指南

  • zhāo招bàn办rì日bào报TM:202211.17防困指南据前线杏仁er记者报道,春困、秋乏、夏打盹、冬眠,总有那么一个时间睡意昏沉,精神不振,效率低下,集中于“早八人”的早八时刻...莫慌