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

中断上下文使用spin_lock进程上下文使用spin_lock_irqsave的原因?

armv8+linux4.19环境

举个例子:进程A中调用了spin_lock(&lock)然后进入临界区,此时来了一个中断(interrupt),

该中断也运行在和进程A相同的CPU上,并且在该中断处理程序中恰巧也会spin_lock(&lock)

试图获取同一个锁。由于是在同一个CPU上被中断,进程A会被设置为TASK_INTERRUPT状态,

中断处理程序无法获得锁,会不停的忙等,由于进程A被设置为中断状态,schedule()进程调度就

无法再调度进程A运行,这样就导致了死锁

spin_lock

    ==> raw_spin_lock

       ==> _raw_spin_lock

            ==> __raw_spin_lock

                  ==> preempt_disable

                          spin_acquire

                          do_raw_spin_trylock   ==> queued_spin_lock

spin_lock_irqsave

    ==> raw_spin_lock_irqsave

        ==> _raw_spin_lock_irqsave

               ==> __raw_spin_lock_irqsave

                       ==>  local_irq_save         ==>  msr daifset, #2

                                preempt_disable

                                spin_acquire

                                do_raw_spin_lock  ==> queued_spin_lock

arm64接收到中断后由中断向量VBAR寄存器设置的地址开始执行异常处理代码,

中断触发时,硬件自动对PSR的daif异常标志mask了,待中断完成返回后自动恢复

el1_irq  ==>  enable_da_f 只使能了Debug、SError和 firq中断,未对irq中断打开 即中断处理中禁止中断嵌套

周期调度器因为无法来timer中断,得不到调度被interrupt的进程,同时也关闭了抢占,所以当前cpu死锁

相关文章:

  • 【AGC】【FAQ】Dynamic Ability常见问题
  • 集成应用签名服务,加入签名计划后,想要删除AGC中托管的应用签名,退出签名计划如何做?应用签名服务常见问题小集合
  • docker 查看容器启动日志 查看运行日志
  • 【web-攻击本地编译性应用程序】(11.1)缓冲区溢出漏洞
  • docker 打包镜像
  • github配置ssh密钥
  • 3.2 创建会员中心微服务模块 -service provider
  • 物联网开发笔记(1)- 使用Wokwi仿真树莓派Pico点亮LED灯
  • 内网渗透-frp 用于内网穿透的基本配置和使用
  • linux快速杀进程
  • C++设计模式---建造者/构建器/构建者/生成器模式
  • 文字转音频软件哪个好用?这几个方法你值得拥有
  • 用ZeroTier搭建属于自己的虚拟局域网(VLAN)
  • 网课查题接口—掘光者系统
  • Spring注解驱动之AnnotationConfigApplicationContext(二)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Android单元测试 - 几个重要问题
  • Angular2开发踩坑系列-生产环境编译
  • CAP 一致性协议及应用解析
  • CSS盒模型深入
  • Docker容器管理
  • github指令
  • Laravel 中的一个后期静态绑定
  • leetcode98. Validate Binary Search Tree
  • Netty源码解析1-Buffer
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 阿里云前端周刊 - 第 26 期
  • 半理解系列--Promise的进化史
  • 给github项目添加CI badge
  • 看域名解析域名安全对SEO的影响
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 为什么要用IPython/Jupyter?
  • 追踪解析 FutureTask 源码
  • Spring第一个helloWorld
  • 大数据全解:定义、价值及挑战
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (循环依赖问题)学习spring的第九天
  • (转)Oracle 9i 数据库设计指引全集(1)
  • .net FrameWork简介,数组,枚举
  • .NET MAUI Sqlite数据库操作(二)异步初始化方法
  • .NET MVC 验证码
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET 中 GetHashCode 的哈希值有多大概率会相同(哈希碰撞)
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET的数据绑定
  • .NET企业级应用架构设计系列之开场白
  • .NET与 java通用的3DES加密解密方法