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

内核中断体系概括

前言 本文对内核中断进行概括以及讲述中断的具体实现方法在内核是怎么做的,会结合内核源码中的一些 .s 文件和 .c 文件来具体分析一下内核中断中的实现方式。...学习中断的目的: 1、硬件的中断响应 --------> 内核驱动中的中断 2、系统调用的函数响应(sys_call)--------> 系统调用 3、自定义中断--------> 软件的软中断模式...1、分类 Linux的中断分为硬件中断和软件中断中断:由电脑中主机的 8259A 类似的硬件中断控制芯片发出的中断或 ARM 中断控制器发出的中断中断:称为异常 第一类:CPU 自行保留的中断...做 CPU 工作模式的转化 ②. 进行寄存器的拷贝与压栈 ③. 设置中断异常向量表 ④. 保存正常运行的函数返回值 ⑤. 跳转到对应的中断服务函数上运行 ⑥. 进行模式的复原以及寄存器的复原 ⑦..../asm.s trap.c 具体详细内容参考 Linux内核完全注释:基于0.11内核(修正版V3.0).pdf P55~P62 和 P256~P279 三、内核中断体系结构 1、trap_init

8410

内核中断子系统介绍

中断子系统 现在把之前的流程具有的部分对比内核中断子系统,可以发现还多出了一个通用中断处理层。...因为内核需要支持各种不同的架构与外设,需要解耦架构硬件相关部分(cpu 与中断控制器)与非架构相关(外设),使得开发外设驱动并不需要了解架构相关部分。...这里举例部分内核实现: handle_simple_irq:用于简易流控处理。 handle_level_irq:用于电平触发中断的流控处理。...那么要把设备树节点中的中断控制器和中断控制器中断号转换成软件中断号 irq,内核给驱动程序提供了接口: irq_of_parse_and_map:驱动由设备树节点获得 irq。...希望帮助大家得出诸如“arm 内核中断嵌套吗”“arm cpu eoi 是做什么”这类问题的答案。

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

linux内核缺页中断处理

