Linux内核中断(X86)

x86架构学习之中断 外部中断,一般是由CPU的外部引脚电信号触发,这些引脚留给硬件厂商去定义中断,例如主板厂商可以将USB中断挂载70号中断引脚上,MCU厂商可以将片上外设(SPI、I2C等)的中断挂载在指定中断线上。中断描述符主要用于说明该中断的入口地址,中断描述符表则是将中断描述符一项一项管理在一个数组中,每一项中断描述符占用8个字节(64位模式下,占用16字节),其。简称中断,后文如果没特别说明,中断都指外部中断,由外部IO事件触发,由于时钟源来自CPU外部,与CPU时钟不同源,因此是异步事件。 阅读详情

基本上Linux支持的平台都或多或少采用了中断的概念,中断可以周期性产生或者随机产生,如:网卡硬件在收到数据包时会产生中断,而后内核中断处理例程将进行处理。

中断的分类:

  • 硬件中断

                由与CPU连接的外设产生的中断,外设无法产生中断,是通过一个中断控制器产生中断。

  • 软中断

由内核模拟实现的一种中断机制,是平台无关的,它依赖于硬件中断。

同步中断和异常:

        由CPU自身产生,例如 除零 或用户空间应用程序访问了一个地址空间,该地址空间没有关联物理页,这将产生缺页异常,内核需要关注CPU产生的各种异常,并进行响应的处理。

异步中断:

它们由外部设备产生,可能发生于任何时间,当中断产生时内核可能处于任何状态,内核会尽快处理该类型中断,然后将CPU时间交还给用户进程。

中断号:

每一个中断都有一个中断号,用于区分不同的中断情况,例如:网卡,当数据分组到来时,将产生中断号N,内核会识别这个网卡中断并调用合适的处理例程,但是不同体系架构支持的中断号数量不一,如IA32处理器仅支持最大15个中断数目,并且其中一些已分配给固定的设备: 鼠标、键盘等。

中断共享:

为了解决中断数量少而采用的一种中断使用方式,多个设备使用一个中断号来使系统支持更多的设备,这需要内核和硬件均支持才能做好。

CPU产生中断中,会根据中断号调用相应的中断服务例程,以x86架构为例,在初始化系统时会安装各类中断例程到IDT(中断描述符表),中断号为索引每个中断项就是中断处理例程的地址。

内核安装的CPU内部中断历程:

static const __initconst struct idt_data def_idts[] = {
	INTG(X86_TRAP_DE,		asm_exc_divide_error),
	INTG(X86_TRAP_NMI,		asm_exc_nmi),
	INTG(X86_TRAP_BR,		asm_exc_bounds),
	INTG(X86_TRAP_UD,		asm_exc_invalid_op),
	INTG(X86_TRAP_NM,		asm_exc_device_not_available),
	INTG(X86_TRAP_OLD_MF,		asm_exc_coproc_segment_overrun),
	INTG(X86_TRAP_TS,		asm_exc_invalid_tss),
	INTG(X86_TRAP_NP,		asm_exc_segment_not_present),
	INTG(X86_TRAP_SS,		asm_exc_stack_segment),
	INTG(X86_TRAP_GP,		asm_exc_general_protection),
	INTG(X86_TRAP_SPURIOUS,		asm_exc_spurious_interrupt_bug),
	INTG(X86_TRAP_MF,		asm_exc_coprocessor_error),
	INTG(X86_TRAP_AC,		asm_exc_alignment_check),
	INTG(X86_TRAP_XF,		asm_exc_simd_coprocessor_error),

#ifdef CONFIG_X86_32
	TSKG(X86_TRAP_DF,		GDT_ENTRY_DOUBLEFAULT_TSS),
#else
	INTG(X86_TRAP_DF,		asm_exc_double_fault),
#endif
	INTG(X86_TRAP_DB,		asm_exc_debug),

#ifdef CONFIG_X86_MCE
	INTG(X86_TRAP_MC,		asm_exc_machine_check),
#endif

	SYSG(X86_TRAP_OF,		asm_exc_overflow),
#if defined(CONFIG_IA32_EMULATION)
	SYSG(IA32_SYSCALL_VECTOR,	entry_INT80_compat),
#elif defined(CONFIG_X86_32)
	SYSG(IA32_SYSCALL_VECTOR,	entry_INT80_32),
#endif
};

以上是中断的地址,在内核启动过程中Start_Kernel->trap_init

void __init idt_setup_traps(void)
{
	idt_setup_from_table(idt_table, def_idts, ARRAY_SIZE(def_idts), true);
}

内核中断涉及的数据结构:


