系统调用,上下文切换(cpu上下文,进程上下文,线程上下文,中断上下文,进程切换,线程切换)

2023-05-16

用户态切换到内核态的三种方式:系统调用,中断,异常

CPU上下文切换的分为几个不同的场景:进程上下文切换,线程上下文切换,中断上下文切换

进程上下文概念。

1.当一个进程在执行时,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容被称为该进程的上下文。(第一种解释)

2.进程的上下文包括用户级上下文和系统级上下文。
用户级上下文:由用户的程序块、数据块、运行时的堆和用户栈(统称为用户堆栈)等组成的用户空间信息被称为用户级上下文。
系统级上下文:由进程标识信息、进程现场信息、进程控制信息(包含进程表、页表、打开文件表等)和系统内核栈等组成的内核空间信息被称为系统级上下文。

进程切换:

1.页表全目录 2.内核堆栈 3.硬件上下文 4.刷新TLB(TLB hit)5.系统调度

线程切换:

保存寄存器等私有数据,线程的调度是需要内核级别的权限的(操作CPU和内存),也就是说线程的调度工作是在内核态完成的,因此会有一个从用户态到内核态的切换。

线程上下文的保存和恢复,用户态和内核态的转换,CPU上下文的切换。

线程切换和进程切换差不多,都是在等待队列的双向链表里找一个task_struct运行罢了。

中断上下文
一:根据异常向量表找到异常向量处理程序(此处是将中断处理程序和异常向量表中的irq绑定)
二:在irq handle中
保存现场:
1.设置IRQ栈  2.CPSR(自动),保存LR  3.保存r0-r12
IRQ handle:
1. ldr sp, =IRQ_STACK
2.中断返回的PC保存在LR中,CPSR(自动)保存在(IRQ模式下)SPSR下。 sub lr,lr,#4
3.保存r0-r12,lr到irq模式下的栈上
stmfd sp!, {r0-r12,lr}
bl irq_handler
//处理完中断返回
ldmfd sp!, {r0-r12,pc}^    ^就是cpsr返回
三:在irq handler中
根据中断源寄存器查找中断状态寄存器来找到中断编号,根据编号去isr数组中找到isr地址。

具体的:绑定异常向量表,初始化控制器的基本寄存器(禁止左右中断)

自己配置 1.gpio配置(gpio中断,触发方式),2.写isr 3.绑定isr(中断号)到中断控制器

iic控制器那边wait_event_timeout(交出cpu)

从机有了响应,中断处理处理程序被执行,isr中执行wake_up(&i2c->wait)

系统调用:文件管理、进程控制、内存管理

首先保存(read函数对应的)系统调用号到R7寄存器,调用svc指令触发软中断异常,修改CPU的工作模式由USR切换到SVC,将返回地址和CPU状态寄存器内容压栈。进入软中断的处理入口以后,从R7寄存器中取出系统调用号,以系统调用号为下标(索引)在系统调用表中找到对应的内核函数sys_read,调用完毕,原路返回到用户空间,至此应用程序的read函数调用完毕。

Linux2.5之前(具体哪个版本不太清楚)下用int 0x80触发所有的系统调用,那如何区分不同的调用呢?对于每个系统调用都有一个系统调用号,在触发中断之前,会将系统调用号放入到一个固定的寄存器,0x80对应的中断处理程序会读取该寄存器的值,然后决定执行哪个系统调用的代码。

操作系统一般是通过中断来从用户态切换到内核态的。软件中断指令(SVC)用于产生软中断,使用软件中断指令进入中断软中断调用时将返回地址和CPU状态寄存器内容压栈,修改特权级,根据中断号查找中断向量表,找到ISR中断服务例程地址,跳转执行。

调用到C库的函数定义的地方后,将会做如下工作: 

软中断调用时将返回地址和CPU状态寄存器内容压栈
2.1 首先保存(read函数对应的)系统调用号到R7寄存器

2.2 调用svc指令触发软中断异常 

老ARM体系结构:swi 
新ARM体系结构:svc 
软中断:实现CPU的工作模式由USR切换到SVC 
此时:用户程序由用户空间“陷入”内核空间

3.一旦触发异常,CPU跳转到异常向量表软中断的处理入口,至此进入内核空间

4.进入软中断的处理入口以后,将会做如下事情: 
    1.从R7寄存器中取出系统调用号 
    2.2.以系统调用号为下标(索引)在系统调用表中找到对应的内核函数sys_read

5.找到对应的内核函数以后,调用这个内核函数,调用完毕,原路返回到用户空间,至此应用程序的read函数调用完毕

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

