linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...(4)软中断指令 int是软中断指令。 中断向量表是中断号和中断处理函数地址的对应表。 int n -- 触发软中断n。相应的中断处理函数的地址为:中断向量表地址 + 4 * n。...(5)硬中断和软中断的区别 软中断是执行中断指令产生的,而硬中断是由外设引发的。 硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。...在ksoftirqd内核线程中 c. 在那些显示检查和执行待处理的软中断的代码中,如网络子系统中 而不管是用什么方法唤起,软中断都要在do_softirq()中执行。
在linux中可以通过/proc/interrupts查看当前系统中所有中断的统计信息,在/proc/irq/xxx(中断号)下面,可以看到该中断的详细信息。...对应I/O APIC和local APIC的组合,其连接方式见下图 ? 针对X86中断控制器硬件和linux对这些硬件的初始化,在《interrupt in linux》中有很详细的描述。...初始化 相关概念和关键数据结构 1、 irq号:在当前系统中全局唯一,对应内核数据结构struct irq_desc,每个外设的中断有一个irq号(体系结构预留的中断,是没有对应的irq_desc结构和...irq号的),该irq在该中断的生命周期内都不会改变,且和该中断的中断处理函数关联;内核使用一个bitmap allocated_irqs来标识当前系统已经分配的irq;irq号的管理与底层中断设备和配置无关...2、ISA irqs,对这些中断,在初始化过程中已经完成了irq_desc、vector_irq、以及IDT中对应entry的分配和设置,同时可以发现ISA中断,在初始化的时候都被设置为运行在0号CPU
,也同时加深自己的理解,中断和中断虚拟机实在太绕了,直接看代码那就是看天书,先掌握原理和设计再看代码会好一点,争取后面再写写细节和代码分析,一步一步来搞定它。...首先BIOS启动时发现中断控制器,把收集到的中断控制器的信息放在ACPI表中,操作系统起来后就知道有那些中断控制器,中断控制器和CPU/外设之间连接关系是怎么样的。...中断虚拟化有点复杂,guest也是可能mask/unmask中断的,guest也有不可mask的中断,guest的两个虚拟CPU之间也要发IPI中断,一个虚拟CPU发送中断时exit出来,把真正的中断号写到目标虚拟...Virtual-Interrupt Delivery virtual-APIC page每个位置就代表着硬件LAPIC的寄存器,把中断号写到virtual-APIC page中一个位置中断就自动投递给虚拟...硬件根据写的信息得进行中断逻辑处理,得出要投递的中断号,写到virtual-APIC page中,目标虚拟CPU在guest模式每个指令前都要检查一下outstanding notification,如果
Linux虚拟内存地址空间 为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。 虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。...事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中...操作系统中的缺页中断 malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。...缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。...,由硬件所产生的一种特殊的中断,因此,与一般的中断存在区别: 1、在指令执行期间产生和处理缺页中断信号 2、一条指令在执行期间,可能产生多次缺页中断 3、缺页中断返回是,执行产生中断的一条指令,而一般的中断返回是
这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。 Linux2.6内核使用两种手段满足这项挑战:软中断和tasklet,还有工作队列。...软中断和tasklet这两个术语是息息相关的,因为tasklet是基于软中断实现的。事实上,出现在内核源代码中的软中断概念有时候指的就是这两个术语的统称。...2 软中断 Linux2.6内核中,软中断的数量比较少。对于多数目的,这些tasklet足够了。因为不需要考虑重入,所以简单易用。...事实上,只使用了6类软中断,如下表所示: 表4-9 Linux2.6中使用的软中断 软中断 优先级 描述 HI_SOFTIRQ 0 处理高优先级的tasklet TIMER_SOFTIRQ 1 定时器中断...Tasklet和高优先级的tasklet分别存储在 tasklet_vec和tasklet_hi_vec数组中。
引言 软中断、tasklet和工作队列并非Linux内核中一直存在的机制,而是由更早版本号的内核中的“下半部”(bottom half)演变而来。 下半部的机制实际上包含五种,但2.6版本号的内核中。...将其放在中断处理程序中运行。 假设一个任务和硬件相关,将其放在中断处理程序中运行。 假设一个任务要保证不被其它中断(特别是同样的中断)打断,将其放在中断处理程序中运行。...软中断运行函数 do_softirq-->__do_softirq 运行软中断处理函数__do_softirq前首先要满足两个条件: (1)不在中断中(硬中断、软中断和NMI) 。...在工作队列和软中断/tasklet中作出选择很easy。可使用以下规则: – 假设推后运行的任务须要睡眠,那么仅仅能选择工作队列。...详细流程图例如以下所看到的: ---- 是否处于中断中在Linux中是通过preempt_count来判断的,详细例如以下: 在linux系统的进程数据结构里,有这么一个数据结构: #define
系统初始化的时候,定义和初始化了中断向量表。并初始化8259的工作方式。...linux0.11分为中断、系统、陷阱门。系统在启动的时候设置idt。...for (i=17;i<48;i++) set_trap_gate(i,&reserved); set_trap_gate(45,&irq13); // 允许8259接收中断...在这里插入图片描述 还有一些是键盘,软盘等也设置中断。下面看一个异常处理程度。...pushl %edx pushl %eax // 1和eax与,结果放到ZF中 testl $1,%eax // zf=0则跳转,即0是写异常,1是缺页异常
在设备树中,中断控制器节点中必须有一个属性:interrupt-controller,表明它是“中断控制器”。...3.在代码中获得中断 之前我们提到过,设备树中的节点有些能被转换为内核里的platform_device,有些不能,回顾如下: A....调用of_irq_get获得中断号 如果你的设备节点既不能转换为platform_device,它也不是I2C设备,不是SPI设备,那么在驱动程序中可以自行调用of_irq_get函数去解析设备树,得到中断号...label = "User Button"; gpios = ; gpio-key,wakeup; linux...,code = ; }; }; 那么可以使用下面的函数获得引脚和flag: button->gpio = of_get_gpio_flags(pp, 0, &flags); bdata
比如,I/O设备引发一个中断,相应的内核态程序,首先,应该是保存内核态堆栈中的CPU寄存器的内容;然后,执行中断处理程序;最后,再恢复这些寄存器的内容。...恢复执行嵌套内核控制路径的所有数据都存储在内核态堆栈中,而该堆栈又和当前进程紧紧绑定在一起。通俗的说,中断处理程序相当于当前进程的资源,切换进程之前该中断资源必须释放掉。...和异常相反,尽管内核代表当前进程处理这些中断,但是,I/O设备引发的中断和当前进程没有直接数据引用的关系。事实上,给定一个中断,无法推断出是哪个进程在运行。...中断处理程序绝对不能包含页错误的操作,因为这会诱发进程切换。 Linux嵌套执行中断或异常处理程序的两个主要原因是: 为了提高可编程中断控制器和设备控制器的吞吐量。...内核正在处理一个中断的时候,能够及时响应另一个中断。 实现没有中断优先级的模型。这可以简化内核代码并提高可移植性。 在多核系统中,几个中断或异常处理程序可能会并发执行。
在大多数真实的系统中,当中断到来时,要完成的工作往往并不会是短小的,它可能要进行较大量的耗时处理。 下图描述了Linux内核的中断处理机制。...为了在中断执行时间尽量短和中断处理需完成的工作尽量大之间找到一个平衡点,Linux将中断处理程序分解为两个半部:顶半部和底半部。 ? ...尽管顶半部、底半部的结合能够善系统的响应能力,但是,僵化地认为Linux设备驱动中的中断处理一定要分两个半部则是不对的。如果中断要处理的工作本身很少,则完全可以直接在顶半部全部完成。 ...其他操作系统中对中断的处理也采用了类似于 Linux的方法,真正的硬件中断服务程序都斥尽量短。...在Linux内核中,用 softing_action结构体表征一个软中断,这个结构体包含软中断处理函数指针和传递给该函数的参数。
MSI和MSI-X中断机制 在PCI总线中,所有需要提交中断请求的设备,必须能够通过INTx引脚提交中断请求,而MSI机制是一个可选机制。...• Capability ID字段记载MSI Capability结构的ID号,其值为0x05。在PCIe设备中,每一个Capability结构都有唯一的ID号。...在许多中断控制器中,Message Data字段连续也意味着中断控制器需要为这个PCIe设备分配8个连续的中断向量号。...有时在一个中断控制器中,虽然具有8个以上的中断向量号,但是很难保证这些中断向量号是连续的。...在该结构中,使用MSI-X Table存放该设备使用的所有Message Address和Message Data字段,这个表格存放在该设备的BAR空间中,从而PCIe设备可以使用MSI-X机制时,中断向量号可以并不连续
在上一篇文章中,我们已经了解了中断和异常的一些概念,对于中断和异常也有了大概的理解。那么,系统中硬件到底是如何处理中断和异常的呢?本文我们就以常见的X86架构为例,看看中断和异常的硬件工作原理。...当一个CPU想给另一个CPU发送中断时,它就会把目标CPU的私有APIC的标识符和中断号存储到自己APIC的中断命令寄存器(ICR)中。...然后通过APIC总线发送给目标APIC,该APIC就会给自己的CPU发送一个相应的中断。 CPU间的中断(简称IPI)是多核系统一个重要组成部分。Linux有效地利用它们,在CPU之间传递消息。...下表是异常列表,列出了异常号,名称,类型等等。更多信息请参考Intel技术手册。...其实对于Linux来说,只使用了supervisor和user两种特权等级。所以中断应该都是在supervisor特权等级下运行。
介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...中断也是如此,当系统收到中断事件后,进行中断处理的时候,也需要中断栈来支持函数调用。由于系统中断的时候,系统当然是处于内核态的,所以中断栈是可以和内核栈共享的。...X86 上中断栈就是独立于内核栈的;独立的中断栈所在内存空间的分配发生在 arch/x86/kernel/irq_32.c 的 irq_ctx_init() 函数中 (如果是多处理器系统,那么每个处理器都会有一个独立的中断栈...而 ARM 上中断栈和内核栈则是共享的;中断栈和内核栈共享有一个负面因素,如果中断发生嵌套,可能会造成栈溢出,从而可能会破坏到内核栈的一些重要数据,所以栈空间有时候难免会捉襟见肘。
前言 在Java多线程编程中,正确处理线程中断和异常对于确保程序的稳定性和健壮性至关重要。本文将介绍一些关键的最佳实践,并提供示例代码来说明这些观点。 1....理解中断机制 Java中的中断机制允许一个线程通知另一个线程应该停止当前的操作。当一个线程被中断时,它的中断状态会被设置为true。...避免在finally块中再次中断 不要在finally块中调用Thread.currentThread().interrupt(),因为这会重新设置中断状态。...通过定期检查中断状态、清理资源、使用ExecutorService和Future等工具,我们可以提高程序的稳定性和健壮性。记住,测试并发代码同样重要,以确保在多线程环境中程序能够正确运行。...希望这篇文章能帮助你更好地理解如何在Java中优雅地处理线程中断和异常。如果你有任何疑问或需要进一步的帮助,请随时留言。
大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【中断处理中的下半部分机制-工作队列】。...在刚开始介绍中断处理的时候,曾经贴出下面这张图: 图中描述了中断处理中的下半部分都有哪些机制,以及如何根据实际的业务场景、限制条件来进行选择。...工作队列是什么 工作队列是Linux操作系统中,进行中断下半部分处理的重要方式! 从名称上可以猜到:一个工作队列就好像业务层常用的消息队列一样,里面存放着很多的工作项等待着被处理。...创建驱动程序源文件和 Makefile: $ cd tmp/linux-4.15/drivers $ mkdir my_driver_interrupt_wq $ touch my_driver_interrupt_wq.c...说明:驱动程序的初始化函数 myirq_init 被调用了,并且成功注册了 1 号中断的处理程序。 此时,按一下键盘上的 ESC 键。
>:会覆盖原文件内容,时间会自动更新 >>:另起一行,不会覆盖文件内容,自己会自动更新 exp: 1.history >history.log
图片在上一期的接线基础上,要接上触摸相关的几根线TP_RST为触摸复位脚,接GPIO2_C2,也就是tinkerboard2 40PIN排针的36脚TP_INT为触摸中断脚,接GPIO2_C3,也就是tinkerboard2...tp-size = ; //与源码中选择的配置相关 status = "okay"; };};通过配置GT911上电时中断脚和复位脚电平时序...,可以切换其I2C地址为0x5d和0x14的其中之一,这一设计是为了解决I2C冲突,这里可以任选一个touch-gpio是中断脚,reset-gpio是复位脚,配置和硬件接线一致max-x和max-y分别是...在Linux下,鼠标,键盘,触摸这些都是INPUT设备,Android上层会监听所有的INPUT设备上报事件,如果有坐标上报事件,则会进行响应在Android中,打开设置-系统-开发者选项 ( 如果找不到开发者选项...SENSOR_TYPE_ACCEL .type = SENSOR_TYPE_ACCEL, //这个值要在内核目录下include/linux/sensor-dev.h中定义
Linux中默认权限 umask 查看默认权限 0022 第一位0表示文件特殊权限 022表示文件默认权限 文件权限 默认的权限就是文件创建后就拥有的权限 文件默认不能建立可执行文件,必须手工赋予执行权限
rpm –qa #查询已安装的 rpm 列表 rpm -q 软件包名 #查看是否已经安装 rpm -qi 软件包名 #查看软件包信息 rpm -ql 软件包名 #查看软件包中的文件安装位置...类型python中的pip 五.yum基本命令 yum list|grep xx #查询yum服务器上是否有需要安装的包 yum install xxx #下载安装 yum uninstall xxx
领取专属 10元无门槛券
手把手带您无忧上云