Linux 系统调用

系统调用

在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口。
这些接口让应用程序受限地访问硬件设备,提供了创建新进程并与已有进程进行通信的机制,也提供了申请操作系统其他资源的能力。

应用程序发出各种请求,而内核负责满足这些请求(或者无法满足时返回一个错误)。
实际上提供这些接口主要是为了保证系统稳定可靠,避免应用程序恣意妄行。

与内核通信

系统调用在用户空间进程和硬件设备之间添加了一个中间层。
该层主要作用有三个。

首先,它为用户空间提供了一种硬件的抽象接口。
举例来说,当需要读写文件的时候,应用程序就可以不去管磁盘类型和介质,甚至不用去管文件所在的文件系统到底是哪种类型。

系统调用保证了系统的稳定和安全。作为硬件设备和应用程序之间的中间人,内核可以基于权限、用户类型和其他一些规则对需要进行的访问进行裁决。
举例来说,这样可以避免应用程序不正确地使用硬件设备,窃取其他进程的资源,或做出其他危害系统的事情。

在Linux中,系统调用就是用户空间访问内核的唯一手段;除异常和陷入外,它们是内核唯一的合法入口。

API、POSIX和C库

一般情况下,应用程序通过在用户空间实现的应用编程接口(API)而不是直接通过系统调用来编程。
这点很重要,因为应用程序使用的这种编程接口实际上并不需要和内核提供的系统调用对应。

一个API定义了一组应用程序使用的编程接口。
实际上,API可以在各种不同的操作系统上实现,给应用程序提供完全相同的接口,而它们本身在这些系统上的实现却可能迥异。

在这里插入图片描述
在Unix世界中,最流行的应用编程接口是基于POSIX标准的。
从纯技术的角度看,POSIX是由IEEE的一组标准组成,其目标是提供一套大体上基于Unix的可移植操作系统标准。

系统调用

要访问系统调用(在Linux中常称作syscall),通常通过C库中定义的函数调用来进行。
它们通需要定义零个、一个或几个参数,而且可能产生一些副作用。
通常,用一个负的返回值来表明错误。返回一个0值通常表明成功。

系统调用在出现错误的时候C库会把错误码写入errno全局变量。
通过调用perror()库函数,可以把该变量翻译成用户可以理解的错误字符串。

系统调用号

在Linux中,每个系统调用被赋予一个系统调用号。
这样,通过这个独一无二的号就可以关联系统调用。

当用户空间的进程执行一个系统调用的时候,这个系统调用号就用来指明到底是要执行哪个系统调用。

系统调用号想当重要,一旦分配就不能再有任何变更,否则编译好的应用程序就会崩溃。
此外,如果一个系统调用被删除,它所占用的系统调用号也不允许被回收利用,否则,以前编译过的代码会调用这个系统调用,但事实上却调用的是另一个系统调用、

Linux有一个“未实现”系统调用sys_ni_syscall(),它除了返回-ENOSYS外不做任何其它工作,这个错误号就是专门针对无效的系统调用而设的。
虽然很罕见,但如果一个系统调用被删除,或者变得不可用,这个函数就要负责“填补空缺”。

内核记录了系统调用表中的所有已注册过的系统调用的列表,存储在sys_call_table中。这个表为每一个有效的系统调用指定了唯一的系统调用号。

系统调用的性能

Linux系统调用比其它许多操作系统执行得要快。
Linux很短的上下文切换时间是一个重要原因,进出内核都被优化得简洁高效。

系统调用处理程序

用户空间的程序无法直接执行内核代码。
它们不能直接调用内核空间中的函数,因为内核驻留在受保护的地址空间上。

如果进程可以直接在内核的地址空间上读写的话,系统的安全性和稳定性将不复存在。

所以,应用程序应该以某种方式通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用。

通知内核的机制是靠软中断实现的。
通过引发一个异常来促使系统切换到内核态去执行异常处理程序。
此时的异常处理程序实际上就是系统调用处理程序。

system_call()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WEB渗透—PHP反序列化(八)

Web渗透—PHP反序列化 课程学习分享(课程非本人制作,仅提供学习分享) 靶场下载地址:GitHub - mcc0624/php_ser_Class: php反序列化靶场课程,基于课程制作的靶场 课程地址:PHP反序列化漏洞学习_哔哩…

持续集成交付CICD:Linux 部署 Jira 9.12.1

目录 一、实验 1.环境 2.K8S master节点部署Jira 3.Jira 初始化设置 4.Jira 使用 一、实验 1.环境 (1)主机 表1 主机 主机架构版本IP备注master1K8S master节点1.20.6192.168.204.180 jenkins slave (从节点) jira9.12.1…

【强化学习】循序渐进讲解Deep Q-Networks(DQN)

