中断处理 - 上半部(硬中断) 由于 APIC中断控制器 有点小复杂,所以本文主要通过 8259A中断控制器 来介绍Linux对中断的处理过程。...handler: 类型为 hw_interrupt_type 结构,表示IRQ线对应的硬件相关处理函数,比如 8259A中断控制器 接收到一个中断信号时,需要发送一个确认信号才会继续接收中断信号的,发送确认信号的函数就是...action: 类型为 irqaction 结构,中断信号的处理入口。由于一条IRQ线可以被多个硬件共享,所以 action 是一个链表,每个 action 代表一个硬件的中断处理入口。...处理中断请求 当一个中断发生时,中断控制层会发送信号给CPU,CPU收到信号会中断当前的执行,转而执行中断处理过程。...这里要注意的是,如果中断处理过程能够开启中断的,那么就把中断打开(因为CPU接收到中断信号时会关闭中断)。
[toc] 如何设置IDT IDT 中断描述符表定义 中断描述符表简单来说说是定义了发生中断/异常时,CPU按这张表中定义的行为来处理对应的中断/异常。...中断描述符项定义 当中断发生,cpu获取到中断向量后,查找IDT中断描述符表得到相应的中断描述符,再根据中断描述符记录的信息来作权限判断,运行级别转换,最终调用相应的中断处理程序; 这里涉及到Linux...pre-cpu的中断栈,还是使用IST的中断栈; type表示所中断是何种类型,目前有以下四种: enum { GATE_INTERRUPT = 0xE, //中断门 GATE_TRAP...传统系统调用相关 IDT 的设置 Linux系统启动过程中内核压解后最终都调用到start_kernel, 在这里会调用trap_init, 然后又会调用idt_setup_traps: void...硬件中断相关IDT的初始化也是在Linux启动时完成,在start_kernel中通过调用init_IRQ完成,我们来看一下: void __init init_IRQ(void) { int
大家好,我是道哥,今天我为大伙儿解说的技术知识点是:【中断程序如何发送信号给应用层】。 最近分享的几篇文章都比较基础,关于字符类设备的驱动程序,以及中断处理程序。...今天这篇文章,主要还是以代码实例为主,把之前的两个知识点结合起来: 在中断处理函数中,发送信号给应用层,以此来通知应用层处理响应的中断业务。...> #include #include #include // 中断号...request_irq(IRQ_NUM, myirq_handler, IRQF_SHARED, MYDEV_NAME, &mydev); ... } 在中断处理函数中,目标是发送信号 SIGUSR1...根据之前的文章Linux驱动实践:驱动程序如何发送【信号】给应用程序?,应用程序必须主动把自己的 PID 告诉驱动模块才可以。
用户按下Ctrl-C ,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程 前台进程因为收到信号,进而引起进程退出 #include #include <unistd.h...)的 1.3 信号概念 信号是进程之间事件异步通知的一种方式,属于软中断 用kill -l命令可以察看系统定义的信号列表 每个信号都有一个编号和一个宏定义名称,这些宏定义可以在signal.h中找到,...Linux是这样实现的:常规信号在递达之前产生多次只计一次,而实时信号在递达之前产生多次可以依次放在一个队列里 3.3 sigset_t 从上图来看,每个信号只有一个bit的未决标志,非0即1,不记录该信号产生了多少次...当前正在执行main函数,这时发生中断或异常切换到内核态。在中断处理完毕后要返回用户态的main函数之前检查到有信号SIGQUIT递达。...此方法对于Linux可用,但不保证在其它UNIX系统上都可用 测试代码 #include #include #include #include
今日更新了Linux信号的内容 欢迎大家关注点赞收藏⭐️留言 信号和信号量 二者之间没有任何关系。 信号 通过 kill -l 可以查看所有信号 其中,1-31号信号是普通信号。...这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明: man 7 signal 基本结论: 信号:Linux系统提供的一种,向指定进程发送特定事件的方式。...sigset_t就是Linux给用户提供的一个用户级的数据类型,禁止用户直接修改位图。...由于信号处理函数的代码是在用户空间的,处理过程比较复杂,举例如下: 用户程序注册了SIGQUIT信号的处理函数sighandler。 当前正在执行 main函数,这时发生中断或异常切换到内核态。...在中断处理完毕后要返回用户态的main函数之前检查到有信号 SIGQUIT递达。
这样做的目的是,假如在注册信号捕捉函数之前子进程就已经结束的话,信号捕捉函数就什么也捕捉不到了,会产生僵尸进程; 3. 中断系统调用 系统调用可分为两类:慢速系统调用和其他系统调用。...如果在阻塞期间收到一个信号,该系统调用就被中断,不再继续执行(早期),也可以设定系统调用是否重启。比如,read、write、pause、wait等。...其他系统调用:getpid、getppid、fork等 通过pause系统调用,分析慢速系统调用,慢速系统调用被中断的相关行为,实际上就是pause的行为,比 如read 慢速系统调用被中断的相关行为...,实际上就是pause的行为,比 如read 想中断pause,首先信号不能被屏蔽; 信号的处理方式必须是捕捉 (默认动作、忽略都不可以); 中断后返回-1, 设置errno为EINTR,表示被信号中断...; 可以通过修改sa_flags参数来设置被信号中断后系统调用是否重启:SA_INTERRURT不重启, SA_RESTART重启。
---- 前言 信号从产生到执行,并不会被立即处理,这就意味着需要一种 “方式” 记录信号是否产生,对于 31 个普通信号来说,一个 int 整型就足以表示所有普通信号的产生信息了;信号还有可能被 “阻塞...的相关概念 1.1、概念 信号 传递过程:信号产生 -> 信号未决 -> 信号递达 信号产生(Produce):由四种不同的方式发出信号 信号未决(Pending):信号从 产生 到 执行 的中间状态...信号递达(Delivery):进程收到信号后,对信号的处理动作 在这三种过程之前,均有可能出现 信号阻塞 的情况 信号阻塞(Block):使信号传递 “停滞”,无论是否产生,都无法进行处理 信号递达后的三种处理方式...,本文探讨的是 信号保存阶段,即 物流信息 1.3、在内核中的表示 对于传递中的信号来说,需要存在三种状态表达: 信号是否阻塞 信号是否未决 信号递达时的执行动作 在内核中,每个进程都需要维护这三张与信号状态有关的表...---- 总结 以上就是本次关于 Linux进程信号【信号保存】的全部内容了,在本文中,我们首先再一次对信号有了较深的理解,知道了在内核中存在三张表记录信号的处理流程,然后我们学习了信号集的操作函数,
---- 前言 在 Linux 中,进程具有独立性,进程在运行后可能 “放飞自我”,这是不利于管理的,于是需要一种约定俗成的方式来控制进程的运行,这就是 进程信号,本文将会从什么是进程信号开篇,讲述各种进程信号的产生方式及作用...可以通过 man 7 signal 进行查询 man 7 signal 简单总结一下,1~31 号信号对应的功能如下(表格内容引用自 2021dragon Linux中的31个普通信号) 信号编号 信号名...捕获键盘 “按下” 信号的操作称为 硬件中断 CPU 中有很多的针脚,不同的硬件对应着不同的针脚,每一个针脚都有自己的编号,硬件与针脚一对一相连,并通过 中断控制器(比如 8259)进行控制,当我们按下键盘后...中断控制器首先给 CPU 发送信息,包括键盘对应的针脚号 然后 CPU 将获取到的针脚号(中断号)写入 寄存器 中 最后根据 寄存器 里的 中断号,去 中断向量表 中查表,找到对应硬件的方法,执行它的读取方法就行了...同样是 先检测到信号,然后再去执行相应的动作,不过此时发送的是 中断信号,执行的是 调用相应方法罢了 信号 与 动作 的设计方式很实用,操作系统只需要关注是否有信号发出,发出后去中断向量表中调用相应的方法即可
signal 信号是 UNIX 系统最先开始使用的进程间通信机制,因为 Linux 是继承于 UNIX 的,所以 Linux 也支持信号机制,通过向一个或多个进程发送 异步事件信号 来实现,信号可以从键盘或者访问不存在的位置等地方产生...操作系统会中断目标程序的进程来向其发送信号、在任何非原子指令中,执行都可以中断,如果进程已经注册了信号处理程序,那么就执行进程,如果没有注册,将采用默认处理的方式。...SIGBUS SIGBUS 将造成 总线中断 错误时发送给进程 SIGCHLD 当子进程终止、被中断或者被中断恢复,将 SIGCHLD 发送给进程。...SIGILL SIGILL 信号在尝试执行非法、格式错误、未知或者特权指令时发出 SIGINT 当用户希望中断进程时,操作系统会向进程发送 SIGINT 信号。...用户输入 ctrl - c 就是希望中断进程。 SIGKILL SIGKILL 信号发送到进程以使其马上进行终止。
,运行相应的进程 系统调用结束后 异常、中断、陷阱等处理完毕 信号的处理时机就是 内核态 切换为 用户态,也就是 当把更重要的事做完后,进程才会在操作系统的指导下,对信号进行检测、处理 下面来结合 进程地址空间...与真实的地址空间建立映射关系 每个进程都有自己的 进程地址空间,不同 进程地址空间 中地址可能冲突,但实际上地址是独立的 进程地址空间 可以让进程以统一的视角看待自己的代码和数据 关于 进程地址空间 的相关知识详见 《Linux...操作系统的本质 - 操作系统也是软件啊,并且是一个死循环式等待指令的软件 - 存在一个硬件:操作系统时钟硬件,每隔一段时间向操作系统发送时钟中断 进程被调度,就意味着它的时间片到了,操作系统会通过时钟中断...处理 过程 图片来源:Linux进程信号 ---- 3、信号的捕捉 接下来谈谈 信号 是如何被 捕捉 的 3.1、内核如何实现信号的捕捉?...表,信号在产生之后,存储在 pending 表中 信号处理阶段:信号在 内核态 切换回 用户态 时,才会被处理 ---- 总结 以上就是本次关于 Linux进程信号【信号处理】的全部内容了,本文对信号的处理时机做了探讨
一.信号基础 生活中 在生活中也有诸多信号,这些信号通常不是由我们发起的,而是我们接收以后对对应的信号做处理;最常见的莫过于红绿灯了,当红绿灯发出信号时(红灯,绿灯,黄灯);我们会有对应的行为,比如绿灯我们知道当前可以行走...对信号产生以后我们知道该做什么,这是因为我们曾经接受了对于这些信号的教育,知道当这些信号产生以后我们需要做什么。...使用kill -l可以查看全部的信号 其中1-31为普通信号,34-64被称为实时信号 进程PCB中有一个位图结构用于标明该进程是否收到信号(32个比特位使用0/1来区分是否收到信号,0代表没收到...进程对于信号的处理有三种:1.默认,2.忽略,3.自定义; 但并不是进程一收到信号就马上处理,因为信号是随时产生的(异步),可能当信号来临时进程正在处理着更重要的事情,进程对信号的处理会在合适的时机(内核态返回用户态时...,如果该信号一直处于未递达的状态,那么即使后续发送了该信号也无法收到 五.信号的处理 因为信号保存在PCB中,但PCB中的数据只有操作系统有权限访问,因此要对信号做处理必须要通过操作系统来实现。
最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着”重要的事马上做, 不重要的事推后做”的异步处理思想....将中断号压入栈中; (不同中断号的中断对应不同的中断服务程序入口) 2....中断处理的这几个阶段中不能调用可能导致睡眠的函数(包括分配内存); 对于第一个问题, 较新的linux内核增加了ksoftirqd内核线程, 如果持续处理的softirq超过一定数量, 则结束中断处理过程...据说在montavista(一种嵌入式实时linux)中, 将内核的中断机制做了修改. (某些中断的)中断处理过程被赋予了task结构, 能够被内核调度. 解决了上述两个问题....工作队列 linux基线版本的内核在解决上述问题上, 提供了workqueue机制.
signal() varies across Unix versions, and has also varied historically across different versions of Linux...注册一个信号捕捉函数,该函数由ANSI定义,由于历史原因在不同版本的Unix和不同版本的Linux中可能有不同的行为。因此应该尽量避免使用它,取而代之使用sigaction函数。...当注册了某个信号捕捉函数,在捕捉到该信号以后,就要调用该信号捕捉函数,而该函数有可能执行很长时间,在这期间所要屏蔽的信号不由M来指定,而是用sa_mask(临时屏蔽信号集)来指定,等到调用完信号处理函数...实际上是这样的,未决信号集中使用某一位的0和1来记录信号是否被处理的,所以不管这个信号被发送了几次,未决信号集对应位也只能有一个1,后续也只能处理一次,它不会记录信号屏蔽期间总共发送了几次该信号,解除屏蔽后只会处理一次...执行完信号处理函数后通过系统调用sigreturn再次陷入内核,然后返回用户态从被中断的地方继续执行主控制逻辑。
此时我们运行程序,我们可以输入指令,bash 可以接收我们的指令,也就是说我们还能正常使用 bash 命令行,但是此时我们使用 ctrl + c 就杀不掉该进程了,这种进程我们称为后台进程,如下图: 在Linux...认识信号 实际上,ctrl + c 本质上是被进程解释成为收到了 2号 信号,然后进程就被中断了。...我们可以查看Linux中的信号列表,指令为: kill -l 其中我们发现,0号、32号和33号信号是没有的。...所以每一种中断都有一个中断号的概念,类似于数字,我们下面假设键盘的中断号为iptnum;其实就是给 CPU 的引脚发送高低电平,由CPU来解释这个中断号是几,所以CPU就得记录下来对应外设的中断号;而在操作系统内...所以当CPU 收到了键盘的中断号,操作系统就立马识别到CPU收到了中断号,所以操作系统会立马以中断号为索引,去中断向量表中找对应的方法,然后执行该方法,然而这个方法就是将数据从外设中拷贝到内存级缓冲区的方法
这些信号都有一些共同点:一是简单;而是不能携带大量信息;三是满足某个特设条件才发送。 信号是信息的载体,是Linux/UNIX 环境下,古老而经典的通信方式, 现在依然是主要的通信手段。...信号的实现机制 进程A给B发送信号,B收到信号之前执行自己的代码,收到信号后,不管执行到程序的什么位置,都要暂停运行,去处理信号,处理完毕再继续执行。与硬件中断类似——异步模式。...但信号是软件层面上实现的中断,早期常被称为“软中断”。信号具有这样的特质,由于信号是通过软件方法实现,其实现手段导致信号有很强的延时性,但是对于用户来说,这个延迟时间非常短,不易察觉。...因此有些信号出现在Unix系统内,也出现在Linux中,而有的信号出现在FreeBSD或 Mac OS 中却没有出现在Linux下。这里我们只研究Linux系统中的信号。...二、信号的产生 1. 终端按键产生信号 Ctrl+c :2号信号SIGINT,表示终止/中断。
Linux进程基础一文中已经提到,Linux以进程为单位来执行程序。我们可以将计算机看作一个大楼,内核(kernel)是大楼的管理员,进程是大楼的房客。...从信号的生成到信号的传递的时间,信号处于等待(pending)状态(纸条还没有被查看)。...常见信号 信号所传递的每一个整数都被赋予了特殊的意义,并有一个信号名对应该整数。常见的信号有SIGINT, SIGQUIT, SIGCONT, SIGTSTP, SIGALRM等。这些都是信号的名字。...上面几个信号中, SIGINT 当键盘按下CTRL+C从shell中发出信号,信号被传递给shell中前台运行的进程,对应该信号的默认操作是中断 (INTERRUPT) 该进程。...特别是获取信号的情况,程序往往会设置一些比较长而复杂的操作(通常将这些操作放到一个函数中)。 信号常常被用于系统管理,所以它的内容相当庞杂。深入了解信号,需要一定的Linux环境编程知识。
自己写的程序启动时偶尔会被SIGABRT信号杀死。故查看下SIGABRT的用法。 SIGABRT是中止一个程序,它可以被捕捉,但不能被阻塞。...当程序调用abort(3)时,该进程会向自己发送SIGABRT信号。所以,SIGABRT一般用于信号中一些关键的处理,assert失败时也会使用它。...你不应该去捕捉SIGSEGV和SIGABRT信号,如果收到这种信号,说明进程处于一个不确定的状态,很可能会直接挂起。 发现程序中确实有assert失败报错。...但是是哪个进程发送的SIGABRT信号暂时还不知道。
什么是信号 信号本质上是在软件层次上对中断机制的一种模拟,其主要有以下几种来源: 程序错误:除零,非法内存访问等。...外部信号:终端 Ctrl-C 产生 SGINT 信号,定时器到期产生SIGALRM等。 显式请求:kill函数允许进程发送任何信号给其他进程或进程组。 目前 Linux 支持64种信号。...信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux 的信号值为 1-31 和 34-64。 信号是异步的,一个进程不必通过任何操作来等待信号的到达。...信号实现原理 接下来我们分析一下Linux对信号处理机制的实现原理。...signal_wake_up() 函数会把进程的 sigpending 成员变量设置为1,表示有信号需要处理,如果进程是睡眠可中断状态还会唤醒进程。
---- 二、进程信号 通过生活信号联系到进程信号 信号是给进程发的,比如我们之前使用过的指令:kill -9 pid 而进程又是如何识别信号的?...保存是否收到了指定的信号,信号:用比特位的位置代表信号的编号,比特位的内容代表是否收到该信号,0表示没有,1表示有 如何理解信号的发送?发送信号的本质就是修改PCB中的信号位图。...,对于2号和3号信号处理动作默认为终止进程 2.系统调用 除了键盘向前台进程发送信号之外,前台进程会影响shell,linux规定跟shell交互的时候只允许有一个前台进程,默认情况下bash也是一个进程...所以系统调用的前半段是在用户态跑的,OS是如何通过系统调用把用户态变成内核态的:中断汇编指令int 80就是陷入内核,简单理解把状态由用户态改成内核态。...比如典型的insert函数就是不可重入函数: main函数调用insert,向链表head插入Node1,insert只做了第一步,然后就被中断(或者因为信号原因执行信号捕捉),此时进程挂起,然后唤醒在次回到用户态检查有信号待处理
很多人经常把它们搞混,这篇文章会让你了解 Linux 的信号机制,以及一些常见信号的作用。 什么是信号 信号(Signal)是 Linux 进程收到的一个通知。...当进程收到一个信号时,该进程会中断其执行,并执行收到信号对应的处理程序。 信号机制作为 Linux 进程间通信的一种方法。Linux 进程间通信常用的方法还有管道、消息、共享内存等。...信号和中断 信号处理是一种典型的异步事件处理方式:进程需要提前向内核注册信号处理函数,当某个信号到来时,内核会就执行相应的信号处理函数。 我们知道,硬件中断也是一种内核的异步事件处理方式。...中断处理程序是由 BIOS 和操作系统在系统启动过程中预先注册在内核中的。 中断和信号通知都是在内核产生。中断是完全在内核里完成处理,而信号的处理则是在用户态完成的。...可以看出,中断和信号的严重程度不一样。信号影响的是一个进程,信号处理出了问题,最多是这个进程被干掉。而中断影响的是整个系统,一旦中断处理程序出了问题,可能整个系统都会挂掉。
领取专属 10元无门槛券
手把手带您无忧上云