//这个结构体在5.x内核版本中扩展了很多,我裁剪了不太重要的成员。
struct irq_desc {
	struct irq_common_data	irq_common_data; //该中断的信息 如 中断号、 dev_id(实现中断共享的关键)
	irq_flow_handler_t	handle_irq;
	struct irqaction	*action;	/* IRQ action list */ 中断处理例程链表
}

Debian 10 中 Linux 4.19 内核在 x86_64 架构上对中断嵌套的支持情况 中断嵌套是指在一个中断处理程序(ISR)正在执行的过程中,另一个更高优先级的中断请求到来,系统暂停当前中断处理程序,转而处理新的高优先级中断。处理完高优先级中断后,系统返回到原来的中断处理程序继续执行。这种机制允许系统更高效地响应紧急事件,但同时也增加了系统复杂性和潜在风险。在Debian 10上运行的Linux 4.19内核,基于x86_64架构的CPU,默认情况下不支持硬中断嵌套。硬中断处理程序在执行期间会屏蔽相应的中断源,确保处理的原子性和一致性。 阅读详情

相关推荐

PayPal支付集成完全指南:开源库实践

本文介绍了如何从零开始集成PayPal支付功能。首先概述了PayPal提供的多语言SDK和开源库,包括PHP、Python、Node.js等版本。然后详细说明了准备工作,包括注册开发者账号、获取API凭证和使用沙盒环境测试。文章以Node.js为例,演示了安装SDK、基础配置和实现支付流程的完整代码,包括创建订单和捕获支付两个核心功能。最后提及了订阅支付等高级功能,为开发者提供了完整的支付集成方案。通过清晰的代码示例和步骤说明,帮助开发者快速实现PayPal支付功能集成。

2501_93501927的博客 1258

万字深入分析Linux系统调用与API

内核为了向用户空间提供服务,设计出了系统调用机制,系统调用机制可以让用户空间调用内核里的某些特定的函数。要实现系统调用机制需要有CPU提供的特殊指令才行。由于历史原因,系统调用指令在x86平台上不止有一个。系统调用指令的作用是把CPU模式切换到特权模式、让CPU跳到指定的入口函数来执行,并把用户空间提供的系统调用编号和参数传递进内核。入口函数根据系统调用编号调用相应的函数并传递参数,执行完毕后再返回用户空间。我们一般情况下并不会直接使用系统调用,操作系统为我们提供了非常丰富的API,用起来更方便。

youzhangjing_的博客 1122

ChatBI告别“NL2SQL依赖症”!从准确率50%到90%,3大技术路线+4个企业案例拆解核心玩法

摘要: ChatBI通过自然语言交互实现数据民主化,其核心是“语义理解+数据执行+知识沉淀”的全链路能力,而非单一的NL2SQL技术。行业采用三大技术路线提升准确率:专有知识库(提升30%)、指标标签语义层(准确率85%)、JSON中间层(多轮对话提升25%)。数据执行方案包括NL2SQL、NL2API等,需结合场景选择。企业落地需解决四大痛点:跨表查询准确率低(引入拓扑图)、模糊查询(用户干预机制)、响应慢(预计算缓存)、多轮对话(上下文池)。Spring AI Alibaba提供轻量级集成方案,助力企业

weixin_52610848的博客 1653

Linux内核5. 中断和中断处理

我们先来看一下中断的定义:中断机制:CPU在执行指令时,收到某个中断信号转而去执行预先设定好的代码,然后再返回到原指令流中继续执行,这就是中断机制。可以发现中断的定义非常简单。我们根据中断的定义来画一张图:在图灵机模型中,计算机是一直线性运行的。加入了中断之后,计算机就可以透明地在进程执行流中插入一段代码来执行。那么这么做的目的是什么呢?本文我们从中断的概念开始讲起,一路上分析了中断的作用、中断的产生、中断的处理。其中内容最多的是硬件中断的处理,方法很多很繁杂。

weixin_39757802的博客 2218

Databricks Genie:语义编译器架构与企业级智能解析实践

语义层是现代数据平台实现自然语言查询的核心基础,其本质是将业务术语映射为可执行、可治理的数据契约。原理上依赖结构化元数据、值字典与数据血缘三支柱协同,通过分层AI代理(如Intent Parsing、Retriever、Verifier)实现意图识别→语义对齐→安全执行的闭环。技术价值在于降低SQL使用门槛的同时保障审计性、一致性和权限可控性,适用于销售运营、财务分析等一线业务场景。本文深入解析Databricks Genie作为典型语义编译器的落地逻辑,涵盖Unity Catalog知识注入、七层Agen

