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

Linux中断处理

中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux中断处理过程。...中断处理相关结构 前面说过,8259A中断控制器 由两片 8259A 风格外部芯片以 级联 方式连接在一起,每个芯片可处理多达 8 个不同 IRQ(中断请求),所以可用 IRQ 线个数达到 15...handler: 类型为 hw_interrupt_type 结构,表示IRQ线对应硬件相关处理函数,比如 8259A中断控制器 接收到一个中断信号时,需要发送一个确认信号才会继续接收中断信号,发送确认信号函数就是...中断处理过程首先会保存寄存器值到栈中,然后调用 do_IRQ() 函数进行进一步处理,do_IRQ() 函数代码如下: asmlinkage unsigned int do_IRQ(struct pt_regs...鉴于这个原因,Linux中断处理分为两个部分,上半部 和 下半部,上半部 在前面已经介绍过,接下来就介绍一下 下半部 执行。

6.5K20

Linux中断 - IDT

中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应中断描述符,再根据中断描述符记录信息来作权限判断,运行级别转换,最终调用相应中断处理程序; 这里涉及到Linux...传统系统调用相关 IDT 设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...idt3.jpg 硬件中断实现 硬件中断IDT初始化和调用流程 这里我们不讲解具体代码细节,只关注流程 。...硬件中断相关IDT初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int...用来初始化硬件相关调用门,其对应中断门处理函数在irq_entries_start中定义,它位于arch/x86/entry/entry_64.S中: .align 8 ENTRY(irq_entries_start

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

Linux内核硬中断中断原理和实现

linux为了实现这个特点,当中断发生时候,硬中断处理那些短时间就可以完成工作,而将那些处理事件比较长工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套,但是没有优先级概念,也就是说任何一个新中断都可以打断正在执行中断,但同种中断除外。软中断不能嵌套,但相同类型中断可以在不同CPU上并行执行。...= TASK_RUNNING) wake_up_process(tsk); } 在下列地方,待处理中断会被检查和执行: a. 从一个硬件中断代码处返回时 b....在那些显示检查和执行待处理中断代码中,如网络子系统中 而不管是用什么方法唤起,软中断都要在do_softirq()中执行。...中断处理程序执行硬件设备相关操作,然后触发相应中断,最后退出。内核在执行完中断处理程序以后,马上就会调用do_softirq(),于是软中断开始执行中断处理程序完成剩余任务。

21.3K21

韦东山:在Linux设备树(DTS)中指定中断_在代码中获得中断

作者:韦东山 全文分为三大部分 1.设备树里中断节点语法 2.设备树里中断节点示例 3.在代码中获得中断 参考: 内核Documentation\devicetree\bindings\interrupt-controller...3.在代码中获得中断 之前我们提到过,设备树中节点有些能被转换为内核里platform_device,有些不能,回顾如下: A....一个I2C设备会被转换为一个i2c_client结构体,中断号会保存在i2c_clientirq成员里,代码如下(drivers/i2c/i2c-core.c): ?...一个SPI设备会被转换为一个spi_device结构体,中断号会保存在spi_deviceirq成员里,代码如下(drivers/spi/spi.c): ? 3.3....label = "User Button"; gpios = ; gpio-key,wakeup; linux

6.8K20

Linux系统中断硬件框架

资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git...它们都有自己寄存器,可以进行相关设置:使能中断中断状态、中断类型等等。 中断控制器 各种中断源发出中断信号,汇聚到中断控制器。 可以在中断控制器中设置各个中断优先级。...中断控制器会向CPU发出中断信号,CPU可以读取中断控制器寄存器,判断当前处理是哪个中断。...CPU也有自己寄存器,可以设置它来使能/禁止中断,这是中断处理总开关。...它们中断控制器不一样,STM32MP157中使用是GIC: 3.3.1 GPIO控制器 对于STM32MP157,除了把GPIO引脚配置为输入功能外,GPIO控制器里没有中断相关寄存器。

4.4K40

