首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ARM Linux中断服务程序工作在ARM的IRQ模式吗?

大家都知道,ARM有IRQ, FIQ, USR,SVC,ABORT等各种模式。当系统收到IRQ的时候,会进入ARM的IRQ模式。...那么,ARM Linux各种驱动的中断服务程序工作在ARM的IRQ模式吗? 答案是否定的。 我们加一段汇编来读CPSR: ? 然后我们随便找一个ARM Linux中断服务程序去打印CPSR: ?...然后我们发现打印出来的值是: cpsr:40000193 低8位的二进制是10010011 那么对应ARM CPSR的查询,可以看出CPU处于ARM的SVC模式(低5位是10011),而且I bit被设置...(第7位是1),所以是禁止IRQ的。...可见,ARM Linux最初进入IRQ模式后,比较快速地从IRQ模式切换到了SVC模式,但是这个时候,并没有使能CPSR的I bit,所以仍然是禁止其他中断嵌套进入的。

3K20
您找到你想要的搜索结果了吗?
是的
没有找到

CPU中断

一.简介 中断其实就是由硬件或软件所发送的一种称为IRQ中断请求)的信号。中断允许让设备,如键盘,串口卡,并口等设备表明它们需要CPU。...其实,在机器启动的时候,系统就已经识别了所有设备,并且也把相应的中断处理器加载到中断表中。 下面是请求CPU关注的两种方式: 基于中断 基于轮询 所有的linux操作系统都是基于中断驱动的。...当我们在键盘上按下一个按键时,键盘就会对CPU说,一个键已经被按下。在这种情况下,键盘的IRQ线路中的电压就会发生一次变化,而这种电压的变化就是来自设备的请求,就相当于说这个设备有一个请求需要处理。.../proc/interrupts 文件 在linux的机器上,/proc/interrupts这个文件包含有关于哪些中断正在使用和每个处理器各被中断了多少次的信息。...为了解决中断处理程序执行过长和中断丢失的问题,Linux中断处理过程分成了两个阶段,也就是上半部和下半部: 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关的或时间敏感的工作。

3.2K30

5.分析内核中断运行过程,以及中断3大结构体:irq_desc、irq_chip、irqaction(详解)

本节目标:    分析在linux中的中断是如何运行的,以及中断3大结构体:irq_desc、irq_chip、irqaction 在裸板程序中(参考stmdb和ldmia详解): 1.按键按下, 2....cpu发生中断, 3.强制跳到异常向量入口执行(0x18中断地址处) 3.1使用stmdb将寄存器值保存在栈顶(保护现场) stmdb sp!..., { r0-r12,pc }^ //^表示将spsr的值复制到cpsr,因为异常返回后需要恢复异常发生前的工作状态 在linux中: 需要先设置异常向量地址(参考linux应用手册P412): 在ARM...,若是中断异常,则PC=PC-4,也就是CPU下个要运行的位置处 2).然后根据进入中断前的工作模式不同,程序下一步将跳转到_irq_usr 、或__irq_svc等位置。...(cpu).irqs[irq]++; //计数中断次数 /* Start handling the irq */ desc->chip->ack(irq

1.5K80

Linux 多核下绑定硬件中断到不同 CPU

VPSee 前天收到一位网友的邮件提到了 SMP IRQ Affinity,引发了今天的话题:D,以下操作在 SUN FIre X2100 M2 服务器+ 64位版本 CentOS 5.5 + Linux...光有高级可编程中断控制器的硬件支持还不够,Linux 内核还必须能利用到这些硬件特质,所以只有 kernel 2.4 以后的版本才支持把不同的硬件中断请求(IRQs)分配到特定的 CPU 上,这个绑定技术被称为...更多介绍请参看 Linux 内核源代码自带的文档:linux-2.6.31.8/Documentation/IRQ-affinity.txt 如何使用 先看看系统上的中断是怎么分配在 CPU 上的,很显然...先查看一下 IRQ 90 中断的 smp affinity,看看当前中断是怎么分配在不同 CPU 上的(ffffffff 意味着分配在所有可用 CPU 上): # cat /proc/irq/90/smp_affinity...如果想修改 IRQ 90 的中断处理,绑定到第2个 CPUCPU1): # /etc/init.d/irqbalance stop # echo "2" > /proc/irq/90/smp_affinity

