中断处理

异常、中断、陷阱

。_饼干妹妹 提交于 2020-01-04 14:29:13
int 3 指令是常见的 断点中断,研究这个的时候发现个系统的一些机制有关。就研究了一下中断的分类,还有异常和陷阱。下面是我百度之后的一些总结: 中断的分类:外中断和内中断 根据系统对中断处理的需要,操作系统一般对中断进行分类并对不同的中断赋予不同的处理优先级,以便在不同的中断同时发生时,按轻重缓急进行处理。 根据中断源产生的条件,可把中断分为外中断和内中断。 外中断是指来自处理器和内存外部的中断,包括I/0设备发出的I/O中断、外部信号中断(例如用户键人ESC键)。各种定时器引起的时钟中断以及调试程序中设置的断点等引起的调试中断等。外中断在狭义上一般被称为中断。 内中断主要指在处理器和内存内部产生的中断。内中断一般称为陷阱(trap)或异常。它包括程序运算引起的各种错误,如地址非法、校验错、页面失效、存取访问控制错、算术操作溢出、数据格式非法、除数为零、非法指令、用户程序执行特权指令、分时系统中的时间片中断以及从用户态到核心态的切换等都是陷阱的例子。 为了按中断源的轻重缓急处理响应中断,操作系统为不同的中断赋予不同的优先级。各中断源的优先级在系统设计时给定,在系统运行时是固定的。而处理器的优先级则根据执行情况由系统程序动态设定。 除了在优先级的设置方面有区别之外, 中断和陷阱还有如下主要区别: 1、陷阱通常由处理器正在执行的现行指令引起,而中断则是由与现行指令无关的中断源引起的

中断机制和中断描述符表、中断和异常的处理

匆匆过客 提交于 2020-01-04 14:28:50
注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了更好地理清系统编程和网络编程中的一些概念性问题,并没有深入地阅读分析源码,我也是草草翻过这本书,请有兴趣的朋友自己参考相关资料。此书出版较早,分析的版本为2.4.16,故出现的一些概念可能跟最新版本内核不同。 此书已经开源,阅读地址 http://www.kerneltravel.net 1、中断向量 Intel x86 系列微机共支持256 种向量中断,为使处理器较容易地识别每种中断源,将 它们从0~255 编号,即赋予一个中断类型码 n ,Intel 把这个8 位的无符号整数叫做一个向 量,因此,也叫中断向量。所有256 种中断可分为两大类: 异常和中断 。 异常又分为故障(Fault)、 陷阱(Trap)和 夭折(Abort) ,它们的共同特点是既不使用中断控制器,又不能被屏蔽。中断又分为外部可 屏蔽中断(INTR)和外部非屏蔽中断(NMI),所有I/O 设备产生的中断请求(IRQ)均引起屏 蔽中断,而紧急的事件(如硬件故障)引起的故障产生非屏蔽中断。 非屏蔽中断的向量和异常的向量是固定的,而屏蔽中断的向量可以通过对中断控制器的 编程来改变。Linux 对256 个向量的分配如下。 • 从0~31

ucore-lab1-练习6report

孤街浪徒 提交于 2020-01-04 14:28:27
                  练习6--完善中断初始化和处理 1. 中断向量表中一个表项占多少个字节?其中哪几位代表中断处理代码的入口? 答:系统将所有的中断事件统一进行编号( 0 ~ 255 ),这个编号称为中断向量。中断向量表的一个表项占 8 个字节,其结构如下:   0 ~ 15 位:偏移地址的 0 ~ 15 位 ;   16 ~ 31 位:段选择子 ;   32 ~ 47 位:属性信息(包括 DPL 等) ;   48 ~ 63 位:偏移地址的 16 ~ 31 位。 其中第 16~32位是段选择子,用于索引全局描述符表GDT来获取中断处理代码对应的 段地址,再加上第 0~15、48~63位构成的偏移地址,即可得到中断处理代码的入口。 2. 请编程完善 kern/trap/trap.c中对中断向量表进行初始化的函数idt_init。在idt_init函数中,依次对所有中断入口进行初始化。使用mmu.h中的SETGATE宏,填充idt数组内容。每个中断的入口由tools/vectors.c生成,使用trap.c中声明的vectors数组即可。 答:分析如下,   1) Ucore 启动后,通过 idt_init 函数初始化 IDT 表, IDT 表的每个元素均为門描述符,记录一个中断向量对应的中断处理函数的段选择子、偏移量和属性(门类型、 DPL 等),所以初始化 IDT

《实时控制软件设计》第一周作业

