当前位置: 首页 > news >正文

操作系统基础:05 系统调用实现

一、系统调用概述

  • 上节课讲解了系统调用的概念,系统调用是操作系统给上层应用提供的接口,表现为一些函数,如open、read、write 等。上层应用程序通过调用这些函数进入操作系统,使用操作系统功能,就像插座一样,看似简单易用,但本讲要探究其背后的实现机制。

二、系统调用的直观想法及问题

  • 以whoami系统调用为例
    在这里插入图片描述

    用户程序调用whoami,目的是取出操作系统中(系统引导时载入)的字符串“lizhijun”并打印。直观想法是,应用程序和操作系统都在内存中,为何不能直接访问内核内存,直接调用printf打印内核中的字符串呢?

  • 不可行原因:如果允许随意调用内核数据、随意跳转(jmp),会带来严重安全问题。比如可能泄露root密码,导致非法获取用户权限;还可能查看他人word内容,侵犯用户隐私。所以,应用程序不能直接访问内核内存。

三、内核态与用户态及内存分段

  • 硬件设计实现隔离
    在这里插入图片描述

    硬件设计区分了内核态和用户态 ,通过处理器保护环实现。用CS的最低两位表示当前程序执行状态,0是内核态,3是用户态。内核态可访问任何数据,用户态不能访问内核数据,指令跳转也受此限制,实现了内核程序和用户程序的隔离。

  • 内存分段及特权级检查:内存对应分为内核段和用户段,通过段寄存器中的CPL(当前特权级)和DPL(目标特权级)等信息来检查访问是否合法。DPL用来表示目标内存段的特权级,操作系统初始化时将内核段的DPL设为0 。CPL表示当前的特权级,数字越大特权级越低,3表示用户态。每次访问时,要求DPL≥CPL且DPL≥RPL(请求特权级 ),若不满足特权级要求则无法访问。

四、进入内核的方法——中断

  • 中断指令int:对于Intel x86架构,硬件提供的主动进入内核的方法是中断指令int 。
    在这里插入图片描述

    int指令会使CS中的CPL改成0,从而进入内核,这是用户程序调用内核代码的唯一方式。

  • 系统调用核心要点

    • 用户程序中包含一段含int指令的代码,通常由库函数展开生成。
    • 操作系统编写中断处理程序,获取想调用程序的编号。
    • 操作系统根据编号执行相应代码。

五、系统调用实现流程

  • 以printf调用为例
    在这里插入图片描述

    应用程序调用printf,经C函数库处理,先由库函数printf转换为库函数write,最终展开成包含int 0x80指令的代码。

    在Linux系统中,以write系统调用为例
    在这里插入图片描述

    使用_syscall3宏展开代码,_NR_write是其系统调用号(值为4 )。在展开的汇编代码中,系统调用号放在eax中,同时eax也存放返回值,ebx、ecx、edx存放3个参数,通过int 0x80指令进入内核。

六、int 0x80中断处理

  • 中断处理设置:系统通过set_system_gate函数设置0x80的中断处理
    在这里插入图片描述

    将中断处理函数入口地址等信息设置到中断描述符表(idt)中,其中DPL设为3,使得用户态代码(CPL = 3 )能通过int 0x80中断进入内核。执行int 0x80指令时,会根据idt表找到对应的中断处理程序system_call 。

七、中断处理程序system_call

  • 处理流程:在system_call中断处理程序中,
    在这里插入图片描述
    首先会检查系统调用号是否合法,然后保存相关寄存器,设置内核数据段,通过系统调用号在_sys_call_table函数表中查找对应的处理函数。比如对于write系统调用,系统调用号为4,就会找到sys_write函数执行相应操作。执行完毕后恢复寄存器,返回用户态。

    _sys_call_table是一个全局函数数组,
    在这里插入图片描述
    存放着各个系统调用对应的处理函数指针。

八、总结