缺页中断处理一般流程: 1.硬件陷入内核,在堆栈中保存程序计数器,大多数当前指令的各种状态信息保存在特殊的cpu寄存器中。 2.启动一个汇编例程保存通用寄存器和其他易丢失信息,以免被操作系统破坏。...7.当磁盘中断发生时,表明该页已经被装入,页表已经更新可以反映他的位置,页框也标记位正常状态。 8.恢复发生缺页中断指令以前的状态,程序计数器重新指向这条指令。...9.调度引发缺页中断的进程,操作系统返回调用他的汇编例程 10.该例程恢复寄存器和其他状态信息,返回到用户空间继续执行,就好像缺页中断没有发生过。...(DIE_PAGE_FAULT, "page fault", regs, error_code, 14, SIGSEGV) == NOTIFY_STOP) return; /* 如果中断关闭则开中断...,内核调用copy_from_user时发生缺页异常,内核会将regs->ip也就是中断返回地址设置 //为这个地址,退出中断后不会在执行1: mov"itype" %2,%"rtype"1\n",

10.6K21

Linux内核36-内核同步之禁止中断

今天,我们了解一下内核同步的最后一种方法,关闭中断。这是一种简单粗暴的方式,但行之有效。 1 禁止中断 作为嵌入式软件开发人员,对于禁止中断肯定不陌生。...如果太长,会影响整个系统任务的调度,也有可能导致中断信号的丢失。 同样,Linux也不会放弃禁止中断这么好的同步机制。它保证内核控制路径可以继续执行,其访问的数据结构不会被中断处理程序破坏。...所以,在多核系统中,内核数据结构的保护一般是禁止中断搭配自旋锁一起使用。...当内核代码进入临界代码段时,通过清除eflags寄存器中的IF标志实现禁止中断,从而保护临界代码段。但是,当内核离开临界代码段的时候,内核是否该恢复之前的IF标志呢?还是不做任何处理?...但是,事情不会那么简单,有时候,内核需要只禁止可延时函数,而不禁止中断。那怎么实现呢?

1.3K20

Linux内核笔记之中断映射

中断和虚拟中断号 在Linux 内核笔记之高层中断处理一文中,介绍了ARM gic中断控制器对于硬中断的处理过程。...gic的中断处理程序是从ack一个硬件中断开始的, 在gic的中断处理过程中,会根据中断的映射去寻找对应的虚拟中断号, 再去进行后续的中断处理。...当前的SOC,通常内部会有多个中断控制器(比如gic interrupt controller, gpio interrupt controller), 每一个中断控制器对应多个中断号, 而硬件中断号在不同的中断控制器上是会重复编码的..., 这时仅仅用硬中断号已经不能唯一标识一个外设中断。...对于软件工程师而言,我们不需要care是中断哪个中断控制器的第几个中断号, 因此linux kernel提供了一个虚拟中断号的概念。

5K30

Linux 内核如何处理中断

此外,键盘并不是导致中断的唯一组件。一般来说,有三种类型的事件会导致 CPU 发生中断:硬件中断、软件中断和异常。在具体介绍不同类型的中断前,我需要先定义一些术语。...在过去,中断请求由单独的芯片处理(中断控制器芯片 PIC),I/O 设备直接与中断控制器(PIC)相连。中断控制器(PIC)管理着多种硬件的中断请求(IRQ),并且可以直接与 CPU 通信。...当一个中断请求(IRQ)产生后,中断控制器(PIC)向 CPU 写入数据,并且触发中断请求引脚(INTR)。...接下来会调用在内核启动时设备驱动注册的对应的中断服务程序(ISR)。 软件中断 当你在播放一个视频时,音频和视频是同步播放是相当重要的,这样音乐的速度才不会变化。...其中一些在 Linux 内核源树中的Linux IRQ 向量布局中指定。 如果要实时获取该表,请运行如下命令: watch -n1 "cat /proc/interrupts"

2.3K40

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

内核对于这类中断是不作处理的。但是内核如何检测这类中断呢?又是如何禁止这类中断呢?因为中断号是共享的,所以,内核不会一检测到非预期中断就禁止它,而是对于总的中断请求次数和未处理的中断次数进行计数。...当总的中断次数达到100000次,而未处理的中断是99900次时,内核就会禁止该中断。...如果这个联合体的大小是8KB,内核态堆栈可以被任何一种内核控制路径使用:异常处理程序,中断处理程序和可延时函数。...相反,如果这个联合体的大小是4KB,内核使用三种类型的内核态堆栈: 异常堆栈 处理异常时使用,包含系统调用。每个进程都有一个异常处理使用的堆栈。 硬IRQ堆栈 用于处理中断。...数组的个数是NR_IRQS,如果内核支持I/O-APIC芯片,则NR_IRQS等于224,如果内核支持的是较旧的8259A中断控制器,则NR_IRQS等于16。

2.2K20

内核知识第十一讲,门,以及中断中断异常.

内核知识第十一讲,门,以及中断中断异常. 一丶TSS和TR寄存器....二丶中断中断异常. 首先,什么是中断? 在我们的8086的年代里面. 调用API的是否是 int 21来进行调用的. 这就是一个中断.中断是什么?  其实中断就是一个电信号....比如用户操作键盘,键当被按下就会产生一个中断.  但是CPU能接受到这个中断.但是不能去处理. 这个要操作系统去处理. 所以当有中断产生, CPU就会查表 . 表内容是固定的. ...在80386里面.有两个银脚,是专门接受中断信号的. 而且80386最多接受256种中断或者异常....二丶中断表的概念 我们上面说过,中断是CPU和操作系统通信的一种机制. CPU接受中断. 那么就要查表.而操作系统要往这个表中填写函数指针.让CPU去执行.

41720

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

【Linux内核锁】二、中断屏蔽 1、中断屏蔽思想 中断屏蔽,正如其名,屏蔽掉CPU的中断响应功能,解决并发引起的竞态问题。 在进入临界区前屏蔽中断,这么做有什么好处,以及有什么弊端?...弊端在于: Linux内核中,除了系统进程调度依赖中断,还有一些异步I/O等众多操作都依赖中断,因此长时间屏蔽中断是很危险的,会对系统造成严重影响,因此也要求临界区代码要简短。...关闭中断能够解决进程调度、中断引发的竞态,但是这些都是单CPU内部的,对于SMP对称多处理器,仍然不可避免的会收到其他CPU的中断。...因此,并不能解决SMP多CPU引发的竞态 因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法 2、Linux内核中断屏蔽的实现 2.1 Linux内核提供的API接口 关于中断屏蔽,Linux内核所提供的接口如下...3、总结 该篇文章,主要了解以下几点: 中断屏蔽的思想 中断屏蔽的好处与不足 Linux内核提供的中断屏蔽接口 中断屏蔽的基本汇编实现

40720

Linux内核22-软中断和tasklet

相反,这些可延时任务执行时,可以使能中断。那么,将这些任务从中断处理程序中剥离出来,可以有效地保证内核对于中断响应时间尽可能短。...软中断和tasklet这两个术语是息息相关的,因为tasklet是基于软中断实现的。事实上,出现在内核源代码中的软中断概念有时候指的就是这两个术语的统称。...另一个广泛使用的术语是中断上下文:可以是内核正在执行的中断处理程序,也可以是一个可延时处理的函数。...更重要的是,外部事件,比如网卡上的数据包泛滥也可以频繁地激活软中断。 连续大量的软中断会造成潜在的问题,引入内核线程也是为了解决这个问题。如果没有这个内核线程,开发者只能使用两种替代策略。...迭代一些次数后,如果还有软中断挂起,函数就会唤醒内核线程,自身终止,交给内核线程去处理后续的软中断内核线程的优先级比较低,用户程序的执行不会受到影响。

1.3K30

内核地址空间大冒险2:中断与异常

前情回顾: 通过系统调用进入内核空间的这个虫洞我终于弄清楚了,可我的冒险还要继续······ 详情参见:内核地址空间大冒险:系统调用 1 除0错误 我是一个线程,出生在Linux帝国,今天我的任务是去执行一段人类用...开始的工作很顺利,一共执行了18次系统调用,对于来往于用户空间与内核空间的那个虫洞我已经轻车熟路,再也不是萌新一枚。...2 中断&异常 “年轻人,欢迎来到内核地址空间”,熟悉的问候语响起,走过来一位白发老头,却不是我在系统调用时见过的那位,拄着一根木棍,挂着一只葫芦,看起来年纪比系统调用那个老头还要大一些。 ?...“这里是中断描述符表——IDT,是所有中断和异常发生时,你们会来到的地方”,老头用了一堆我不懂的话来回答我。 “中断又是什么?和异常又是什么关系?IDT又是做什么的?”,我向老头发出了灵魂三问。...“你现在看看你的内核堆栈上面存了什么?” 我低头看了一眼我的内核堆栈,发现上面居然保存了除0指令之后那条指令的地址,这正是我要回去的地方。 ?

52210

内核地址空间大冒险2:中断与异常

前情回顾: 通过系统调用进入内核空间的这个虫洞我终于弄清楚了,可我的冒险还要继续······ 详情参见:内核地址空间大冒险:系统调用 1 除0错误 我是一个线程,出生在Linux帝国,今天我的任务是去执行一段人类用...开始的工作很顺利,一共执行了18次系统调用,对于来往于用户空间与内核空间的那个虫洞我已经轻车熟路,再也不是萌新一枚。...2 中断&异常 “年轻人,欢迎来到内核地址空间”,熟悉的问候语响起,走过来一位白发老头,却不是我在系统调用时见过的那位,拄着一根木棍,挂着一只葫芦,看起来年纪比系统调用那个老头还要大一些。 ?...“这里是中断描述符表——IDT,是所有中断和异常发生时,你们会来到的地方”,老头用了一堆我不懂的话来回答我。 “中断又是什么?和异常又是什么关系?IDT又是做什么的?”,我向老头发出了灵魂三问。...“你现在看看你的内核堆栈上面存了什么?” 我低头看了一眼我的内核堆栈,发现上面居然保存了除0指令之后那条指令的地址,这正是我要回去的地方。 ?

42640

Linux内核中断顶半部和底半部的理解

中断上半部、下半部的概念   设备的中断会打断内核进程中的正常调度和运行,系统对更高吞吐率的追求势必要求中断服务程序尽量短小精悍。但是,这个良好的愿望往往与现实并不吻合。...它会引起内核中相关的代码被触发。对于那些需要花费一些时间去处理的进程,中断代码本身也可以被其他的硬中断中断。   4. 对于时钟中断内核调度代码会将当前正在运行的进程挂起,从而让其他的进程来运行。...而内核主要负责对需要运行的任何其他的进程进行调度。一些内核允许设备驱动的一些部分存在于用户空间,并且当需要的时候内核也会调度这个进程去运行。   4. 软中断并不会直接中断CPU。...硬中断、软中断和信号的区别   硬中断是外部设备对CPU的中断,软中断中断底半部的一种处理机制,而信号则是由内核(或其他进程)对某个进程的中断。...需要特别说明的是,软中断以及基于软中断的tasklet如果在某段时间内大量出现的话,内核会把后续软中断放入ksoftirqd内核线程中执行。总的来说,中断优先级高于软中断,软中断又高于任何一个线程。

1.7K30

内核的雏形(下) -- 添加异常中断响应机制

引言 经过上一篇文章中历史性的一跳,以及堆栈和 GDT 的切换,我们终于进入到了内核内核的雏形(上) -- 创建属于 kernel 的堆栈与 GDT 接下来我们要做的当然就是在内核中创建进程并且调度起来...要想在一个 CPU 上不断切换进程以实现多个进程的并发调度,我们就必须借助于中断机制,因此,在实现内核进程前,我们首先需要初始化和添加中断处理。...此前的文章中,我们已经介绍过,添加中断处理的工作只有两部分: 建立中断描述附表 IDT 初始化 8259A 可编程中断控制器 本文基本上完全是之前文章的重复,有任何疑问,请回顾参看此前的两篇文章: 保护模式下的中断和异常...loader.asm 中就是 loader 的源码了,他的工作主要是从软盘读取 kernel,初始化保护模式所需的内存数据结构,跳转进入内核。...2.2 kernel 当前代码中,kernel 的主要工作是将 loader 初始化过的保护模式所需的内存数据结构,也就是 GDT 复制到内核的内存地址空间中,然后就是本文将要叙述的初始化 IDT 并加载以及对

41920

Linux内核18-中断和异常的嵌套处理

讲解这部分之前,我们先阐述一个概念-内核控制路径:就是一段在内核态执行的代码,比如说,异常处理程序,中断处理程序,系统调用处理,内核线程等等在内核态执行的代码。...比如,I/O设备引发一个中断,相应的内核态程序,首先,应该是保存内核态堆栈中的CPU寄存器的内容;然后,执行中断处理程序;最后,再恢复这些寄存器的内容。...内核控制路径可以任意嵌套;如下图所示,用户态的程序被中断打断,进入内核态响应中断;而这时候又来了其它中断,就会响应最新的中断,以此类推;但是,执行完一个中断处理程序之后,会回到之前的状态执行。...图4-3 内核控制路径的一个嵌套异常的示例 允许内核控制路径嵌套的代价就是中断处理程序不能阻塞,也就是说,中断处理程序运行时不能发生进程切换。...内核正在处理一个中断的时候,能够及时响应另一个中断。 实现没有中断优先级的模型。这可以简化内核代码并提高可移植性。 在多核系统中,几个中断或异常处理程序可能会并发执行。

2K20

ARM cortex 内核编程模式

ARM cortexM4 内核的编程模式,处理器模式和软件执行的特权级别简介 处理器模式 处理器模式包含: 线程模式:常用来执行应用软件,处理器复位后,进入线程模式执行应用软件。...软件执行的特权级别分为: 非特权模式:顾名思义,在这种模式下,权限是有限的,软件只有有限的权利对MSR和MRS指令,并且不能使用CPS指令,不能使用系统定时器,内嵌中断控制器,系统控制块,对内存和外设的访问有权限限制...只有特权软件在线程模式下才能改写控制寄存器来改变软件执行的特权级别。 内核寄存器 cortex M4内核寄存器主要有: ? R0~R12 通用寄存器,32位的为数据操作的通用寄存器。...MSP,PSP,main堆栈指针,处理器堆栈指针,R13 LR,链接寄存器, R14 PC,程序计数器, R15 PSR,程序状态寄存器 ASPR,应用程序状态寄存器 IPSR,中断程序状态寄存器 EPSR...CONTROL, 控制寄存器 具体的寄存器操作以及使用请参照ARM官方文档,部分寄存器我们在前面的ARM相关课程里已经讲过了,这里不赘述,如果记不住也没关系,在具体项目应用时候在参照官方文档,但了解这些内核知识还是很必要的

1.1K90

Linux内核17-硬件如何处理中断和异常

Intel期望每次进程切换的时候,操作系统内核修改这个寄存器。 如果有多个CPU拥有相同的最低任务优先级,则使用仲裁技术分配中断请求。...内核必须为每种异常提供专用的处理函数。对于某些异常,CPU控制单元也会产生硬件错误码,并将其压入内核态栈,然后再启动异常处理函数。 下表是异常列表,列出了异常号,名称,类型等等。...那么,剩下的工作就是内核的了,内核使用一个中断描述符表(IDT),记录每个中断或者异常编号以及相应的处理函数。那么,收到中断信号后,将相应的处理函数的地址加载到eip寄存器中执行即可。...陷阱门 同中断门类似,只是不会修改IF标志。 4 中断和异常的硬件处理 现在,我们来探究一下CPU控制单元是如何处理中断和异常的。我们假设内核已经完成初始化,CPU工作在保护模式下。...这么做,可以禁止用户态程序使用先前内核态的段寄存器。如果这些寄存器没有被清除,恶意用户态程序就可以利用它们访问内核地址空间。

2K10

内核中断系统中的设备树

中断体系在4.x内核中变化很大,中断体系又跟pinctrl系统密切相关,pinctrl中又涉及GPIO子系统,这样讲下去的话,设备树课程就变成驱动专题了,所以我打算只讲中断体系统,对于pinctrl、gpio...a.执行reguest_irq(virq,my_handler):内核根据virq可以知道对应的硬件中断,让后去设置,使能中断等操作 b.发生硬件中断时,内核读取硬件信息,确定hwirq,反算出virq...,让后调用irq_desc[virq].handle_irq,最终会用到my_handler 内核怎么根据硬件中断号,反算出虚拟中断号?...,…),中断号是通过宏方式进行定义的,所以直接使用中断号进行注册 如何使用新型中断号,注册irq 先在设备树中表明要使用那个中断内核解析设备树时才会把这个中断号和某一个虚拟中断号挂钩,这些信息会转换成...29,在irqs.h中对应的宏是 #define IRQ_TIMER3 S3C2410_IRQ(13) 2440使用第三个定时器作为系统滴答,使用老内核中断号都是固定 使用新内核启动: nfs

1.1K31

64位内核开发第十讲,IRQL中断级别了解

中断级别IROL了解 一丶IRQL 1.了解什么是中断 中断就是产生的一个电信号.比如键盘.当按下就会产生电信号发送给CPU 而CPU就会停止当前处理.去执行电信号.他是根据IRQL中断级别来进行处理的...中断说白了就是个电信号.打断CPU执行的代码. 去调用中断处理函数. 此时CPU就处于硬件上下文. 2.IROL中断级别....因为会产生很多CPU电信号.所有硬件同是发送中断处理级别怎么办.所以需要为这些级别分一个优先级. CPU会先执行优先级高的.会把优先级低的给屏蔽掉. 当CPU处于中断上下文的时候....了解CPU的上下文.至少脑海需要有印象 上下文 说明 中断上下文 CPU代替硬件做某些事情. 进程上下文 CPU代替进程做某些事情. 中断级别了解 如下图: ?...我们可以加入一个宏.来判断当前的中断级别.有没有高于APC 产生一个断言.如果当前级别大于APC级别就会报错. 断言宏的意思就是 我决定当前的事就是某事. 如果你不是我指定的.

89020
领券