拜拜、爱过 提交于 2020-01-04 12:58:53
第一周,老师讲了实时控制系统的历史和实现方法,在做案例分析前我想先通过听课和网上的资料总结一下实时控制系统的特点: “实时系统是能够在确定的时间内执行计算或处理事务并对外部事件作出响应的计算机系统“,正好最近在学微机原理,也正好上到了中断程序那一章,咦我就在想,好像用中断程序也可以 “执行计算或处理事务并对外部事件作出响应” 不过马上又反应过来,好像在执行中断程序的时候不能响应别的中断,如果想要响应的话还要在中断服务里面再加一个中断,突然发现稍微复杂一点的控制,中断就不够用了;而且更重要的是响应的时间慢,对于那种要求很快速响应的外部事件(我记得看过一部关于某可乐公司易拉罐的生产线上面,最后踢除不合格产品的时候,就是在输送线上加一个传感器和机械手,检测到不合格的产品,机械臂立马把它“弹”出去,那输送线的速度真是飞快,要从检测到机械臂做出动作最多只能有很短的反应时间)可能就无能为力了。我就大概明白实时控制系统为什么主要用在工业控制中了。 上图是RT-Linux系统的结构,Linux运行在实时核心下,实时内核直接管理硬件中断,如果中断是实时中断,那么就直接执行实时操作,几乎没有延时,实时操作完了再运行Linux进程 “具体地说就是当有实时任务要完成时,实时操作系统运行实时内核下的任务;当没有实时任务时,实时内核调度 Linux运行。所以Linux是实时内核中优先级最低的一个任务。”

HardFault_Handler问题

删除回忆录丶 提交于 2020-01-02 18:08:28
1、问题描述:mio板M2口连接雷达(即can口有数据时),程序跑到can中断使能代码时,程序跳转到“HardFault_Handler”,见下图: 代码跑到此处 解决历程: 1、修改堆栈 先是网上搜索此问题,大致两个解决方法: A、内存溢出或者访问越界 B、堆栈溢出 此代码在第一版mio上工作正常,排除A的可能性;怀疑不小心修改了配置,改变了堆栈大小。 于是,去修改堆栈的大小。可,无论怎么增加size,都还是一样的错误。 2、查看map文件 修改堆栈大小不起作用时,感觉好疑惑,怎么会这样?后与同事沟通,建议看看map文件,会不会can中断服务程序没有被编译? 在map文件里,找到定时器和串口中断服务函数,的的确确没有can中断服务函数。 3、can中断配置 这个时候,有点不理解,MY_NVIC_Init(1,0,USB_LP_CAN1_RX0_IRQn,2);对应配置了中断抢占优先级、响应优先级、中断编号和中断分组,并没有注册中断函数,那么中断函数是怎么关联的呢? 网上搜索:若要调用相关的中断功能,在NVIC中配置相关的中断优先级和中断号, STM32内部会根据配置的中断号在启动文件中寻找相应的中断函数的相应的入口函数。 另外:ST公司在提供的启动文件startup_stm32fXXX.s中都对相应的中断号对应的中断处理函数的入口都已经规定好了

5.信号的接收与处理

我是研究僧i 提交于 2020-01-01 00:26:47
一.基本的概念 1.中断 终止或者暂停当前正在执行的进程,转而去执行其他的任务。 硬中断:来自硬件设备的中断 软中断:来自其他程序的中断 2.信号 信号是一种软中断 ,可以把他看作是进程与进程,内核与进程通信的一种方式,它为程序的异步执行提供了技术支持。 3.常见的信号 SIGINI(2) 终端中断ctrl+c SIGQUIE(3) 终端退出信号ctrl+/ SIGABRT(6) 调用abort函数产生的信号 SIGFPE(8) 算术信号 SIGKILL(9) 死亡信号 SIGSEGV(11) 段错误信号 SIGALRM(14) 闹钟信号 SIGCHLD(17) 子进程结束信号 SIGCONT(18) 进程继续信号 SIGSTOP(19) 进程结束信号 SIGTSTP(20) 终端停止 4.不可靠信号(非实时) 1.编号小于SIGRGMI(34)的信号都是不可靠的,这些信号是建立在早期的信号机制上的,一个时间的发送可能会产生多次信号。 2. 不可靠信号不支持排队 ,因此在接收信号的时候可能会丢失, 如果一个信号发送个一个进程多次,它可能只接收到一次,其他的可能就丢失了 。 3.进程在处理这种信号的时候,哪怕进行设置了信号处理函数,当信号处理函数完毕后,会再次恢复成默认的信号处理函数。 5.可靠信号(实时) 1.位于[SIGRGMI(34),SIGRGMI(64)]区间的都是可靠信号

Linux 进程间通信系列之 信号

雨燕双飞 提交于 2020-01-01 00:22:04
信号(Signal) 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持Unix早期信号 语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又 能够统一对外接口,用sigaction函数重新实现了signal函数) 信号种类 每种信号类型都有对应的信号处理程序(也叫信号的操作),就好像每个中断都有一个中断服务例程一样。大多数信号的默认操作是结束接收信号的进程;然而,一个进程通常可以请求系统采取某些代替的操作,各种代替操作是: 忽略信号。随着这一选项的设置,进程将忽略信号的出现。有两个信号 不可以被忽略:SIGKILL,它将结束进程;SIGSTOP,它是作业控制机制的一部分,将挂起作业的执行。 恢复信号的默认操作。 执行一个预先安排的信号处理函数。进程可以登记特殊的信号处理函数。当进程收到信号时,信号处理函数将像中断服务例程一样被调用,当从该信号处理函数返回时,控制被返回给主程序,并且继续正常执行。 但是,信号和中断有所不同。中断的响应和处理都发生在内核空间,而信号的响应发生在内核空间,信号处理程序的执行却发生在用户空间。 那么,什么时候检测和响应信号呢?通常发生在两种情况下: 当前进程由于系统调用