5.3K83

linux | 网络数据包softirq 软中断CPU

Linux 在每个 CPU 上会创建一个 ksoftirqd 内核线程。 softirqs 是在 Linux 内核编译时就确定好的,例如网络收包对应的 NET_RX_SOFTIRQ 软中断。...硬中断是昂贵的,因为它们不能被中断。即使有中断 合并(稍后详细描述),中断处理程序将独占一个 CPU 内核 完全地。NAPI 的设计允许驱动程序进入轮询模式而不是被 为每个需要的数据包接收硬中断。...在正常操作下,会引发初始硬中断IRQ,然后是 SoftIRQ 处理程序 它使用 NAPI 例程轮询卡。轮询例程有一个预算,它决定了 允许代码的 CPU 时间。...= 300 heidsoft@heidsoft-dev:~$ http://arthurchiao.art/blog/linux-irq-softirq-zh/#1-%E4%BB%80%E4%B9%88%.../about-linux-smp_affinity https://web.archive.org/web/20200225050436/http://blog.yufeng.info/archives

2.6K20

CPU中断概念与案例

2 概念 2.1 软中断概念 linux中断会打断CPU当前的工作,中断一般都设计的短小精悍。...但是也为了解决中断处理程序执行时间过长和中断丢失的问题,Linux中断分为两个阶段: 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理硬件相关和时间敏感的工作 下半部用来延迟处理上半部未完成的工作...而下半部以内核线程的方式执行,并且每个CPU都对应一个软中断内核线程,名字为 “ksoftirqd/CPU 编号”,比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。...不过要注意的是,软中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和RCU 锁(Read-Copy Update 的缩写,RCU是 Linux 内核中最常用的锁之一...正常情况下,同一种中断在不同 CPU 上的累积次数应该差不多。比如这个界面中,NET_RX 在 CPU0 和 CPU1 上的中断次数基本是同一个数量级,相差不大。

1.3K20

中断会吃掉你多少CPU

既然vmstat把中断的开销单独列出来了,就说明一个问题,中断吃起CPU来那也是丝毫不含糊。...1 软中断的诞生 CPU正常情况下都是专心处理用户的进程的,当外部的硬件或软件有消息想要通知CPU,就会通过中断请求(interrupt request,IRQ)的方式来进行。...所以现代的Linux又发明了软件中断,配合硬中断来处理网络IO。硬中断你可以理解只是个收包的,把包收取回来放到“家里”就完事,很快就能完成,这样不耽误CPU响应其它外部高优先级的中断。...让我们将他们进行一个简单的对比: 1)和系统调用开销对比 《深入理解Linux内核-第五章》开头的一句话,很形象地把中断和系统调用两个不相关的概念联系了起来,巧妙地找到了这二者之间的相似处。...大家感兴趣的,可以继续阅读《深入理解Linux内核》的-第五章。 根据前文的实验结果,进程上下文切换开销是3us-5us。

1.2K20

Linux中断处理