系统调用,上下文切换(cpu上下文,进程上下文,线程上下文,中断上下文,进程切换,线程切换) 的相关文章

  • PowerDesigner—你知道CDM、LDM、PDM、OOM的区别吗?

    导读 在本篇文章中 xff0c 你将会了解到PowerDesigner工具中的三种模型CDM xff0c OOM xff0c PDM的区别和联系 PowerDesigner 简称PD xff0c 是一种数据建模工具 xff0c 适合于开发大
  • 基础 HTML之目录问题(相对路径和绝对路径区别)

    导读 复习HTML知识的时候 xff0c URL的路径的写法是我们经常会用到的一块内容 相对路径和绝对路径的问题不难 xff0c 只要明白各自的道理 xff0c 同时清楚 这些字符的含义就可以了 原文链接 xff1a http www jb
  • 【Android开发—智能家居系列】(一):智能家居原理

    来到JCZB公司的第二天 xff0c 就接到了开发类似于小米智能家庭APP的任务 组长让我在手机上安装上此款APP xff0c 给了我个小米智能插座 xff0c 就让我开始了解需求 这便开启了我的智能家居旅程 说实话 xff0c 我也真是o
  • 【Android开发—智能家居系列】(二):用手机对WIFI模块进行配置

    在实际开发中 xff0c 我开发的这款APP是用来连接温控器 xff0c 并对温控器进行控制的 有图为证 xff0c 哈哈 上一篇文章 Android开发 智能家居系列 xff08 一 xff09 xff1a 智能家居原理 的文末总结中写到
  • 【POI】——获得单元格的值,并转化成字符串

    本篇文章分享一些在做导入导出EXCEL功能时用到的工具类的一些代码 span class hljs javadoc span class hljs javadoctag 64 param span cell span class hljs
  • ElementUI实现文件手动上传

    ElementUI实现文件手动上传 HTML部分 lt el upload ref 61 34 upload 34 multiple 61 34 true 34 file list 61 34 fileList 34 auto upload
  • 【工具篇】——利用EditPlus进行Json数据格式化

    从接口返回的数据基本都是json格式的数据 之前我要查看数据的内容 xff0c 为了方便我阅读 xff0c 我会直接复制这段数据到在线JSON校验格式化工具中进行格式化和校验 但是没网的时候 xff0c 就不能靠它了 而EditPlus是我
  • 【GIS】——mapnik在windows上的安装

    mapnik是瓦片生成器 这里先不解释了 xff0c 等用过了再谈理解 下载步骤 1 下载安装包 官网地址 xff1a http mapnik org http mapnik org pages downloads html 3 0 12还
  • 【GIS】——使用Python bindings操作mapnik

    背景介绍 使用mapnik有三种方式 xff1a 1 使用XML配置文件 2 使用Python bindings 3 使用C 43 43 中的API 这里我们先介绍第二种Python bindings xff0c 并采用这种方式做一个Dem
  • 【MongoDB】(一)——关于MondoDB索引的总结

    导读 为数据创建索引有助于提高查询数据的性能 xff0c 本篇文章总结了创建MongoDB索引应遵循的规则 我将这些规则分成四类 xff1a 1 query 2 sort 3 RAM 4 selectivity query db span
  • 【开发也是好测试】(四)—Mock

    有关Mock的思维导图 xff1a
  • 【MongoDB】——TTL Index

    TTL Index
  • ubuntu下的串行口通讯编程

    Linux 操作系统从一开始就对串行口提供了很好的支持 xff0c 本文就 Linux 下的串行口通讯编程进行简单的介绍 串口简介 串 行口是计算机一种常用的接口 xff0c 具有连接线少 xff0c 通讯简单 xff0c 得到广泛的使用
  • stm32 摄像头寻迹+平衡车

    链接 xff1a http download csdn net download u010925447 9866006
  • 【书籍推荐】自己动手写操作系统

    于渊 编著 尤晋元 审校 2005年8月出版 ISBN 7 121 01577 3 48 00元 xff08 含光盘1张 xff09 374页 用理论指导动手实践 xff0c 用实践深化理解理论 xff01 本书在详细分析操作系统原理的基础
  • 贝塔、伽马分布

    最近开始自学PRML xff0c 为此又补了概率论中的一些知识点 相较于古典概率通过各种估计手段来确定参数的分布 xff0c 贝叶斯学派则是使用后验概率来确定 xff0c 为了方便计算后验概率 xff0c 引入共轭先验分布来方便计算 xff
  • elementUI中el-dropdown的command如何传递多个参数

    el dropdown的command事件默认传递一个参数 xff0c 即每个下拉选项el dropdown item中设定的command的值 xff0c 那么如何传递多个参数呢 xff1f 实现方法 xff1a 动态设置el dropd
  • 记录ubuntu18.04下搭建nuttx RTOS的过程

    官方参考链接 xff1a https nuttx apache org docs latest quickstart install html Getting started 61 61 gt Installing 主要记录一下按照链接指导
  • 词袋

    brief描述子 一般Sb 61 48 Lb为256 brief描述子不具备旋转尺度不变性 词袋 提取大量图片的描述子 xff0c 将描述子用k means聚类成K堆 xff0c 这是第n层 xff0c 把每一堆再次聚类形成下一层 xff0
  • 板子和电脑配置ros通信

    它们需要连在同一个路由器上 1 获取板子和电脑的ip 比如板子名为RV1126 RV1109 xff0c ip为192 168 5 48 电脑名为qian hw xff0c ip为192 168 5 25 2 在电脑端设置 xff1a ba

随机推荐