信号中断与异步信号中断安全编程

故事扮演 提交于 2020-01-01 00:21:50
1、什么是中断? 1.1、什么是中断 外围设备的速度远低于CPU的速度,所以为提高CPU计算效率,现代计算机变内核主动为硬件主动,只在硬件需要的时候才发送信号,通知内核来处理数据。这样外围设备与内核的协作方式即为中断机制。而设备发送的信号即为中断,其本质为一种特殊的电信号。 硬中断处理流程: 1、各外围设备与中断管理器各输入引脚相连; 2、中断管理器与CPU之间只存在一条中断管线; 3、设备发送一个中断到中断管理器; 4、中断管理器发送对应电信号给CPU。 5、CPU中断当前工作,开始处理中断,并通知操作系统。 6、操作系统调用中断处理程序。 中断的特点: 1、不同的设备对应不同的中断,并被用数字标识; 2、对应的设备需要对应的中断处理程序; 3、中断值即中断请求线(IRQ),被关联到不同的数值量,如IRQ 0,中断亦可动态分配。 4、设备中断信号可能在任意时刻到来,不与CPU时钟同步,即异步硬件中断。 糕富帅CPU来到女儿国,女儿国的妹子们(中断集合)精心打扮,总在认为打扮完美的时刻向糕富帅抛媚眼露大腿扮性感,引起糕富帅的注意。糕富帅玩弄妹子的手段高超,经验丰富,与最靓的妹纸牵手,喜欢为不同的妹子编号并制定不同的攻略策略,总是上半场激烈,下半场缠绵,中场偷腥不断,并在腻味之后回归原始的浪荡生活。妹纸们总是很傻很天真,屡败屡战,不停地打扮自己,完美自己,期待着与糕富帅的重新开始。

深入研究 Java Synchronize 和 Lock 的区别与用法

老子叫甜甜 提交于 2019-12-31 20:12:00
在分布式开发中,锁是线程控制的重要途径。Java为此也提供了2种锁机制,synchronized和lock。做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方。 我们先从最简单的入手,逐步分析这2种的区别。 一、synchronized和lock的用法区别 synchronized:在需要同步的对象中加入此控制,synchronized可以加在方法上,也可以加在特定代码块中,括号中表示需要锁的对象。 lock:需要显示指定起始位置和终止位置。一般使用ReentrantLock类做为锁,多个线程中必须要使用一个ReentrantLock类做为对象才能保证锁的生效。且在加锁和解锁处需要通过lock()和unlock()显示指出。所以一般会在finally块中写unlock()以防死锁。 用法区别比较简单,这里不赘述了,如果不懂的可以看看Java基本语法。 二、synchronized和lock性能区别 synchronized是托管给JVM执行的,而lock是java写的控制锁的代码。在Java1.5中,synchronize是性能低效的。因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高一些。但是到了Java1.6,发生了变化

接口与总线 考点整理

删除回忆录丶 提交于 2019-12-29 23:11:06
说明 以下内容为个人整理,答案也是个人回答,不一定对,所以你对答案有任何问题,都欢迎与我讨论。 Q01:51单片机P0、P1、P2、P3口功能作用? 答: P0可做地址口的低8位也可以做数据口和I/O口 P1可做普通的I/O口 P2除了做I/O口,也是作为地址口的高8位(总共16位) P3 既可以是普通IO口,也可以是外部中断、定时、外部输入的端口 Q02:当串口发送一个数据或接收数据时,哪两个位会置位? 答: 接收数据时,RI 会置位 发送数据时,TI 会置位 Q03:81单片机的累加器是什么? 答: ACC Q04:当晶振频率为12MHz,定时器的频率为多少? 答: 频率为1Mhz 说明: 机器频率 = 晶振频率/12 Q05:LED的显示分为几种? 答: 两种,动态扫描和静态扫描 说明: 动态扫描中LED的调度是放在定时器中 Q06:51单片机内存划分 答: 低128个字节 从00H~1FH(32字节):寄存器区,四组寄存器区,一组有8个寄存器 从20H~2FH(16字节 128位):位寻址区 剩下:普通内存 高128个字节 特殊功能寄存器 Q07:ex0、ex1、et0的含义 答: ex0 = 1; //允许外部中断0 ex1 = 1; //允许外部中断1 et0 = 1; //允许定时器0中断 1 2 3 说明: 在这里插入图片描述 上图为IE(中断允许寄存器) EA