文章目录 1 Q-learning与Deep Q-learning2 DQN的结构组成3 DQN创新技术(重点)3.1 Experience Replay(经验回放)3.2 Fixed Q-Target(固定Q目标)3.3 Double Deep Q-Learning(双重深度Q学习方法&am…

momentum2靶机

文章妙语 遇事不决,可问春风; 春风不语,遵循己心。 文章目录 文章妙语前言一、信息收集1.IP地址扫描2.端口扫描3.目录扫描 二,漏洞发现分析代码bp爆破1.生成字典2.生成恶意shell.php2.抓包 三,漏洞利用1.反弹shell 四…

pytorch张量的创建

张量的创建 张量(Tensors)类似于NumPy的ndarrays ,但张量可以在GPU上进行计算。从本质上来说,PyTorch是一个处理张量的库。一个张量是一个数字、向量、矩阵或任何n维数组。 import torch import numpy torch.manual_seed(7) # 固…

深圳鼎信|输电线路防山火视频监控预警装置:森林火灾来袭,安全不留白!

受线路走廊制约和环保要求影响,输电线路大多建立在高山上,不仅可以减少地面障碍物和人类活动的干扰,还能提高线路的抗灾能力和可靠性。但同时也会面临其它的难题,例如森林火灾预防。今天,深圳鼎信智慧将从不同角度分析…

随机森林 2(决策树)

通过 随机森林 1 的介绍,相信大家对随机森林都有了一个初步的认知,知道了随机和森林分别指的是什么,以及决策树根据什么选择内部节点。本文将会从森林深入到树,去看一下决策树是如何构建的。网上很多文章都讲了决策树如何构建&…

幺模矩阵-线性规划的整数解特性

百度百科:幺模矩阵 在线性规划问题中,如果A为幺模矩阵,那么该问题具有最优整数解特性。也就是说使用单纯形法进行求解,得到的解即为整数解。无需再特定使用整数规划方法。 m i n c T x s . t . { A x ≥ b x ≥ 0 \begin{align*} min \quad…

Java动态代理Proxy(通俗易懂,一学就会)

为什么需要代理?代理长什么样? 代理实现案例代码 1.中介接口(约束代理方法) 2.BigStar(被代理) 实现接口方法 3.代理工具类 invoke方法中的proxy表示代理对象,method表示代理获取到调用的方法对…

Go 代码检查工具 golangci-lint

一、介绍 golangci-lint 是一个代码检查工具的集合,聚集了多种 Go 代码检查工具,如 golint、go vet 等。 优点: 运行速度快可以集成到 vscode、goland 等开发工具中包含了非常多种代码检查器可以集成到 CI 中这是包含的代码检查器列表&…

Linux配置环境变量的几种方式

​ 📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试…

青少年CTF-qsnctf-Web-include01include02(多种方法-知识点较多-建议收藏!)

PHP常见伪协议 php://filter是PHP中独有的一种协议,它是一种过滤器,可以作为一个中间流来过滤其他的数据流。通常使用该协议来读取或者写入部分数据,且在读取和写入之前对数据进行一些过滤,例如base64编码处理,rot13处…

【MybatisPlus快速入门】(2)SpringBoot整合MybatisPlus 之 标准数据层开发 代码示例

目录 1 标准CRUD使用2 新增3 删除4 修改5 根据ID查询6 查询所有7 MyBatis-Plus CRUD总结 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介,在这一节中我们重点学习的是数据层标准的CRUD(增删改查)的实现与分页功能。代码比较多,我们一个个来学习…

AtomHub 开源容器镜像中心开放公测,国内服务稳定下载

由开放原子开源基金会主导,华为、浪潮、DaoCloud、谐云、青云、飓风引擎以及 OpenSDV 开源联盟、openEuler 社区、OpenCloudOS 社区等成员单位共同发起建设的 AtomHub 可信镜像中心正式开放公测。AtomHub 秉承共建、共治、共享的理念,旨在为开源组织和开…

OpenCV-Python(19):Canny边缘检测

目录 学习目标 Canny 边缘检测原理 1.噪声抑制(噪声去除) 2.梯度计算 3.非极大值抑制 4.双阈值检测(滞后阈值) 5.边缘连接 Canny 边缘检测步骤 Canny 边缘检测的OpenCV实现 不同阈值的边缘检测效果 学习目标 了解Canny边缘检测的概念学习掌握函数cv2.Canny()的用法 …

C++加法运算符的重载(operator)

1.重载加法运算符 为什么要重载加法运算符? 因为C提供的加法运算符只能满足基本数据类型间的加法,如果我想让俩个相同的类的对象进行加法的话会报错 所以为了能让俩个相同类的对象进行加法,我们要把这个过程封装到一个函数里面,只…

使用低代码工具构建电商平台:简化开发流程,加速应用搭建

在数字化时代,电商平台成为了各类企业的重要组成部分。然而,传统的软件开发过程往往漫长而复杂,需要大量的编码和调试工作。随着低代码工具的出现,开发者可以通过简化的方式来搭建电商平台应用,从而更快速地满足业务需…

Netty Review - 优化Netty通信:如何应对粘包和拆包挑战_自定义长度分包编解码码器

文章目录 概述Pre概述Code自定义协议自定义解码器服务端的消息处理客户端启动类自定义编码器客户端业务处理Handler 测试 概述 Pre Netty Review - 借助SimpleTalkRoom初体验异步网络编程的魅力 Netty Review - 优化Netty通信:如何应对粘包和拆包挑战 中我们遗留了…

【Linux】多线程

目录​​​​​​​ Linux线程概念 1. 什么是线程 2. 重新定义线程和进程 3. 重讲地址空间 4. 线程的优点 5. 线程的缺点 6. 线程异常 7. 线程用途 Linux进程VS线程 1. 进程和线程 2. 进程的多个线程共享 3. 线程为什么进程要更加轻量化? Linux线程…

盲盒小程序搭建:开启互联网盲盒时代

盲盒目前是一个非常火爆的商业模式。随着科技的发展,盲盒市场也开始采用线上盲盒进行拓客,吸引盲盒爱好者。当下在互联网电商影响下,盲盒小程序逐渐受到了商家的青睐。 线上盲盒市场 盲盒消费主要是根据自身的未知性吸引消费者,消…