系统调用(Linux)

news2025/2/26 14:07:34

目录

1.内核态和用户态:

1.1CPU的两种状态:

1.2CPU 指令集权限:

1.3用户态与内核态的空间:

1.4用户态与内核态的切换:

2.系统调用:

2.1linux框架图:

 2.2系统调用和API:

2.3系统调用号:


1.内核态和用户态:

1.1CPU的两种状态:

用户态: 运行用户程序

内核态:运行操作系统程序,操作硬件

简单来说,低权限的资源范围较小,高权限的资源范围更大

1.2CPU 指令集权限:

   在说用户态与内核态之前,有必要说一下 C P U 指令集,指令集是 C P U 实现软件指挥硬件执行的媒介,具体来说每一条汇编语句都对应了一条 C P U 指令,而非常非常多的 C P U 指令 在一起,可以组成一个、甚至多个集合,指令的集合叫 C P U 指令集

同时 C P U 指令集 有权限分级,大家试想,C P U 指令集 可以直接操作硬件的,要是因为指令操作的不规范`,造成的错误会影响整个计算机系统的。好比你写程序,因为对硬件操作不熟悉,导致操作系统内核、及其他所有正在运行的程序,都可能会因为操作失误而受到不可挽回的错误,最后只能重启计算机才行。

而对于硬件的操作是非常复杂的,参数众多,出问题的几率相当大,必须谨慎的进行操作,对开发人员来说是个艰巨的任务,还会增加负担,同时开发人员在这方面也不被信任,所以操作系统内核直接屏蔽开发人员对硬件操作的可能,都不让你碰到这些 C P U 指令集

针对上面的需求,硬件设备商直接提供硬件级别的支持,做法就是对 C P U 指令集设置了权限,不同级别权限能使用的 C P U 指令集 是有限的,以 Inter C P U 为例,Inter把 C P U 指令集 操作的权限由高到低划为4级:ring 0,ring 1,ring 2,ring 3.

其中 ring 0 权限最高,可以使用所有 C P U 指令集,ring 3 权限最低,仅能使用常规 C P U 指令集,不能使用操作硬件资源的 C P U 指令集Linux系统仅采用ring 0 和 ring 3 这2个权限。

  • ring 0被叫做内核态,完全在操作系统内核中运行
  • ring 3被叫做用户态,在应用程序中运行

1.3用户态与内核态的空间:

以Linux32位操作系统为例,它的寻址空间范围是 4G(2的32次方),而操作系统会把虚拟控制地址划分为两部分,一部分为内核空间,另一部分为用户空间,高位的 1G(从虚拟地址 0xC0000000 到 0xFFFFFFFF)由内核使用,而低位的 3G(从虚拟地址 0x00000000 到 0xBFFFFFFF)由各个进程使用。

  • 用户态:只能操作 0-3G 范围的低位虚拟空间地址
  • 内核态:0-4G 范围的虚拟空间地址都可以操作,尤其是对 3-4G 范围的高位虚拟空间地址必须由内核态去操作
  • 补充:3G-4G 部分大家是共享的(指所有进程的内核态逻辑地址是共享同一块内存地址),是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据

每个进程的 4G 虚拟空间地址,高位 1G 都是一样的,即内核空间。只有剩余的 3G 才归进程自己使用,换句话说就是, 高位 1G 的内核空间是被所有进程共享的!

最后做个小结,我们通过指令集权限区分用户态和内核态,还限制了内存资源的使用,操作系统为用户态与内核态划分了两块内存空间,给它们对应的指令集使用

1.4用户态与内核态的切换:

  • 系统调用:用户态进程主动切换到内核态的方式,用户态进程通过系统调用向操作系统申请资源完成工作,例如 fork()就是一个创建新进程的系统调用,系统调用的机制核心使用了操作系统为用户特别开放的一个中断来实现,如Linux 的 int 80h 中断,也可以称为软中断
  • 异常:当 C P U 在执行用户态的进程时,发生了一些没有预知的异常,这时当前运行进程会切换到处理此异常的内核相关进程中,也就是切换到了内核态,如缺页异常
  • 中断:当 C P U 在执行用户态的进程时,外围设备完成用户请求的操作后,会向 C P U 发出相应的中断信号,这时 C P U 会暂停执行下一条即将要执行的指令,转到与中断信号对应的处理程序去执行,也就是切换到了内核态。如硬盘读写操作完成,系统会切换到硬盘读写的中断处理程序中执行后边的操作等。

2.系统调用:

2.1linux框架图:

 2.2系统调用和API:

Linux的系统调用像大多数Unix系统一样,作为C库的一部分提供,C库实现了Unix系统的主要API,包括标准C库函数和系统调用。所有的C程序都可以使用C库,而由于C语言本身的特点,其他语言也可以很方便地把它们封装起来使用。此外,C库提供了POSIX的绝大部分API。

如图:

 从程序员的角度看,系统调用无关紧要﹔他们只需要跟API打交道就可以了。相反,内核只跟系统调用打交道﹔库函数及应用程序是怎么使用系统调用不是内核所关心的。但是,内核必须时刻牢记系统调用所有潜在的用途并保证它们有良好的通用性和灵活性。

   关于Unix的界面设计有一句通用的格言“提供机制而不是策略”。换句话说,Unix的系统调用抽象出了用于完成某种确定目的的函数。至于这些函数怎么用完全不需要内核去关心。(区别对待机制(mechanism)和策略(policy)是Unix设计中的-大亮点。大部分的编程问题都可以被切割成两个部分:“需要提供什么功能”(机制)和“怎样实现这些功能”(策略)。如果由程序中的独立部分分别负责机制和策略的实现,那么开发软件就更容易,也更容易适应不同的需求。

2.3系统调用号:

         在Linux中,每个系统调用被赋予一个系统调用号。这样,通过这个独一无二的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就被用来指明到底是要执行哪个系统调用;进程不会提及系统调用的名称。
        系统调用号相当关键,一旦分配就不能再有任何变更,否则编译好的应用程序就会崩溃。此外,如果一个系统调用被删除,它所占用的系统调用号也不允许被回收利用,否则,以前编译过的代码会调用这个系统调用,但事实上缺调用的是另一个系统调用。Linux有一个“未实现”系统调用sys_ni_syscall(),它除了返回-ENOSYS外不做任何其他工作,这个错误号就是专门针对无效的系统调用而设的。虽然很罕见,但如果-个系统调用被删除,或者变得不可用,这个函数就要负责“填补空位”。

因为所有的系统调用陷入内核的方式都一样,所以仅仅是陷入内核空间是不够的。因此必须把系统调用号一并传给内核。在x86上,系统调用号是通过eax寄存器传递给内核的。在陷入内核之前,用户空间就把相应系统调用所对应的号放入eax中了。这样系统调用处理程序一旦运行,就可以从eax中得到数据。其他体系结构上的实现也都类似。

给用户空间的返回值也通过寄存器传递。在x86系统上,它存放在eax寄存器中。

 参考文章:

从根上理解用户态与内核态

 《Linux内核设计和实现》      

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

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

相关文章

The release Method

The release Method The role of the release method is the reverse of open. Sometimes youll find that the method implementation is called device_close instead of device_release. Either way, the device method should perform the following tasks: 释放方法的作用…

跟我学 UML 系统建模

UML 系统建模 1 概述 1.1 课程概述 汇集 UML 及其相关的一些话题回顾 UML 相关的符号与概念以电商订单相关业务为例,借助 UML 完成系统建模将 UML 变成提升建模效率,表达架构思想的工具 1.2 什么是 UML ​ Unified Modeling Language 统一建模语言&a…

Leetcode-1753-移除石子的最大得分

1、堆 我们可以维护一个大顶堆,其中储存了三个石子堆中石子的个数。为了确保我们的分数尽可能大,我们每次都需要从最大的两个堆中取出石子。因此我们不断循环,每次都从当前最大的堆中取出石子。值得注意的是,为了确保能够发现游戏…

数据管理篇之存储和成本管理

第14章 存储和成本管理 目标:有效的降低存储资源的消耗,节省存储成本。 1.数据压缩 问题 在分布式文件系统中,为了提高数据的可用性与性能 ,通常会将数据存储3份,这就意味着存储 1TB 的逻辑数据, 实际上…

iOS自动化真机测试验证环境过程中常见问题解析

本文节选自霍格沃兹测试学院内部教材 本章节主要讲解 iOS 自动化真机配置以及在 iOS 真机执行自动化时常见问题与解决方法。 真机使用的Capability 与模拟器不同,真机测试需要如下的 Capability 方式一:设置 App 路径,启动 App(自…

SpringBoot项目开启远程调试

1、服务端设置 cat start.sh #!/bin/bash echo "i will start the program!" java -jar -Xdebug -Xrunjdwp:transportdt_socket,servery,address9999 xxxxx-SNAPSHOT.jar --server.port10991 echo "start success" 2、开发工具设置 3、然后&#…

计算机网络~计算机网络体系结构

一、计算机网络的概念和功能 1. 计算机网络 是一个将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享和信息传递的系统计算机网络是互联的、自治的计算机集合 互联:通过通信链路互联互通自治&a…

π120M30 双通道数字隔离器兼容ADuM3210TRZ 广泛应用于工业自动化系统方案

π120M30 双通道数字隔离器兼容ADuM3210TRZ 广泛应用于工业自动化系统方案 。具有出色的性能特征和可靠性,整体性能优于光耦和基于其他原理的数字隔离器产品。传输通道间彼此独立,可实现多种传输方向的配置,可实现 3.0kV rms 隔离耐压等级和 …

【Java语言】— 类型转换

1.类型转换 (1)自动类型转换 类型范围小的变量,可以直接赋值给类型范围大的变量。 ①自动类型转换的底层原理 ②自动类型转换的其他形式 (2)表达式的自动类型转换 在表达式中,小范围类型的变量会自动转…

python之序列反转

python之序列反转 方式1:.reverse() a [1, 2, 3, 4, 5] print(a.reverse()) # None,函数原地反转,不具备排序功能,而且没有返回值 print(a) # [5, 4, 3, 2, 1]方式2:reversed a [1, 2, 3, 4, 5] print(reversed…

2021年全国职业院校技能大赛网络搭建与应用赛项——国赛组播题

2021年全国职业院校技能大赛网络搭建与应用赛项——国赛组播题 sw1:# ip pim multicast-routing (开启组播模式,在全局模式) int vlan 10 ip pim dense-mode (在接口模式下开启组播-密集模式协议) ip igmp version 2 i…

正大国际期货:恒指德指交易导致亏损的原因是什么?

在交易过程中,经常会遇到我们事先对这次的交易进行了详细的分析推理,还制定了周密可行的策略,但真正落实到交易活动过程中却变得面目全非,屡屡败退,让我们措手不及这样的现象,是什么原因导致?正…

如何开通 API 服务并授予项目 API 服务的调用权限

涂鸦 IoT 开发平台开放多种业务 API 服务,全面覆盖全屋智能管理、行业通用设备用户管理、垂直品类开放能力、各类数据服务等业务需求。 本文将为大家介绍如何开通 API 服务并授予项目 API 服务的调用权限。 个人数据隐私声明 开发者调用的部分 云服务 API 会获取用…

链表(2)------数据结构

1)进行反转单链表:节点的值不发生改变,只需要进行修改节点的指向 进行测试的时候要给方法传入一个头结点 输入:1,2,3,4,5; 输出:5,4,3,2,1; 1)我…

从0到1介绍一下开源大数据比对平台dataCompare

1.背景&现状 在大数据领域也已经工作了多年,无论所待过的大公司还是小公司,都会遇到集群升级迁移过程中据搬迁等相关工作,经常会碰到搬迁之后,搬迁的数据是不是能对的上呢?两边数据究竟是不是一致的呢&#xff1f…

javaee之Mybatis4

延迟加载与立即加载的概念 Mybatis中的延迟加载与立即加载 一、一对一实现延迟加载的步骤(多对一,看成一对一) 我们这里是利用account表中的一个方法来做 先来看IAccountDao里面的一个方法 然后再去看持久层IAccountDao.xml 这个方法给我们…

Linux学习-92-SELinux管理

18 SELinux管理 root 用户在 Linux 系统当中就是无所不能的,而且读、写和执行权限对 root 用户完全没有作用。root 用户的存在极大地方便了 Linux 的管理,但是也造成了一定的安全隐患。绝大多数系统的严重错误都是由于 root 用户的误操作引起的&#xff…

开源项目 Spartacus 的 git 分支使用规范

Spartacus 开源项目里存在如下的 git 分支: feature/GH-xxxx 分支用于简单的功能和错误修复epic/epic-name 分支用于大功能的开发release/1.4.0-rc.0 分支用于特定的发布(你可以将它们与维护分支区分开来,因为包含了完整的版本号&#xff09…

压力测试笔记

压测学习 要求:满足100并发500ms性能要求 压测场景 新系统上线支持 在新系统上线前,通过执行性能压测能够对系统的负载能力有较为清晰的认知,从而结合预估的潜在用户数量保障系统上线后的用户体验。技术升级验证 在系统重构过程中&#xf…

Github每日精选(第80期):自动生成命令行python-fire

Python Fire 是一个用于从绝对任何Python对象自动生成命令行界面 (CLI) 的库。 Python Fire 是一种在 Python 中创建 CLI 的简单方法。 [1]Python Fire 是用于开发和调试 Python 代码的有用工具。 [2]Python Fire 有助于探索现有代码或将其他人的代码转换为 CLI。[3]Python Fi…