硬中断和虚拟中断号 在Linux 内核笔记之高层中断处理一文中,介绍了ARM gic中断控制器对于硬中断的处理过程。...gic的中断处理程序是从ack一个硬件中断开始的, 在gic的中断处理过程中,会根据中断的映射去寻找对应的虚拟中断号, 再去进行后续的中断处理。...对于软件工程师而言,我们不需要care是中断哪个中断控制器的第几个中断号, 因此linux kernel提供了一个虚拟中断号的概念。...irq_domain 接下来讨论硬件中断号是如何映射到虚拟中断号的linux kernel提供irq_domain的管理框架, 将hwirq映射到虚拟中断号上。...irq_data->hwirq中, 完成了硬中断到虚拟中断号的映射。
linux内核对缺页异常的处理流程很复杂,但是基本思想和上述流程差不多。...其中内核态异常分为1.vmalloc区异常,因为非vmalloc的内核区是直接对等映射的,只有vmalloc区是动态映射的。...下面看linux的基本处理流程: 内核处理缺页异常的主函数就是do_page_fault: /* * 缺页异常处理函数 * pt_regs 各个寄存器的值 * error_code,由硬件产生:...下面看内核态缺页异常具体的处理函数,内核态分为当前进程的页表内核映射部分没更新到最新的,此时需要进行页表同步,调用vmalloc_fault /* * 处理vmalloc异常或者模块区域映射异常 *...,内核调用copy_from_user时发生缺页异常,内核会将regs->ip也就是中断返回地址设置 //为这个地址,退出中断后不会在执行1: mov"itype" %2,%"rtype"1\n",
接下来会调用在内核启动时设备驱动注册的对应的中断服务程序(ISR)。 软件中断 当你在播放一个视频时,音频和视频是同步播放是相当重要的,这样音乐的速度才不会变化。...当系统需要实时性时(例如在工业应用中),软件中断会变得重要。你可以在 Linux 基金会的文章中找到更多相关信息:面向嵌入式开发者的实时 Linux 介绍。...中断描述表(interrupt descriptor table)(IDT)中记录了中断请求(IRQ)和中断服务程序(ISR)的对应关系。Linux 中定义了从 0 到 256 的 IRQ 向量。...为了打印出在你的系统中已注册的中断,打开一个终端并输入: cat /proc/interrupts 你应该会看到类似如下图的结果: image.png 从左到右各列的含义依次为:中断向量号、每个 CPU...其中一些在 Linux 内核源树中的Linux IRQ 向量布局中指定。 如果要实时获取该表,请运行如下命令: watch -n1 "cat /proc/interrupts"
中断向量表 在表4-2中,我们列出了IRQ的分配,中断号对应32-238。另外,Linux使用中断号128实现系统调用。...表4-2 Linux中断向量表 中断线号 使用范围 0–19 不可屏蔽中断和异常 20–31 为Intel保留 32–127 外部中断 128 系统调用专用 129–238 外部中断 239 APIC定时器中断...内核对于这类中断是不作处理的。但是内核如何检测这类中断呢?又是如何禁止这类中断呢?因为中断号是共享的,所以,内核不会一检测到非预期中断就禁止它,而是对于总的中断请求次数和未处理的中断次数进行计数。...也就是说,内核使用负数表示IRQ号,因为内核保留正数表示系统调用。...总结 其实内核经过这么多年的发展,在实现方式上已经发生了很大变化。但是其基本思想没变。比如我们以Linux4.4.203内核对于中断的处理为例,与上面的处理过程进行比较,理解其主要变化。
今天,我们了解一下内核同步的最后一种方法,关闭中断。这是一种简单粗暴的方式,但行之有效。 1 禁止中断 作为嵌入式软件开发人员,对于禁止中断肯定不陌生。...如果太长,会影响整个系统任务的调度,也有可能导致中断信号的丢失。 同样,Linux也不会放弃禁止中断这么好的同步机制。它保证内核控制路径可以继续执行,其访问的数据结构不会被中断处理程序破坏。...所以,在多核系统中,内核数据结构的保护一般是禁止中断搭配自旋锁一起使用。...当内核代码进入临界代码段时,通过清除eflags寄存器中的IF标志实现禁止中断,从而保护临界代码段。但是,当内核离开临界代码段的时候,内核是否该恢复之前的IF标志呢?还是不做任何处理?...但是,事情不会那么简单,有时候,内核需要只禁止可延时函数,而不禁止中断。那怎么实现呢?
linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...(4)软中断指令 int是软中断指令。 中断向量表是中断号和中断处理函数地址的对应表。 int n -- 触发软中断n。相应的中断处理函数的地址为:中断向量表地址 + 4 * n。...(5)硬中断和软中断的区别 软中断是执行中断指令产生的,而硬中断是由外设引发的。 硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。...内核不会立即处理重新触发的软中断。
【Linux内核锁】二、中断屏蔽 1、中断屏蔽思想 中断屏蔽,正如其名,屏蔽掉CPU的中断响应功能,解决并发引起的竞态问题。 在进入临界区前屏蔽中断,这么做有什么好处,以及有什么弊端?...弊端在于: Linux内核中,除了系统进程调度依赖中断,还有一些异步I/O等众多操作都依赖中断,因此长时间屏蔽中断是很危险的,会对系统造成严重影响,因此也要求临界区代码要简短。...关闭中断能够解决进程调度、中断引发的竞态,但是这些都是单CPU内部的,对于SMP对称多处理器,仍然不可避免的会收到其他CPU的中断。...因此,并不能解决SMP多CPU引发的竞态 因此,单独使用中断屏蔽通常不是一种值得推荐的避免竞态的方法 2、Linux内核中断屏蔽的实现 2.1 Linux内核提供的API接口 关于中断屏蔽,Linux内核所提供的接口如下...3、总结 该篇文章,主要了解以下几点: 中断屏蔽的思想 中断屏蔽的好处与不足 Linux内核提供的中断屏蔽接口 中断屏蔽的基本汇编实现
这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。 Linux2.6内核使用两种手段满足这项挑战:软中断和tasklet,还有工作队列。...2 软中断 Linux2.6内核中,软中断的数量比较少。对于多数目的,这些tasklet足够了。因为不需要考虑重入,所以简单易用。...Linux软中断处理程序总是从索引0开始执行。 2.1 软中断使用的数据结构 软中断的主要数据结构是softirq_vec数组,包含类型为softirq_action的32个元素。...这在Linux内核中是禁止的,因为其可延时函数的执行都是串行的。所以,在此需要禁止软中断。 清除正在执行的软中断对应掩码位。 执行local_irq_enable()使能中断。...它们都包含与CPU(NR_CPUS)相同个数的元素,这些元素的类型是tasklet_head,也就是说tasklet描述符的管理还是通过链表的结构进行管理(由此可以看出,链表在Linux内核数据管理中的作用了
文件的内存映射示意图: 对于用户进程和内核进程: 将用户进程的一段内存区域映射到内核进程,映射成功后,用户进程对这段内存区域的修改直接反映到内核空间,同样,内核进程对这段内存区域的修改也直接反映到用户空间...没有内存映射的I/O操作示意图: 磁盘->内核空间->用户空间 有内存映射的I/O操作示意图:少了一个copy操作 内存映射的优点: 减少了拷贝次数,节省I/O操作的开支 用户空间和内核空间可以直接高效交互...offset); start:用户进程中要映射的某段内存区域的起始地址,通常为NULL(由内核来指定) length:要映射的内存区域的大小 prot:期望的内存保护标志 flags:指定映射对象的类型...fd:要映射的文件描述符 offset:要映射的用户空间的内存区域在内核空间中已经分配好了的内存区域中的偏移 --prot参数取值: PROT_READ:映射区可读 PROT_WRITE:映射区可写...共享内存区在系统存储中的位置: 为什么要用共享内存: 对于涉及到内核操作的,内核和进程之间,经历了四次复制操作,开销很大。
前言 本文对内核中断进行概括以及讲述中断的具体实现方法在内核是怎么做的,会结合内核源码中的一些 .s 文件和 .c 文件来具体分析一下内核在中断中的实现方式。...跳转回正常工作的函数地址继续运行 2、Linux 中中断的工作流程 ①....将异常码(中断号)入栈 ③. 将当前的函数返回值进行入栈(为了在中断执行后能够找到在哪中断的,能够复原) ④. 调用对应的中断服务函数 ⑤. 出栈函数返回值 ⑥....,中断后的回复过程 中断的执行过程 硬件中断的处理过程 linux/kernel/asm.s traps.c 软件及系统调用的处理过程 linux/kernel/system_call.s fork.c.../asm.s trap.c 具体详细内容参考 Linux内核完全注释:基于0.11内核(修正版V3.0).pdf P55~P62 和 P256~P279 三、内核中断体系结构 1、trap_init
我们从mmap返回,vma还没有映射任何物理页的情景说起。 第一次访问vma区间的地址,导致缺页异常。内核调用do_anonymous_page,申请一页内存,完成映射。...这里需要明确一下,从内核的角度看,我们以MAP_ANONYMOUS调用mmap等完成的映射并不一定是匿名映射。...置位MAP_SHARED的情况下,内核会生成“假”(pseudo)文件与之对应(shmem_zero_setup),就不是匿名的了,vma->vm_pgoff等于0。...只有MAP_ANONYMOUS和 MAP_PRIVATE同时置位的情况下才是内核承认的匿名映射。 这里有以下两点需要注意。...folio_lock_anon_vma_read, .try_lock = true, }; 另外,rmap_walk_anon给出了vma、address和folio,但没有得到PTE,这个任务只能由rwc的回调函数自行完成,不过内核提供了
1 高端内存与内核映射 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途....即内核对于低端内存, 不需要特殊的映射机制, 使用直接映射即可以访问普通内存区域, 而对于高端内存区域, 内核可以采用三种不同的机制将页框映射到高端内存 : 分别叫做永久内核映射、临时内核映射以及非连续内存分配...2 持久内核映射 如果需要将高端页帧长期映射(作为持久映射)到内核地址空间中, 必须使用kmap函数....该区域用于持久映射. 不同体系结构使用的方案是类似的. 永久内核映射允许内核建立高端页框到内核地址空间的长期映射。...刚才描述的kmap函数不能用于中断处理程序, 因为它可能进入睡眠状态.
目录 64位内核映射DLL获取Zw函数调用功能号 一丶 简介 1.1 如何映射DLL 1.2 如何获取Zw功能调用号 二丶 代码示例 2.1 内存中映射文件 (模拟 Ring3 LoadLibrary)...2.2 Ring0下解析导出表 获取SystemCall功能号. 2.3 其它博客参考资料 64位内核映射DLL获取Zw函数调用功能号 一丶 简介 1.1 如何映射DLL 映射DLL其实很简单 在内核中使用...转载链接: 内核映射文件 简而言之只需要熟悉四个API即可....只不过 这是换到Ring0中使用了. 1.2 如何获取Zw功能调用号 上面是映射了DLL. 那么映射的DLL相当于内存中已经有了DLL数据了. 我们只需要解析导出表即可....我们主题是64位内核. 所以我们都在内核下做.
在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。 下图描述了Linux内核的中断处理机制。...为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点,Linux将中断处理程序分解为两个半部:顶半部和底半部。 ? ...尽管顶半部、底半部的结合能够善系统的响应能力,但是,僵化地认为Linux设备驱动中的中断处理一定要分两个半部则是不对的。如果中断要处理的工作本身很少,则完全可以直接在顶半部全部完成。 ...其他操作系统中对中断的处理也采用了类似于 Linux的方法,真正的硬件中断服务程序都斥尽量短。...在Linux内核中,用 softing_action结构体表征一个软中断,这个结构体包含软中断处理函数指针和传递给该函数的参数。
讲解这部分之前,我们先阐述一个概念-内核控制路径:就是一段在内核态执行的代码,比如说,异常处理程序,中断处理程序,系统调用处理,内核线程等等在内核态执行的代码。...比如,I/O设备引发一个中断,相应的内核态程序,首先,应该是保存内核态堆栈中的CPU寄存器的内容;然后,执行中断处理程序;最后,再恢复这些寄存器的内容。...内核控制路径可以任意嵌套;如下图所示,用户态的程序被中断打断,进入内核态响应中断;而这时候又来了其它中断,就会响应最新的中断,以此类推;但是,执行完一个中断处理程序之后,会回到之前的状态执行。...中断处理程序绝对不能包含页错误的操作,因为这会诱发进程切换。 Linux嵌套执行中断或异常处理程序的两个主要原因是: 为了提高可编程中断控制器和设备控制器的吞吐量。...内核正在处理一个中断的时候,能够及时响应另一个中断。 实现没有中断优先级的模型。这可以简化内核代码并提高可移植性。 在多核系统中,几个中断或异常处理程序可能会并发执行。
Java线程与Linux内核线程的映射关系Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。...Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核轻量级进程有一一对应的关系。...Java线程在Windows及Linux平台上的实现方式,现在看来,是内核线程的实现方式。...看图: Java线程与Linux内核线程的映射关系 (说明:KLT即内核线程Kernel Thread,是“内核分身”。...参考地址 http://www.hongyanliren.com/2015m07/35068.html 如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。
asm/io.h> #define ioremap(cookie,size) __arm_ioremap(cookie, size, MT_DEVICE) //cookie表示物理地址, size表示映射大小...ioremap把指定的物理地址映射到空闲的虚拟地址 void __iomem * __arm_ioremap(unsigned long phys_addr, size_t size, unsigned...拫据物理地址映射后的虚拟地址 虚拟地址 = ioremap(物理地址, 映射多大); 使用完后 iounmap(虚拟地址); //把映射表删除 2.
加上硬件中断号映射中断号的软件抽象 struct irq_domain,再看中断控制器软件抽象到中断源软件抽象的流程: ##中断流控处理层 这一层主要是隐藏了中断控制器在具体中断事件处理函数调用前后的一些处理逻辑...中断事件从中断源到中断控制器的映射的描述一般事先会静态定义好并存放在设备树源码里,即中断源的设备树节点包含着相连的中断控制器和中断事件对应在中断控制器中断号的信息;而作为驱动程序需要对软件中断号 irq...和中断事件处理函数建立映射。...那么要把设备树节点中的中断控制器和中断控制器中断号转换成软件中断号 irq,内核给驱动程序提供了接口: irq_of_parse_and_map:驱动由设备树节点获得 irq。...当中断控制器和中断控制器中断号转换成软件中断号 irq 映射不存在时,这个接口会申请 irq_desc 并建立映射,根据连接着的中断控制器的驱动提供的硬件中断号映射中断号的软件抽象 irq_domain
在linux内核映射物理地址的简单代码。 使用request_mem_region和ioremap映射物理地址。 映射之后,可通过虚拟地址读写对应的寄存器。
也就是说,中断重定向表就是外部IRQ到私有APIC的映射关系。 中断请求被分配到CPU上的方式有两种: 静态分配 按照重定向表中的定义把IRQ请求分配到相应的私有APIC高级可编程中断控制器上。...当一个CPU想给另一个CPU发送中断时,它就会把目标CPU的私有APIC的标识符和中断号存储到自己APIC的中断命令寄存器(ICR)中。...然后通过APIC总线发送给目标APIC,该APIC就会给自己的CPU发送一个相应的中断。 CPU间的中断(简称IPI)是多核系统一个重要组成部分。Linux有效地利用它们,在CPU之间传递消息。...内核必须为每种异常提供专用的处理函数。对于某些异常,CPU控制单元也会产生硬件错误码,并将其压入内核态栈,然后再启动异常处理函数。 下表是异常列表,列出了异常号,名称,类型等等。...其实对于Linux来说,只使用了supervisor和user两种特权等级。所以中断应该都是在supervisor特权等级下运行。
领取专属 10元无门槛券
手把手带您无忧上云