在这里插入图片描述

  • 系统调用从用户态应用程序发起,借助库函数将系统调用展开为含int 0x80指令的代码,通过中断进入内核态,在内核中根据系统调用号执行相应处理函数,完成后返回用户态。这一机制既为应用程序提供了访问内核功能的途径,又保障了系统的安全稳定,理解其原理对深入掌握操作系统及开发应用程序意义重大。

相关文章:

操作系统基础:05 系统调用实现

一、系统调用概述 上节课讲解了系统调用的概念,系统调用是操作系统给上层应用提供的接口,表现为一些函数,如open、read、write 等。上层应用程序通过调用这些函数进入操作系统,使用操作系统功能,就像插座一样&#xf…...

“堆积木”式话云原生微服务架构(第一回)

模块1:文章目录 目录 1. 云原生架构核心概念 2. Java微服务技术选型 3. Kubernetes与服务网格实战 4. 全链路监控与日志体系 5. 安全防护与性能优化 6. 行业案例与未来演进 7. 学习路径与资源指引 8. 下期预告与扩展阅读 模块2:云原生架构核心概念 核…...

Java 性能优化:从原理到实践的全面指南

性能优化是 Java 开发中不可或缺的一环,尤其在高并发、大数据和分布式系统场景下,优化直接影响系统响应速度、资源利用率和用户体验。Java 作为一门成熟的语言,提供了丰富的工具和机制支持性能调优,但优化需要深入理解 JVM、并发模…...

基于ssm网络游戏推荐系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统网络游戏管理采取了人工的管理方法,但这种管理方…...

HTTP:五.WEB服务器

web服务器 定义:实现提供资源或应答的提供者都可以谓之为服务器!web服务器工作内容 接受建立连接请求 接受请求 处理请求 访问报文中指定的资源 构建响应 发送响应 记录事务处理过程 Web应用开发用到的一般技术元素 静态元素:html, img,js,Css,SWF,MP4 动态元素:PHP,…...

synchronized轻量级锁的自旋之谜:Java为何在临界区“空转“等待?

从餐厅等位理解自旋锁的智慧 想象两家不同的餐厅: 传统餐厅:没座位时顾客去逛街(线程挂起,上下文切换)网红餐厅:没座位时顾客在门口短时间徘徊(线程自旋,避免切换) Ja…...

基于redis 实现我的收藏功能优化详细设计方案

基于redis 实现我的收藏功能优化详细设计方案 一、架构设计 +---------------------+ +---------------------+ | 客户端请求 | | 数据存储层 | | (收藏列表查询) | | (Redis Cluster) | +-------------------…...

【深度学习与大模型基础】第10章-期望、方差和协方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么? 期望(Expectation)可以理解为“长期的平均值”。比如: 掷骰子:一个6面骰子的点数是1~6&#x…...

JavaScript 性能优化实战:深入探讨 JavaScript 性能瓶颈,分享优化技巧与最佳实践

在当今 Web 应用日益复杂的时代,JavaScript 性能对于用户体验起着决定性作用。缓慢的脚本执行会导致页面加载延迟、交互卡顿,严重影响用户留存率。本文将深入剖析 JavaScript 性能瓶颈,并分享一系列实用的优化技巧与最佳实践,助你…...

上篇:《排序算法的奇妙世界:如何让数据井然有序?》

个人主页:strive-debug 排序算法精讲:从理论到实践 一、排序概念及应用 1.1 基本概念 **排序**:将一组记录按照特定关键字(如数值大小)进行递增或递减排列的操作。 1.2 常见排序算法分类 - **简单低效型**&#xff…...

目前状况下,计算机和人工智能是什么关系?

目录 一、计算机和人工智能的关系 (一)从学科发展角度看 计算机是基础 人工智能是计算机的延伸和拓展 (二)从技术应用角度看 二、计算机系学生对人工智能的了解程度 (一)基础层面的了解 必备知识 …...

【复旦微FM33 MCU 底层开发指南】高级定时器ATIM

