Linux系统基础——系统调用

news2024/12/26 22:16:29

Linux系统调用

特此说明: 刘超的趣谈linux操作系统是比较重要的参考资料,本文大部分内容和所有图片来源于这个专栏。

1 相关概念

程序vs进程vs命令: Linux系统上所有的操作由进程完成,进程的运行是动态的,在此之前是一个静态的程序。用户用一个程序来启动一个进程,这个程序可以是别人写好的(最终被编译成可执行文件),比如lspwdcat,也可以是我们自己写的。

系统调用: 无论如何,程序最后运行起来都是进程,并且一个程序想要在系统上跑,要用到系统调用,这是系统给用户提供的API接口。

trace命令: Linux有个命令strace,常用来跟踪进程执行时系统调用和所接收的信号。通过manstrace查看具体描述。

Glibc: 作为一个开发者,也许平时并没有直接使用系统调用,而是Glibc库。Glibc是Linux下使用的开源的标准C库它是GNU发布的libc库。Glibc即系统调用的封装。

2 系统调用

然后本文开始介绍这些系统调用,先上图

在这里插入图片描述

2.1 进程管理

linux操作系统使用fork从父进程中创建子进程,子进程execve运行程序(二进制文件),父进程waitpid等待子进程结束。

所有进程都是父进程fork出来的,对于操作系统而言第一个鼻祖进程是哪来的呢? 系统启动的时候先创建一个所有用户进程的“祖宗进程”。

2.2 内存管理

在操作系统中,每个进程都有自己的进程内存空间。其中布局就有代码段数据段

一个进程的内存空间是很大的,32位的是4G,64位的就更大了。物理空间是有限的,所以进程的空间不能事先分配好的,一定是需要的时候再分配。

brkmmap是官员堆分配内存的系统调用,分配内存数量比较小的时候,使用brk会和原来的堆的数据连在一起。当分配的内存数量比较大的时候,使用mmap,会重新划分一块区域。

2.3 文件管理

文件系统相当于公司的资料库,用于保存一些永久性质的数据。能做到长期保存,文件之所以能做到这一点,一方面是因为介质,另一方面是因为格式

对于文件的操作,无非是创建creat打开open读read写write等等

Linux中一切皆文件就包括二进制文件文本文件stdout文件Socket文件设备文件目录文件,包括进程运行起来在/proc下生成的进程号也是文件。对于每一个文件,Linux分配了文件描述符,这是一个整数。

2.4 信号处理

信号是异步处理机制,用于紧急突发情况。每一种信号都有默认动作,当然用户也能编写信号处理函数,通过sigaction系统调用进行处理。

2.5 进程间通信

本地进程之间实现数据的互通,比较常见的处理机制有消息队列共享内存

通过msgget创建一个新的队列,msgsnd将消息发送到消息队列,而消息接收方可以使用msgrcv从队列中取消息; 我们可以通过shmget创建一个共享内存块,通过shmat将共享内存映射到自己的内存空间,然后就可以读写了。

2.6 网络通信

内核中有TCP/IP网络协议栈的实现,可以通过socket来实现跨系统的进程间通信。

3 入口文件

下载内核源码,找到./include/asm-x86_64/unistd.h文件,里面对于系统调用的定义

hinzer@ubuntu:linux-2.6.11$ head ./include/asm-x86_64/unistd.h
#ifndef _ASM_X86_64_UNISTD_H_
#define _ASM_X86_64_UNISTD_H_

#ifndef __SYSCALL
#define __SYSCALL(a,b) 
#endif