weixin_29053695的博客 337

NoC架构深度解析:从拓扑结构到流量控制的全面指南

本文深入解析了片上网络(NoC)架构,从总线架构的瓶颈出发,阐述了NoC作为芯片内部“交通网”的核心优势。文章详细探讨了主流拓扑结构(如Mesh、Torus、Ring)的选型权衡,并系统介绍了数据包格式、路由算法、路由器流水线、流量控制机制以及网络接口(NI)设计,为理解现代多核SoC的通信基石提供了全面指南。

gg901的博客 1042

linux内核损坏的原因,Linux内核报错“General protection fault”原因

在Linux系统中,偶尔遇到内核报告”General protection fault”或#GP Fault,然后panic,系统宕机。在Intel编程手册中指出,General protection fault中断号为13,表示内存访问或保护检查出现异常。14号中断就是我们所熟悉的页面异常。12#SSStack-Segment FaultFaultYesStack operations and ...

weixin_36127579的博客 5217

如何优雅地进行频谱分析—— 一行代码实现绘制MATLAB频谱、功率谱图

之前的文章里讲了关于信号频谱、能量谱的相关理论和MATLAB编程实现方法: Mr.看海:信号频域分析方法的理解(频谱、能量谱、功率谱、倒频谱、小波分析) Mr.看海:频域特征值提取的MATLAB代码实现(频谱、功率谱、倒频谱) 不过对于刚刚开始进行这方面研究,或者对MATLAB不甚熟悉,抑或者不想花太多时间用在编程这件事上的同学,目前缺少一种足够便捷、高效、可靠的代码。 所以笔者想做这样一件事:编写一个函数,同学们只需要导入自己要分析的数据,并按照自己的需求设置部分选项,调用一行代码就可以实现绘制频

fengzhuqiaoqiu的博客 2万+

一次 irq_fpu_usable 内核报错排查总结

一次 irq_fpu_usable 内核报错排查总结

dongzhiyan_hjp 9595

Django 6.0:有哪些新特性以及它们对实际项目的重要性

Django 6.0 感觉像是一个成熟的版本,它基于实际应用案例而打造。它减少了不必要的复杂性,同时扩展了框架的开箱即用功能。升级到 Django 6.0 不仅仅是为了保持版本更新,更是为了构建更易于维护、更安全、更能适应未来发展的应用程序。

iCloudEnd的博客 341

js逆向-逆向部分技巧总结

js逆向-逆向部分技巧总结

Deng872347348的博客 2133

linux内核-X86CPU对中断的硬件支持

本博客不讨论严格意义上的中断响应全过程(比如说,怎样获得中断向量),而是着重讨论CPU在响应中断时,即在得到了中断向量以后,怎样进入相应的中断服务程序的过程。这是从操作系统的角度需要关心的问题。Intel x86 CPU支持256个不同的中断向量,这一点至今未变。可是,早期x86 CPU的中断响应机制非常原始、非常简单的。在实地址模式中,CPU把内存中从0开始的1K字节作为一个中断向量表。表中的每一个表项占四个字节,由两个字节的段地址和两个字节的位移组成。这样构成的地址便是相应中断服务程序的入口地址。这与1

guoguangwu的专栏 2628

12、无人机系统的建模与仿真

本文深入探讨了无人机系统的建模与仿真技术,涵盖其发展需求、历史演变、动力学建模方法、常用参考框架与状态变量表示,并分析了在控制系统设计、操作员培训和子系统测试中的关键应用。文章还介绍了不同类型无人机(固定翼、旋翼、混合翼)在建模与仿真中的差异,提出了多学科融合、高精度实时仿真及VR/AR技术等未来发展趋势,并给出了实际建模与仿真的标准操作流程,为无人机系统的设计与优化提供了全面的技术支持与展望。

websocket5live的博客 196

linux内核不受支持,Linux内核不支持中断嵌套(x86)?

The only difference between an interrupt gate and a trap gate is the way theprocessor handles the IF flag in the EFLAGS register. When accessing an exception-or interrupt-handling procedure through an...

weixin_29657209的博客 245

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

linux内核关闭中断_x86系统中的外部中断。 第2部分。Linux内核引导选项

linux内核关闭中断In the last part we discussed evolution of the interrupt delivery process from the devices in the x86 system (PIC → APIC → MSI), general theory, and all the necessary terminology. 在上一部分中,我们...

cullen2012的博客 2248

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

LINUX-内核-中断分析-中断向量表(1)-x86