0 前言 本系列基于复旦微FM33LC0系列MCU的DataSheet编写,提供基于寄存器开发指南、应用技巧、注意事项等 本文章及本系列其他文章将持续更新,本系列其它文章请跳转↓↓↓ 【复旦微FM33 MCU 寄存器开发指南】总集篇 本文章最后更新日期:2025…...

vdso概念及原理,vdso_fault缺页异常,vdso符号的获取

一、背景 vdso的全称是Virtual Dynamic Shared Object,它是一个特殊的共享库,是在编译内核时生成,并在内核镜像里某一段地址段作为该共享库的内容。vdso的前身是vsyscall,为了兼容一些旧的程序,x86上还是默认加载了vs…...

4.13学习总结

学习完异常和文件的基本知识 完成45. 跳跃游戏 II - 力扣(LeetCode)的算法题,对于我来说,用贪心的思路去写该题是很难理解的,很难想到,理解了许久,也卡了很久。...

Day14:关于MySQL的索引——创、查、删

前言:先创建一个练习的数据库和数据 1.创建数据库并创建数据表的基本结构 -- 创建练习数据库 CREATE DATABASE index_practice; USE index_practice;-- 创建基础表(包含CREATE TABLE时创建索引) CREATE TABLE products (id INT PRIMARY KEY…...

概率论与数理统计核心知识点与公式总结(就业版)

文章目录 概率论与数理统计核心知识点与公式总结(附实际应用)一、概率论基础1.1 基本概念1.2 条件概率与独立性 二、随机变量及其分布2.0 随机变量2.0 分布函数(CDF)2.1 离散型随机变量2.2 连续型随机变量2.3 多维随机变量2.3.1 联…...

AF3 ProteinDataset类的_patch方法解读

AlphaFold3 protein_dataset模块 ProteinDataset 类 _patch 方法的主要目的是围绕锚点残基(anchor residues)裁剪蛋白质数据,提取一个局部补丁(patch)作为模型输入。 源代码: def _patch(self, data):"""Cut the data around the anchor residues."…...

openssh 10.0在debian、ubuntu编译安装 —— 筑梦之路

OpenSSH 10.0 发布:一场安全与未来兼顾的大升级 - Linux迷 OpenSSH: Release Notes sudo apt-get updatesudo apt install build-essential zlib1g-dev libssl-dev libpam0g-dev libselinux1-devwget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/opens…...

Go 跨域中间件实现指南:优雅解决 CORS 问题

在开发基于 Web 的 API 时,尤其是前后端分离项目,**跨域问题(CORS)**是前端开发人员经常遇到的“拦路虎”。本文将带你了解什么是跨域、如何在 Go 中优雅地实现一个跨域中间件,支持你自己的 HTTP 服务或框架如 net/htt…...

【数据结构_6】双向链表的实现

一、实现MyDLinkedList(双向链表) package LinkedList;public class MyDLinkedList {//首先我们要创建节点(因为双向链表和单向链表的节点不一样!!)static class Node{public String val;public Node prev…...

【双指针】专题:LeetCode 1089题解——复写零

复写零 一、题目链接二、题目三、算法原理1、先找到最后一个要复写的数——双指针算法1.5、处理一下边界情况2、“从后向前”完成复写操作 四、编写代码五、时间复杂度和空间复杂度 一、题目链接 复写零 二、题目 三、算法原理 解法:双指针算法 先根据“异地”操…...

Foxmail邮件客户端跨站脚本攻击漏洞(CNVD-2025-06036)技术分析

Foxmail邮件客户端跨站脚本攻击漏洞&#xff08;CNVD-2025-06036&#xff09;技术分析 漏洞背景 ‌漏洞编号‌&#xff1a;CNVD-2025-06036 ‌CVE编号‌&#xff1a;待分配 ‌厂商‌&#xff1a;腾讯Foxmail ‌影响版本‌&#xff1a;Foxmail < 7.2.25 ‌漏洞类型‌&#x…...

39.[前端开发-JavaScript高级]Day04-函数增强-argument-额外知识-对象增强

JavaScript函数的增强知识 1 函数属性和arguments 函数对象的属性 认识arguments arguments转Array 箭头函数不绑定arguments 函数的剩余&#xff08;rest&#xff09;参数 2 纯函数的理解和应用 理解JavaScript纯函数 副作用概念的理解 纯函数的案例 判断下面函数是否是纯…...

0x05.为什么 Redis 设计为单线程?6.0 版本为何引入多线程?

回答重点 单线程设计原因: Redis 的操作是基于内存的,其大多数操作的性能瓶颈主要不是 CPU 导致的使用单线程模型,代码简便的同时也减少了线程上下文切换带来的性能开销Redis 在单线程的情况下,使用 I/O 多路复用模型就可以提高 Redis 的 I/O 利用率了6.0 版本引入多线程的…...

CST1019.基于Spring Boot+Vue智能洗车管理系统

计算机/JAVA毕业设计 【CST1019.基于Spring BootVue智能洗车管理系统】 【项目介绍】 智能洗车管理系统&#xff0c;基于 Spring Boot Vue 实现&#xff0c;功能丰富、界面精美 【业务模块】 系统共有三类用户&#xff0c;分别是&#xff1a;管理员用户、普通用户、工人用户&…...

CST1018.基于Spring Boot+Vue滑雪场管理系统

计算机/JAVA毕业设计 【CST1018.基于Spring BootVue滑雪场管理系统】 【项目介绍】 滑雪场管理系统&#xff0c;基于 Spring Boot Vue 实现&#xff0c;功能丰富、界面精美 【业务模块】 系统共有两类用户&#xff0c;分别是管理员和普通用户&#xff0c;管理员负责维护后台数…...

剖析 Rust 与 C++:性能、安全及实践对比

1 性能对比&#xff1a;底层控制与运行时开销 1.1 C 的性能优势 C 给予开发者极高的底层控制能力&#xff0c;允许直接操作内存、使用指针进行精细的资源管理。这使得 C 在对性能要求极高的场景下&#xff0c;如游戏引擎开发、实时系统等&#xff0c;能够发挥出极致的性能。以…...

SDHC接口协议底层传输数据是安全的

SDHC&#xff08;Secure Digital High Capacity&#xff09;接口协议在底层数据传输过程中确实包含校验机制&#xff0c;以确保数据的完整性和可靠性。以下是关键点的详细说明&#xff1a; 物理层与数据链路层的校验机制 物理层&#xff08;Electrical Layer&#xff09;&…...

Gateway-网关-分布式服务部署

前言 什么是API⽹关 API⽹关(简称⽹关)也是⼀个服务, 通常是后端服务的唯⼀⼊⼝. 它的定义类似设计模式中的Facade模式(⻔⾯模式, 也称外观模式). 它就类似整个微服务架构的⻔⾯, 所有的外部客⼾端访问, 都需要经过它来进⾏调度和过滤. 常⻅⽹关实现 Spring Cloud Gateway&a…...

c++STL——string学习的模拟实现

文章目录 string的介绍学习的意义auto关键字和范围forstring中的常用接口构造和析构对string得容量进行操作string的访问迭代器(Iterators)&#xff1a;运算符[ ]重载 string类的修改操作非成员函数 string的模拟实现不同平台下的实现注意事项模拟实现部分所有的模拟实现函数预…...

【寻找Linux的奥秘】第四章:基础开发工具(下)

请君浏览 前言1. 自动化构建1.1 背景1.2 基本语法1.3 make的运行原理1.4通用的makefile 2. 牛刀小试--Linux第一个小程序2.1 回车与换行2.2 行缓冲区2.3 倒计时小程序2.4 进度条小程序原理代码 3. 版本控制器git3.1 认识3.2 git的使用三板斧 3.3 其他 4. 调试器gdb/cgdb4.1 了解…...

RK3588上Linux系统编译C/C++ Demo时出现BUG:The C/CXX compiler identification is unknown

BUG的解决思路 BUG描述&#xff1a;解决方法&#xff1a;首先最重要的一步&#xff1a;第二步&#xff1a;正确设置gcc和g的路径方法一&#xff1a;使用本地系统中安装的 aarch64-linux-gnu-gcc 和 aarch64-linux-gnu-g方法二&#xff1a;下载使用官方指定的交叉编译工具方法三…...

记录一次/usr/bin/ld: 找不到 -lOpenSSL::SSL

1、cmake 报错内容如下&#xff1a; /usr/bin/ld: 找不到 -lOpenSSL::SSL /usr/bin/ld: 找不到 -lOpenSSL::Crypto2、一开始以为库没有正确安装 sudo yum install openssl-devel然后查看openssl 结果还是报错&#xff01; 3、尝试卸载安装都不管用&#xff0c;网上搜了好多…...

[16届蓝桥杯 2025 c++省 B] 水质检测

思路&#xff1a;分类讨论&#xff0c;从左到右枚举&#xff0c;判断当前的河床和下一个河床的距离是第一行更近还是第二行更近还是都一样近&#xff0c;分成三类编写代码即可 #include<iostream> using namespace std; int main(){string s1,s2;cin>>s1>>…...

基于PySide6与pycatia的CATIA绘图比例智能调节工具开发全解析

引言&#xff1a;工程图纸自动化处理的技术革新 在机械设计领域&#xff0c;CATIA图纸的比例调整是高频且重复性极强的操作。传统手动调整方式效率低下且易出错。本文基于PySide6pycatia技术栈&#xff0c;提出一种支持智能比例匹配、实时视图控制、异常自处理的图纸批处理方案…...

四、Appium Inspector

一、介绍 Appium Inspector 是一个用于移动应用自动化测试的图形化工具&#xff0c;主要用于检查和交互应用的 UI 元素&#xff0c;帮助生成和调试自动化测试脚本。类似于浏览器的F12(开发者工具),Appium Inspector 的主要作用包括&#xff1a;‌ 1.‌检查 UI 元素‌ …...

玩转Docker | 使用Docker部署MicroBin粘贴板

玩转Docker | 使用Docker部署MicroBin粘贴板 前言一、MicroBin介绍MicroBin 简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署MicroBin服务下载镜像创建容器检查容器状态检查服务端口安全设置四、访问MicroBin服务访问MicroBin首页登录管理后台…...

BGP分解实验·23——BGP选路原则之路由器标识

在选路原则需要用到Router-ID做选路决策时&#xff0c;其对等体Router-ID较小的路由将被优选&#xff1b;其中&#xff0c;当路由被反射时&#xff0c;包含起源器ID属性时&#xff0c;该属性将代替router-id做比较。 实验拓扑如下&#xff1a; 实验通过调整路由器R1和R2的rout…...

MQTT:单片机中MQTTClient-C移植定时器功能

接下来我们完善MQTTTimer.c和MQTTTimer.h两个功能 MQTTTimer.h void TimerInit(Timer* timer); 功能&#xff1a;此函数用于对 Timer 结构体进行初始化。在 MQTT 客户端里&#xff0c;定时器被用于追踪各种操作的时间&#xff0c;像连接超时、心跳包发送间隔等。初始化操作会…...

可拖动的关系图谱原型案例

关系图谱是一种以图结构形式组织和呈现实体间复杂关联关系的可视化数据模型。它通过节点和线构建多维度网络&#xff0c;能直观揭示隐藏的群体特征和传播路径。在社交网络分析、智能推荐系统、知识图谱构建等领域广泛应用。 软件版本&#xff1a;Axure RP 9 作品类型&#xf…...

CST1016.基于Spring Boot+Vue高校竞赛管理系统

计算机/JAVA毕业设计 【CST1016.基于Spring BootVue高校竞赛管理系统】 【项目介绍】 高校竞赛管理系统&#xff0c;基于 DeepSeek Spring AI Spring Boot Vue 实现&#xff0c;功能丰富、界面精美 【业务模块】 系统共有两类用户&#xff0c;分别是学生用户和管理员用户&a…...

从三次方程到复平面:复数概念的奇妙演进(二)

注&#xff1a;本文为 “复数 | 历史 / 演进” 相关文章合辑。 因 csdn 篇幅限制分篇连载&#xff0c;此为第二篇。 生料&#xff0c;不同的文章不同的点。 机翻&#xff0c;未校。 History of Complex Numbers 复数的历史 The problem of complex numbers dates back to …...

PCL 点云投影至指定平面

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 之前的文章中介绍过一个点在平面上的投影坐标,其主要的思路就是利用投影垂线与平面法向量平行的特性,通过推导出的投影公式可以很容易的计算出在某点在某一平面内的投影点。因此只需要重复该过程就可以将整个点云…...

批量将文件名称、文件路径、文件扩展名提取到 Excel 清单

在数字化时代&#xff0c;文件的高效管理至关重要。当我们想要对磁盘中的文件进行整理&#xff0c;想要获取多个文件夹中的文件和路径信息&#xff0c;就需要现将这些文件的名称及路径信息提取出来。本文将介绍一种实用的批量提取技术&#xff0c;帮助用户优化文件管理流程&…...

KWDB创作者计划—KWDB场景创新:多模态数据融合与边缘智能的产业实践

引言&#xff1a;AIoT时代的数据基座重构 在工业物联网设备数量突破千亿、边缘计算节点覆盖率达75%的2025年&#xff0c;传统数据库面临多模态数据处理效率低下、边缘端算力利用率不足、跨域数据协同困难等核心挑战。KWDB&#xff08;KaiwuDB Community Edition&#xff09;通过…...

计算机系统概论

1. 计算机系统的基本组成 计算机系统由 硬件系统 和 软件系统 两大部分协同工作&#xff1a; 硬件系统&#xff1a; 基于冯诺依曼体系结构&#xff08;存储程序原理&#xff09;&#xff0c;包含五大核心部件&#xff1a; 运算器&#xff08;ALU&#xff09;&#xff1a;执行算…...

Android Cmake构建的项目,需不需要配置指定ndk及版本

在 CMake 构建的 Android 项目中&#xff0c;是否需要显式配置 NDK 及其版本&#xff0c;取决于项目的具体需求和环境。以下是详细分析和建议&#xff1a; 1. 是否需要显式配置 NDK 及版本&#xff1f; 情况 1&#xff1a;Android Studio 自动管理 NDK&#xff08;推荐&#x…...

国内AI大模型卷到什么程度了?

目录 1.开源大模型更有前景吗&#xff1f; 2.参数越大真的越牛逼吗&#xff1f; 3.榜单排名有意义吗&#xff1f; 大家好这里是AIWritePaper官方账号&#xff0c;官网&#x1f449;AIWritePaper~ 大模型开源更有前景&#xff1f; 参数越大真的越牛逼吗&#xff1f; 榜单排…...

【HDFS入门】Hadoop 2.0+ HDFS核心架构深度解析:高可用设计揭秘

目录 1 HDFS核心架构概述 2 高可用设计背景 3HDFS核心组件 3.1 Active与Standby NameNode 3.2 JournalNode 3.3 ZKFailoverController&#xff08;ZKFC&#xff09; 3.4 DataNode 4 高可用设计的工作流程 写入阶段&#xff1a; 元数据同步&#xff1a; 健康监测&…...

RabbitMQ安装

RabbitMQ安装 Ubuntu环境安装 一、安装Erlang #更新软件包 sudo apt-get update #安装erlang sudo apt-get install erlang 二、安装RabbitMQ #更新软件包 sudo apt-get update #安装rabbitmq sudo apt-get install rabbitmq-server #确认安装结果 systemctl status rabbitmq-…...