/*
 * This file contains the system call numbers.
 *

4 调用过程

进程通过系统调用从用户态到内核态,用户态 - 系统调用 - 保存寄存器 - 内核态执行系统调用 - 恢复寄存器 - 返回用户态。对于应用开发,上层还通过glibc库(对系统调用的一个封装库)。

从glibc提供的open函数出发,剖析如何从glibc的open调用到内核的sys_open!!!

4.1 glibc封装

# 以下相关文件
./sysdeps/unix/syscalls.list   # 列出所有glibc的函数对应的系统调用
./sysdeps/unix/make-syscalls.sh # 根据上面的配置文件,对于每一个封装好的系统调用,生成一个文件
./sysdeps/unix/syscall-template.S  # 定义了这个系统调用的调用方式
./sysdeps/hppa/sysdep.h   # 通过 `vim -t PSEUDO` 找到 PSEUDO 这个宏的定义。

经过分析: open函数的代码逻辑,得出结论: 对于任何的系统调用,会调用DO_CALL。这也是一个宏,这个宏 32 位和 64 位的定义是不一样的。

4.2 32位系统调用过程

继续分析glibc源码,发现宏DO_CALL定义处unix/sysv/linux/i386/sysdep.h

理解: 用户调用通过软中断进入内核态,在系统调用表中找到对应的内核系统调用,执行内核调用之前保存用户态寄存器,执行内核调用后返回并恢复用户态。

在这里插入图片描述

4.3 64位系统调用过程

DO_CALL定义在源码位置unix/sysv/linux/x86_64/sysdep.h,还是将系统调用名称转换为系统调用号,放到寄存器 rax。和32位不同的是,这里是真正进行调用,不是用中断了,而是改用 syscall 指令了,而且传递参数的寄存器也变了。

理解: 用户调用通过syscall指令进入内核态,在系统调用表中找到对应的内核系统调用,执行内核调用之前保存用户态寄存器,执行内核调用后返回并恢复用户态。

4.4 完整流程

在这里插入图片描述

5 补充知识

5.1 系统调用表

数据结构定义在arch/x86/entry/syscall_64.c,系统调用列表输出在arch/x86/entry/syscalls/syscall_64.tbl

#系统调用号 abi类型 函数名                      系统调用名
2       common  open                    sys_open

5.2 系统调用函数声明

声明在include/linux/syscalls.h,找到有sys_open 的声明

5.3 系统调用函数实现

内核系统调用实现和声明一致,其中fs/open.c

5.4 编译规则

接下来,在编译的过程中,需要根据 syscall_32.tbl 和 syscall_64.tbl 生成自己的 unistd_32.h 和 unistd_64.h。在文件arch/x86/entry/syscalls/Makefile

9 References

  • 趣谈Linux操作系统 - 05系统调用
  • 趣谈Linux系统专栏 - 09系统调用
  • 如何下载查看glibc源代码
  • glibc源码分析(一)系统调用
  • linux下实现一个系统调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/113505.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2年过去了,有谁还记得曾想取代Node.js的他?

大家好,我卡颂。 22年11月14日,Deno发布了v1.28,距离他第一个稳定版本v1.0.0发布(2020年5月13日)已过去2年。 作为Node.js的竞争者,Deno似乎并没有达到取代前者的目标。 甚至,他在前端社区的…

离散数学数理逻辑部分【1】

前言 本文创作的起因是,经历了离散数学的学习,深感学习离散之艰辛。所以产生了写一些内容帮助大家期末复习。虽然在csdn发表本文,有些不太合适,但是还是相信本文的质量和内容,可以给正在学习离散数学的大学生提供一些…

【数据结构】—— 队列(有序队列及环形队列的数组实现)

目录 队列的一个使用场景 什么是队列? 数组模拟队列 实现思路: 编写一个ArrayQueue类的代码实现过程 判断队列是否满和空 入队出队 显示队列数据 问题 用数组模拟队列你会发现使用一次之后就不能使用了 ,没有达到复用的效果。 数组…

yolov5s融合SPD-Conv用于提升小目标和低分辨率图像检测性能实践五子棋检测识别

今天刚发表的一篇论文提出来了针对小目标和低分辨率图像检测性能提升的技术SPD-Conv,感觉还是挺有意义的,今天主要是基于这项技术融合进yolov5s模型中来开发对应的目标检测模型,实现五子棋的检测,本身五子棋就是比较密集的小目标检…

RV1126笔记十五:吸烟行为检测及部署<二>

若该文为原创文章,转载请注明原文出处。 PC下yolov5环境搭建 我使用的训练环境是Windows10+MiniConda 接下来记录搭建全过程 备注:条件允许就使用ubuntu物理机,最好要有显卡,训练有显卡速度会快很多,没有显卡,训练300轮,亲测大概40小时,不值得。 一、miniconda 安装…

Linux常用操作(上)

目录 快捷键 设置别名 通配符 重定向 进阶查找 打包压缩 压缩(gz) 压缩(zip) 快捷键 设置别名 通配符 重定向 进阶查找 打包压缩 压缩(gz) touch {0..10}.txt tar -cvf my.tar [0-10].txt tar -…

2022圣诞代码合集(圣诞树+圣诞老人)

文章目录前言使用方法圣诞树圣诞老人前言 圣诞节里的喜悦,飘扬万里;圣诞树上的星星,璀璨耀眼;圣诞星空绽放的烟花,迎来吉祥;圣诞钟声奏响的旋律,传递欢乐;圣诞老人送给你的礼物&…

实现安卓PWM-LED设备驱动:不写一行代码

文章目录一、前言二、系列文章三、准备工作3.1 查找PWM引脚3.2 原理图:确认引脚位置3.3 PWM Controller四、查阅PWM bindings五、编写设备树节点5.1 实现节点:pwm-leds5.2 测试命令六、后语一、前言 在完成了基于GPIO的LED设备驱动的文章后,…

软件定义网络SDN(计算机网络-网络层)

目录 软件定义网络SDN 数据平面和控制平面 SDN 最重要的三个特征 控制平面与数据平面分离 SDN 的数据平面 软件定义网络SDN SDN的本质特点是控制平面和数据平面的分离以及网络的可编程性,从而实现了网络流量的灵活控制,方便用户管理和配置网络以及部…

2022(一等奖)B1014基于深度学习与街景图像的城市色彩感知与分析——以深圳市罗湖区为例

小组编号:B1014(一等奖) 作品名称:基于深度学习与街景图像的城市色彩感知与分析——以深圳罗湖区为例 作者单位:深圳大学建筑与城市规划学院 小组成员:吴若楠,曾绿,廖童欣,李丁一祺 指导老师:涂伟 作品视频 ,时长14:53 作品介绍 1 应用背景 城市色彩是指城市外部空…

云服务器安装Tomcat并设置域名解析

文章目录一、操作环境二、安装Tomcat服务器1.上传并解压压缩包2.配置Java环境3.启动Tomcat服务三、设置域名解析一、操作环境 操作系统版本:Ubuntu 20.04 64位 jdk版本:jdk-8u211-linux-x64(版本尽量不要太高) Tomcat版本&#x…

SpringFrameWork最基本框架场景及其原理

Hook扩展点 Hook钩子是一种编程思想,也是监听者模式的一种实现。在控制中心的执行过程(可理解也模板方法)中,会调用分阶段或者分层次来调用用户注册进来的Hook方法,用来修改或者监听控制中心的逻辑。如果需要将控制中心的内容暴露出来&#…

node.js+uni计算机毕设项目二手物品交易论坛小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

第10章_索引优化与查询优化

第10章_索引优化与查询优化 都有哪些维度可以进行数据库调优?简言之: 索引失效、没有充分利用到索引——索引建立关联查询太多JOIN (设计缺陷或不得已的需求)——SQL优化服务器调优及各个参数设置(缓冲、线程数等)———调整my.cnf。数据过多――分库分表 关于数据库调优的…

C++ 配置opencv 4.5.0开发环境

C++ 配置opencv 4.5.0开发环境 一、安装包下载二、安装过程三、VS环境配置一、安装包下载 这里提供两种下载方法:   1. opencv官网   2. csdn资源下载 二、安装过程 2.1 下载opencv-4.5.0安装包  2.2 双击开始安装,选择要安装目录,点击Extract。  2.3 等待解压完成…

包教包会——Cookie、Session、Token、JWT

前言 最近在做一个登陆注册的功能,这个功能要用到JWT鉴权。提到鉴权又想到自己直接学的Cookie,Session,Token。就想干脆也用一篇文章小小的概括一下。 😋😋 用文章输出这种方式来记录学习过程,并且日后可…

初识Node.js与内置模块

文章目录目标一、初识 Node.js1、回顾与思考(1)已经掌握了哪些技术(2)浏览器中的 JavaScript 的组成部分(3)思考:为什么 JavaScript 可以在浏览器中被执行(4)思考&#x…

Python图像处理【6】通过哈希查找重复和类似的图像

通过哈希查找重复和类似的图像0. 前言1. 哈希函数2. 使用哈希函数查找重复图像3. 使用感知哈希函数查找相似图像3.1 感知哈希函数3.2 查找相似图像4.3 查找指定目录中的相似图像小结系列链接0. 前言 在本节中,我们将讨论图像搜索中的两个相关问题,即使用…

node.js+uni计算机毕设项目贵州苗族文化展播微信小程序(程序+小程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置: Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等…

IP多播(计算机网络-网络层)

目录 一对多通信的应用需求 单播 vs 多播 多播路由器(Multicast Router) IP 多播的一些特点 D 类 IP 地址与以太网多播地址的映射关系 IP多播需要两种协议 互联网组管理协议 IGMP 多播路由选择协议 两种多播路由选择方法 建议的IP多播路由选择协…