中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断的处理过程。...处理中断请求 当一个中断发生时,中断控制层会发送信号给CPUCPU收到信号会中断当前的执行,转而执行中断处理过程。...这里要注意的是,如果中断处理过程能够开启中断的,那么就把中断打开(因为CPU接收到中断信号时会关闭中断)。...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。...在Linux中,每个CPU都有一个类型为 irq_cpustat_t 结构的变量,irq_cpustat_t 结构定义如下: typedef struct { unsigned int __softirq_active

6.6K20

Linux中断 - IDT

[toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...pre-cpu中断栈,还是使用IST的中断栈; type表示所中断是何种类型,目前有以下四种: enum { GATE_INTERRUPT = 0xE, //中断门 GATE_TRAP...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int...i; for (i = 0; i < nr_legacy_irqs(); i++) per_cpu(vector_irq, 0)[ISA_IRQ_VECTOR(i)] = irq_to_desc

6.5K10

【深入理解Linux内核锁】| 中断屏蔽

Linux内核锁】二、中断屏蔽 1、中断屏蔽思想 中断屏蔽,正如其名,屏蔽掉CPU中断响应功能,解决并发引起的竞态问题。 在进入临界区前屏蔽中断,这么做有什么好处,以及有什么弊端?...因此,并不能解决SMP多CPU引发的竞态 因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法 2、Linux内核中断屏蔽的实现 2.1 Linux内核提供的API接口 关于中断屏蔽,Linux内核所提供的接口如下...: local_irq_enable() // 使能本CPU中断 local_irq_disable() // 禁止本CPU中断 local_irq_save(flags) // 禁止本...CPU中断,并保存CPU中断位的信息 local_irq_restore(flags) // 使能本CPU中断,并恢复CPU中断位的信息 local_bh_disable(void) // 禁止本...3、总结 该篇文章,主要了解以下几点: 中断屏蔽的思想 中断屏蔽的好处与不足 Linux内核提供的中断屏蔽接口 中断屏蔽的基本汇编实现

43520

一文完全读懂 | Linux中断处理

什么是中断 中断 是为了解决外部设备完成某些工作后通知CPU的一种机制(譬如硬盘完成读写操作后通过中断告知CPU已经完成)。...中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断的处理过程。...处理中断请求 当一个中断发生时,中断控制层会发送信号给CPUCPU收到信号会中断当前的执行,转而执行中断处理过程。...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 的执行。...在Linux中,每个CPU都有一个类型为 irq_cpustat_t 结构的变量,irq_cpustat_t 结构定义如下: typedef struct { unsigned int __softirq_active

2.1K20

Linux 中断子系统(三):中断处理知识点大全

Linux 中断相关节点 /proc/interrupts cat 这个节点,会打印系统中所有的中断信息,如果是多核CPU,每个核都会打印出来。...包括每个中断的名字、中断IRQ number、每个中断的触发次数、在哪个CPU核处理的、是边沿触发还是电平触发,属于哪个中断控制器,都会打印出来。 /proc/irq/… 进入这个目录。...更多介绍请参看 Linux 内核源代码自带的文档:linux-4.14/Documentation/IRQ-affinity.txt /proc/irq/{IRQ}/smp_affinity /proc.../irq/{IRQ}/smp_affinity_list /proc/irq/{IRQ}/smp_affinity 指定给定的 irq 中断号源允许哪些CPU执行,它是一个掩码位,比如是ff,代表11111111...在中断处理过程中,主要是 GIC 和 CPU 的交互,即便 GIC 支持高优先级中断抢占正在执行的低优先级中断,发信号给 CPU core,但是 CPU core 可以不处理,因为 Linux 中当 CPU

4.8K20

Linux内核21-Linux内核的中断处理过程

Linux中断要执行的操作分为三类: 关键中断 比如响应PIC控制器发送的中断,重新编程设置PIC或者设备控制器,更新设备和处理器访问的数据结构等。...中断向量表 在表4-2中,我们列出了IRQ的分配,中断号对应32-238。另外,Linux使用中断号128实现系统调用。...多核系统中的IRQ分配 我们知道SMP的全称是对称多处理系统,这意味,Linux内核不应该对一个CPU有任何偏向。于是,内核在CPU之间采用循环法(round-robin)分配IRQ。...如果发现CPU中断负载不均衡了,它就会选择将某个IRQ移到另一个负载低的CPU上,或者采用在所有的CPU上循环响应IRQ。...设置了IRQ_INPROGRESS 多核系统中,此时可能另外一个CPU可能正在处理先前发生的相同中断Linux对此的处理方式就是延后处理。

2.2K20

中断与异常简介与分析

image.png 在linux中也有这么一张表: image.png 在linux内核中,每一个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线。...一般情况下,有两种分发的方式: 1、静态分发模式:IRQ信号传递给重定向表相应的项中所列出的本地APIC,然后中断立即传递一个特定的CPU,或者是一组CPU,或者是所有的CPU。...这个接口我们需要包含一个头文件:#include ,在Linux中断编程中,最重要的是要了解以下的接口函数: 1、这个是请求中断函数 1int request_irq...4、关闭中断 1void disable_irq(unsigned int irq); 2 关闭irq中断 5、关闭当前CPU中断并保存在flag中去 1void local_irq_save(...7、关闭当前的CPU中断 1void local_irq_disable(void); 8、开始当前的CPU中断 1void local_irq_enable(void); 接下来我们来看一个按键中断的例子

1.1K30

Linux中断机制:硬件处理,初始化和中断处理

3、 对X86系统,CPU利用从中断控制器获取到的vector为索引,查询IDT (interrupt descriptor table)得到该中断的处理接口(对linux,是在entry_64.s中定义的函数...在linux中可以通过/proc/interrupts查看当前系统中所有中断的统计信息,在/proc/irq/xxx(中断号)下面,可以看到该中断的详细信息。...针对X86中断控制器硬件和linux对这些硬件的初始化,在《interrupt in linux》中有很详细的描述。...4、 如果该中断优先级高于当前CPU正在执行的中断,且当前CPU没有屏蔽中断(按照X86和LINUX的实现,这时是屏蔽了中断的),则该高优先级中断中断当前正在执行的中断(置ISR位,并开始执行),低优先级中断会在高优先级中断完成后继续执行...CPU在程序执行中产生)统一编号,每个CPU核心内部,中断/异常和vector所以一一对应的;但是在各个不同的CPU核心上,相同的vector可以对应不同的中断(至少对于linux的设置,异常还是使用相同的

7.7K30

韦东山:剥丝抽茧分析linux中断系统的重要数据结构

作者:韦东山 正文: 能弄清楚下面这个图,对Linux中断系统的掌握也基本到位了。 ?...最核心的结构体是irq_desc,之前为了易于理解,我们说在Linux内核中有一个中断数组,对于每一个硬件中断,都有一个数组项,这个数组就是irq_desc数组。...所以在中断比较“稀疏”的情况下可以用基数树来代替数组。 1.irq_desc数组 irq_desc结构体在include/linux/irqdesc.h中定义,主要内容如下图: ?...外部设备1、外部设备n共享一个GPIO中断B,多个GPIO中断汇聚到GIC(通用中断控制器)的A号中断,GIC再去中断CPU。...显然中断A是CPU感受到的顶层的中断,GIC中断CPU时,CPU读取GIC状态得到中断A。

1.1K20

Linux中断可以嵌套吗?

历史 早前的Linux内核版本,中断分为两种: 快中断,申请的时候带IRQF_DISABLED标记,在IRQ HANDLER里面不允许新的中断进来; 慢中断,申请的时候不带IRQF_DISABLED标记...老的Linux内核中,如果一个中断服务程序不想被别的中断打断,我们能看到这样的代码: request_irq(FLOPPY_IRQ, floppy_interrupt,\ - IRQF_DISABLED...在IRQ HANDLER里面,无论一个中断设置还是不设置IRQF_DISABLED, 内核都不会开启CPU中断的响应: ? 这个作废的IRQF_DISABLED标记,在内核已经没有任何的意义了。...硬件 中断发生后,一般硬件会自动屏蔽CPU中断的响应,而软件层面上,直到IRQ HANDLER做完,才会重新开启中断。...Linux内核会在如下2个时候重新开启CPSR对IRQ的响应: 从IRQ HANDLER返回中断底半部的SOFTIRQ 从IRQ HANDLER返回一个线程上下文 从1大家可以看出,SOFTIRQ里面是可以响应中断

5.2K31
领券