x86体系中断概念在《深入理解Linux内核》第四章中提到,Intel文档提出了两个 概念。 第一个概念是把同步和异步中断分别称为异常(exception)和中断(interrupt); 第二个概念是进一步的,对于中断和异常,Intel又再细分了很多类,将中断分为可屏蔽中断和不可屏蔽中断;将异常分为故障、陷阱、异常中止和编程异常。 x86体系中断向量概念的引出以上这些概念及其逻辑当然会体现在x

liangll的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Linux 2.6.36 x86 内核中断初始化过程详解

<br />随着硬件技术的发展,中断控制芯片已经不再是传统的ISA总线连着的简单PIC了,APIC,MSI,MSIX等等的词语大家已经非常的熟悉。同时,Linux内核也在不断发展,它在中断上的实现也越来越复杂,在这里我来讨论介绍一下Linux x86 架构下的中断初始化过程。<br /> <br />在start_kernel()之前的中断门初始化就不多啰嗦了,在随便的内核教科书里都能看到,这里就从start_kernel以后开始。<br /> <br />1.8259a、LAPIC相关数据结构初始化<br

Shawn的专栏 3981

x86中断门与陷阱门对比:Linux 0.11 vs 现代内核的3点差异

本文深入对比了x86架构中中断门与陷阱门在Linux 0.11和现代内核中的核心差异,包括硬件机制、上下文切换优化和安全模型强化。重点分析了传统int 0x80与现代sysenter/syscall的性能差异,揭示了系统调用机制的演进对操作系统性能与安全性的重要影响。

掬水月在手,弄花香满衣 484

linux中断初始化程序,Linux x86_64 内核中断初始化

Linux x86_64 内核中断初始化中断分类Linux 系统中, 中断分为:硬中断: 由外部设备或者执行异常产生的需要快速处理的中断如缺页中断定时器硬件中断根据内部产生还是外部产生, 分为:异常: 异常是内部产生的中断, 不可屏蔽外部中断: 外部中断是由外部设备产生的, 可以屏蔽软中断:软中断是 Linux 系统中断处理的底半处理部分, 是 Linux 模拟的中断为了加快硬件中断的处理, 防止...

weixin_39630440的博客 305

linux内核中断处理学习笔记—x86

中断就是当软件或者硬件需要使用 CPU 时引发的 事件(event),通过APIC来处理中断请求。当一个中断发生时,操作系统必须确保下面的步骤顺序:内核必须暂停执行当前进程(取代当前的任务);内核必须搜索中断处理程序并且转交控制权(执行中断处理程序);中断处理程序结束之后,被中断的进程能够恢复执行。每个中断处理程序的地址都保存在中断描述符表(Interrupt Descriptor Table, IDT)中。

qq_45806499的博客 1354

linux内核中断 X86

按照目前的内核设计,中断有自己的栈,用来执行中断服务程序,这样是为了防止中断嵌套破坏与之共享的中断栈的定义,可以看到与进程上下文的布局相同,thread info + stack58 /*60 */1234567中断栈的初始化:创建percpu变量hardirq_ctx和softirq_ctx,类型为irq_ctx,所以每个cpu的软硬中断有各自的stack123hardirq_ctx和softirq_ctx的初始化方式相同,如下116 /*

uunubt的专栏 874

[Linux内核完全剖析]第五章Linux内核体系结构5.4-5.6总结 x86中断和时间控制

<br />x86中断子系统<br /> x86微机系统中采用了8259A可编程中断控制器,每个8259A可以管理8个中断源,通过多片级联方式,可以构成最多管理64个中断向量的系统。PC/AT中使用了2片8259A,共可管理15个中断向量。CPU通过IO指令对8259A进行初始化后,芯片就可以根据当前设定的优先级状态通过INT引脚来通知CPU中断请求。CPU响应后,会从数据总线D7-D0获取从芯片发送的中断号。<br /><br /> CPU根据中断号要获取中断服务地址,就需要一张中段向量表(实模式)/

系统中国 1050

Linux x86_64内核中断初始化

中断分类 Linux系统中,中断分为: 硬中断:由外部设备或者执行异常产生的需要快速处理的中断。如缺页中断、定时器硬件中断。 根据内部产生还是外部产生,分为: 异常:异常是内部产生的中断,不可屏蔽。 外部中断:外部中断是由外部设备产生的,可以屏蔽。 软中断: ​ 软中断是Linux系统中断处理的底半处理部分,是Linux模拟的中断。为了加快硬件中断的处理,防止数据的丢失,Linux对中断处理...

weixin_33910434的博客 236
上一篇: Linux 字符设备驱动程序
下一篇: Linux内核-tasklet微任务
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值