首页 > 其他分享 >原子上下文和中断上下文

原子上下文和中断上下文

时间:2024-05-27 09:12:30浏览次数:25  
标签:抢占 中断 原子 内核 上下文 CPU

原子上下文

内核的一个基本原则就是:在中断或者说原子上下文中,内核不能访问用户空间,而且内核是不能睡眠的。也就是说在这种情况下,内核是不能调用有可能引起睡眠的任何函数。一般来讲原子上下文指的是在中断或软中断中,以及在持有自旋锁的时候。内核提供 了四个宏来判断是否处于这几种情况里:

这四个宏所访问的count都是thread_info->preempt_count。这个变量其实是一个位掩码。最低8位表示抢占计数,通常由spin_lock/spin_unlock修改,或程序员强制修改,同时表明内核容许的最大抢占深度是256。

8-15位是软中断计数,通常由local_bh_disable/local_bh_enable修改,同时表明内核容许的最大软中断深度是256。

16-27位是硬中断计数,通常由enter_irq/exit_irq修改,同时表明内核容许的最大硬中断深度是4096。

第28位是PREEMPT_ACTIVE标志。用代码表示就是:

PREEMPT_MASK: 0x000000ff

SOFTIRQ_MASK: 0x0000ff00

HARDIRQ_MASK: 0x0fff0000
12345

凡是上面4个宏返回1得到地方都是原子上下文,是不容许内核访问用户空间,不容许内核睡眠的,不容许调用任何可能引起睡眠的函数。而且代表thread_info->preempt_count不是0,这就告诉内核,在这里面抢占被禁用。

但是,对于in_atomic()来说,在启用抢占的情况下,它工作的很好,可以告诉内核目前是否持有自旋锁,是否禁用抢占等。但是,在没有启用抢占的情况 下,spin_lock根本不修改preempt_count,所以即使内核调用了spin_lock,持有了自旋锁,in_atomic()仍然会返回 0,错误的告诉内核目前在非原子上下文中。所以凡是依赖in_atomic()来判断是否在原子上下文的代码,在禁抢占的情况下都是有问题的。

中断上下文

中断上下文,发生中断时,CPU进入中断处理程序,又会产生当前堆栈和CPU寄存器等值。这些内核态堆栈状态和寄存器的值,称为中断上下文。中断上下文保存的是当前中断处理程序的堆栈、CPU寄存器,进程上下文保存的才是进程状态、堆栈信息。

进程运行是由内核通过调度算法决定的,然后进行(进程)上下文切换,这是由操作系统支持。
而中断跟进程没有必然联系,可以没有任何进程,甚至没有操作系统,但仍有中断,中断是由硬件支持的,有操作系统时被接管。中断分为同步中断、异步中断。同样地,没有中断产生,也一样会产生进程上下文切换。
同步中断,又称为异常,是指当指令执行时,由CPU控制单元产生的,如除数0,总线错误,都会产生同步中断;异步中断,由其他硬件设备依照CPU时钟随机产生的,如定时器中断、按键中断、串口数据中断,CPU无法知道异步中断什么时候会来。

标签:抢占,中断,原子,内核,上下文,CPU
From: https://www.cnblogs.com/-110/p/18214760

相关文章

  • 【信道容量估计】基于AWGN、香农、最大中断、零中断和最大的最佳功率分配的中断门限实
     ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • 原子上下文、进程上下文和中断上下文
    进程上下文、中断上下文及原子上下文转自:进程上下文、中断上下文及原子上下文_知秋一叶-CSDN博客​谈论进程上下文、中断上下文、原子上下文之前,有必要讨论下两个概念:a--上下文​上下文是从英文context翻译过来,指的是一种环境。相对于进程而言,就是进程执行时的环......
  • 中断上下文和原子上下文
    目录中断上下文1、定义2、组成3、特点4、中断上下文的实现5、中断上下文和进程上下文的区别原子上下文1、定义2、特点3、应用场景4、实现方式5、与进程上下文和中断上下文的区别中断上下文1、定义中断上下文(InterruptContext)是指当CPU接收到硬件设备的中断请求时,CPU会暂停当......
  • go go-redis 使用lua保证操作的原子性
      Redis是应对高并发的常用工具,在常用缓存技巧中讲过相关技巧。但有些业务场景,使用Redis会遇到问题,如电商里的秒杀、扣减库存等。拿减库存举例,一般需要两步:先扣减库存,获取扣减后的库存值V如果V小于0,说明库存不够,需要将扣减的值再加回去;如果V大于等于0,则执行后续操作......
  • 探索Go语言的原子操作秘籍:sync/atomic.Value全解析
    引言​在并发编程的世界里,数据的一致性和线程安全是永恒的话题。Go语言以其独特的并发模型——goroutine和channel,简化了并发编程的复杂性。然而,在某些场景下,我们仍然需要一种机制来保证操作的原子性。这就是sync/atomic.Value发挥作用的地方。原子性:并发编程的基石​......
  • 01、Cubemx新建工程与LED点亮和蜂鸣器实现(基于正点原子ZET6)
    一、使用Cubemx新建工程    1、正确选择芯片2、正确选择SYS与RCC3、正确配置时钟树输入数字直接回车,然后一直OKK,让它自己配4、正确建立工程结构与工程打开5、Keil5的配置注意看下方Keil5的配置很重要,不配置不能在keil5中开发(本历程主要是完成最简单的几......
  • 原子、组合与汇编
    应用程序里可以任意写SQL语句,到了数据库这层,所有的SQL语句都被做了编排。在应用层可以同步、异步的投递SQL语句:s1,s2,s3,...。混在意大利面条一样的代码里,看不到谁先执行谁后执行。在数据库层,这些语句会被编排。编排后,实际的执行时序可能是s2,25,s1,s3,s4...那么数据库层面......
  • 原子、组合与汇编
    应用程序里可以任意写SQL语句,到了数据库这层,所有的SQL语句都被做了编排。在应用层可以同步、异步的投递SQL语句:s1,s2,s3,...。混在意大利面条一样的代码里,看不到谁先执行谁后执行。在数据库层,这些语句会被编排。编排后,实际的执行时序可能是s2,25,s1,s3,s4...那么数据库层面......
  • 新型数据中台的特性之——原子化
    目录传统数据中台加工逻辑混杂新型原子化数据架构如何实现新型原子化数据处理的优势传统数据中台加工逻辑混杂传统数据中台架构基本都是依赖sql语言硬编码进行开发,硬编码开发模式下,数据、业务耦合度极高,加工逻辑混杂,只能将数据中台的开发开放给下游系统,将中台自身的技术......
  • 鸿蒙HarmonyOS实战-Stage模型(应用上下文Context)
    ......