Linux中断可以嵌套吗?

问答 问:Linux中断可以嵌套吗? 答:以前是可以嵌套,现在不可以!...历史 早前Linux内核版本,中断分为两种: 快中断,申请时候带IRQF_DISABLED标记,在IRQ HANDLER里面不允许新中断进来; 慢中断,申请时候不带IRQF_DISABLED标记...老Linux内核中,如果一个中断服务程序不想被别的中断打断,我们能看到这样代码: request_irq(FLOPPY_IRQ, floppy_interrupt,\ - IRQF_DISABLED...也就是说,从这个commit开始,实际Linux已经不再支持中断嵌套, 也没有快慢中断概念了,IRQF_DISABLED标记也作废了。...Linux内核会在如下2个时候重新开启CPSR对IRQ响应: 从IRQ HANDLER返回中断底半部SOFTIRQ 从IRQ HANDLER返回一个线程上下文 从1大家可以看出,SOFTIRQ里面是可以响应中断

5.2K31

Linux 中断处理浅析

最近在研究异步消息处理, 突然想起linux内核中断处理, 里面由始至终都贯穿着”重要事马上做, 不重要事推后做”异步处理思想....而调用request_irq注册中断处理函数时也可以设置该中断处理函数在开中断情况下进行, 这种情况比较少见, 因为这要求中断处理代码必须是可重入....中断处理这几个阶段中不能调用可能导致睡眠函数(包括分配内存); 对于第一个问题, 较新linux内核增加了ksoftirqd内核线程, 如果持续处理softirq超过一定数量, 则结束中断处理过程...据说在montavista(一种嵌入式实时linux)中, 将内核中断机制做了修改. (某些中断)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题....(montavista目标是实时性, 这样做法牺牲了一定整体性能.) 工作队列 linux基线版本内核在解决上述问题上, 提供了workqueue机制.

7.3K80

键盘中断事件及其相关---小记

对于键盘中断介绍 当我们在按下按键时,键盘会把按键扫描码发送到主板接口电路中,具体说就是端口60H。 当60H收到扫描码,这时接口就会向CPU发出中断请求。这是一个可屏蔽中断。...所以,当IF=1, 并且CPU执行完当前指令后就会响应中断。也就是进入int 9中断服务程序。此时,程序将读取 60H中扫描码,并判断输入按键是什么。 ? ?...image.png 对于这些状态字节,其是位于内存中0:417H或0:418H位置 所以,如果产生中断后想制止接下来二次中断,可以进入状态字值置零处理: 如ctrl键检测: 1 keyin:...JNE PRESS 7 JMP keyin 8 9 PRESS: 10 mov ax,0 ;把 0:417H中状态字节置零...应用程序读取键盘缓冲区 利用键盘控制应用程序主要有两种方式: 1、直接从60H端口中读取键盘扫描码,在应用程序中分析键盘输入是字符还是控制符、切换符等。 2、利用BIOS提供中断int 16H。

1.4K20

扒开 Linux 中断底裤之 workqueue

workqueue 是除了 softirq 和 tasklet 以外最常用下半部机制之一。workqueue 本质是把 work 交给一个内核线程,在进程上下文调度时候执行。...workqueue 相关数据结构 关于 workqueue 中几个概念都是 work 相关数据结构非常容易混淆,大概可以这样来理解: work_struct : 工作。...workqueue 和 work 是一对多关系。内核中工作队列分为两种: bound:绑定处理器工作队列,每个 worker 创建内核线程绑定到特定 CPU 上运行。...数量 idle_list:处于 IDLE 状态 worker 添加到本链表 busy_hash:工作状态 worker 添加到本哈希表中 workers:worker_pool 管理 worker...在代码中 worker 对应一个 work_thread() 内核线程。

1.9K51

linux 中断机制《Rice linux 学习笔记》

这篇文章以按键为例子讲解linux中断原理,中断架构,中断实现。 在我们开发中,检测按键是否触发,无非就两种方法—轮询和中断。作者认为两种方法最大区别就是CPU利用率。...Linux中断原理: 中断:处理器异常一种,它是一种特殊电信号,用硬件发给处理器,处理器接收到中断后,会马上向操作系统反映此信号到来,然后就由操作系统负责处理这些新到来数据。...Linux中断相关函数: 1、注册中断函数: 中断处理函数结构: typedef irqreturn_t (*irq_handler_t)(int, void*); 注册中断函数:int request_irq...dev:与request_irq参数dev必须一致,将request_irq指定dev传递给这个参数; Linux中断处理分析: 第一种方式:应用层读,不管什么情况下,都会返回。...第二种方式:应用层读,只有按键按下时候,才会返回。 Linux中断实现: 这里例子采用等待队列方式实现(也就是上述第二种方法)。

4.7K10

Linux中断下半部机制对比

Linux有以下几种下半部机制: 软中断 tasklet workqueue threaded irq  中断服务程序一般都是在中断请求关闭条件下执行,以避免嵌套而使中断控制复杂化。...因此,Linux内核目标就是尽可能快处理完中断请求,尽其所能把更多处理向后推迟。...例如,假设一个数据块已经达到了网线,当中断控制器接受到这个中断请求信号时,Linux内核只是简单地标志数据到来了,然后让处理器恢复到它以前运行状态,其余处理稍后再进行(如把数据移入一个缓冲区,接受数据进程就可以在缓冲区找到数据...默认情况下,允许响应中断,并且不持有任何锁。如果需要,函数可以睡眠。需要注意是,尽管该函数运行在进程上下文中,但它不能访问用户空间,因为内核线程在用户空间没有相关内存映射。...其中handler是硬中断,是处理与硬件密切相关事物。其处理完成后,可以把接收到数据、要继续处理事情放到某个位置,然后返回是否需要唤醒对应中断线程。

10810

Linux中断虚拟化(一)

作者简介 王柏生 资深技术专家,先后就职于中科院软件所、红旗Linux和百度,现任百度主任架构师。在操作系统、虚拟化技术、分布式系统、云计算、自动驾驶等相关领域耕耘多年,有着丰富实践经验。...著有畅销书《深度探索Linux操作系统》(2013年出版)。 谢广军 计算机专业博士,毕业于南开大学计算机系。资深技术专家,多年IT行业工作经验。...现担任百度智能云副总经理,负责云计算相关产品研发。多年来一直从事操作系统、虚拟化技术、分布式系统、大数据、云计算等相关领域研发工作,实践经验丰富。...本文内容节选自《深度探索Linux虚拟化技术》,已获得机械工业出版社华章公司授权。...图4 硬件虚拟化支持下中断虚拟化过程 Intel从硬件层面对虚拟化进行了支持,实现了一个处于Guest模式用于存储中断相关寄存器virtual-APIC page。

6.2K30

Linux中断虚拟化(二)

作者简介 王柏生 资深技术专家,先后就职于中科院软件所、红旗Linux和百度,现任百度主任架构师。在操作系统、虚拟化技术、分布式系统、云计算、自动驾驶等相关领域耕耘多年,有着丰富实践经验。...现担任百度智能云副总经理,负责云计算相关产品研发。多年来一直从事操作系统、虚拟化技术、分布式系统、大数据、云计算等相关领域研发工作,实践经验丰富。...代码中在一个while循环处理完设备驱动I/O请求后,调用了函数kvm__irq_line,irq_line对应8259A管脚IR0~7,其代码如下: commit 4155ba8cda055b7831489e4c4a412b073493115b...以边缘触发为例,当管脚收到一个低电平时,即level值为0,代码进入else分支,结构体kvm_kpic_state中字段last_irr中会清除该IRQ对应IRR位,即相当于设置该中断管脚为低电平状态...,相关代码如下: commit 85f455f7ddbed403b34b4d54b1eaf0e14126a126 KVM: Add support for in-kernel PIC emulation

5.8K10

Linux中断机制分析

中断分析最近工作繁忙,没有时间总结内核相关一些东西。上次更新博客到了linux内核中断子系统。这次总结一下软中断,也就是softirq。之后还会总结一些tasklet、工作队列机制。...这样后果会造成有可能丢失外部中断。于是,linux内核设计出了一种架构,中断函数需要处理任务分为两部分,一部分在中断处理函数中执行,这时系统关闭中断。...另外一部分在软件中断中执行,这个时候开启中断,系统可以响应外部中断。 关于软件中断理论各种书籍都有介绍,不多叙述。而要真正体会软件中断作用就必须从代码角度来分析。...在linux系统进程数据结构里,有这么一个数据结构 #define preempt_count()(current_thread_info()->preempt_count), 利用preempt_count...Linux内核就中断方面就必须考虑平衡这三个方面的问题。而下面我要分析__do_softirq函数就恰似在这三者之间打太极,游刃有余,面面俱到!

8.6K91

Linux 中断子系统(二):GIC 中断控制器

我们重点要看肯定是中间 GIC 部分,GIC 将众多中断源分为 分为三类: ①、SPI(Shared Peripheral Interrupt),共享外设中断,该中断来自于外设,所有 Core 共享中断...中断源有很多,为了区分这些不同中断源肯定要给他们分配一个唯一 ID,这些 ID 就是中断 ID。...分发器收集所有的中断源,可以控制每个中断优先级,它总是将优先级最高中断事件发送到 CPU 接口端。分发器端要做主要 工作如下: ①、全局中断使能控制。 ②、控制每一个中断使能或者关闭。...③、设置每个中断优先级。 ④、设置每个中断目标处理器列表。 ⑤、设置每个外部中断触发模式:电平触发或边沿触发。 ⑥、设置每个中断属于组 0 还是组 1。...寄存器分布,不同东西寄存器开头不一样: GIC-v 3中断号规定如下,来源于ARM官方文档。 最主要区别就是增加了 LPI 这个中断类型,是基于消息中断

5.5K20

Linux BSP实战课(中断篇):中断控制器硬件实现

中断在系统中作用 中断机制在处理器中扮演着一个至关重要角色,它是处理器异步响应外围设备请求核心方式。...从技术深层次来看,中断是处理器在正常运行过程中,因外部或内部事件(如外围设备输入/输出请求、异常错误等)而暂时中断当前执行程序,转而执行特定中断服务程序(Interrupt Service Routine...系统调度是操作系统根据一定策略选择下一个要执行进程或线程过程。当中断发生时,处理器可能会根据中断类型和优先级来决定是否切换当前执行上下文,从而实现任务快速切换和调度。...SPI (Shared Peripheral Interrupt):公用外部设备中断,也定义为共享中断中断产生后,可以分发到某一个CPU上。比如按键触发一个中断,手机触摸屏触发中断。...LPI 始终是基于消息中断,它们配置保存在表中而不是寄存器。比如 PCIe MSI/MSI-x 中断

15710

Linux中断系统如何调用详解

Linux中,当阻塞于某个慢系统调用进程捕获一个信号,则该系统调用就会被中断,转而执行信号处理函数,这就是被中断系统调用。...,函数将返回失败,同时errno被置为EINTR 只有中断信号SA_RESTART标志有效时,系统调用才会自动重启 下面我们编写代码,分别验证上述几种情形,其中系统调用选择read,中断信号选择SIGALRM...,中断信号由alarm产生。...//act.sa_flag |= SA_INTERRUPT; //SA_INTERRUPT是sigaction默认处理方式,即不自动重启被中断系统调用 //实际上,不管act.sa_flags...由于对被中断系统调用处理方式差异性,因此对应用程序来说,与被中断系统调用相关问题是: 应用程序无法保证总是知道信号处理函数注册方式,以及是否设置了SA_RESTART标志 可移植代码必须显式处理关键函数出错返回

2.5K10
领券