中断处理

操作系统第五章

北战南征 提交于 2019-12-02 06:51:05
输入输出设备分为块设备(硬盘)和字符设备(鼠标,键盘) 硬盘的输入输出以磁盘块(扇区)为单位 鼠标键盘以字符为单位,通过中断机制输入 ----------------------------------------------------------------------------------------------------------------------------------------------- IO设备由 机械部件和电子部件 两部分组成,电子部件就是电路板,也就是IO控制器。IO控制器作为CPU控制IO设备机械部件的中介。它含有控制寄存器(存放CPU命令的参数),状态寄存器(设备是否能进行读写操作),数据寄存器(数据中转站)。由于IO控制器中含有多个寄存器,当CPU发出命令后,IO控制器要进行地址转换(由IO控制器的IO逻辑部分完成),找到对应的寄存器。 IO控制器由三部分组成,分别为 CPU与控制器的接口,IO逻辑,以及控制器与设备的接口 CPU与控制器的接口: 数据寄存器,状态寄存器,控制寄存器位于这里 IO逻辑: CPU 通过控制线告诉IO逻辑指令类型,通过地址线告诉IO逻辑要操作的设备地址,IO逻辑通过访问控制寄存器和状态寄存器得出指令。如果是输出指令的话,IO逻辑将数据寄存器中的数据 转移到 控制器与设备的接口。 控制器与设备的接口:输出命令的话

现代操作系统 第五章 输入/输出 习题

时间秒杀一切 提交于 2019-12-02 06:49:46
Chapter05 第五章 输入/输出 习题 知识点小记 I/O设备可分为: 块设备 和 字符设备 块设备 :把信息存储在固定大小的块种妹妹个快有自己的地址。基本特征是每个块都能独立于其他块而读写。如硬盘、蓝光光盘和USB盘。 字符设备 :以字符为单位发送或接受一个字符流,而不考虑任何块结构。字符设备是不可存值得,也没有任何寻道操作。如打印机、网络接口、鼠标???,以及大多属与磁盘不用的设备都可看做字符设备。 I/O设备一般有 机械部件 和 电子部件 两部分组成。 电子部件 称作设备控制器或适配器。常以主板上的芯片的形式出现,或者以插入扩展槽中的印刷电路板的形式出现。 机械部件 是设备本身。 控制器的任务是把串行的位流转换为字节块,并进行必要的错误矫正工作。 CPU有两种方法与设备的控制寄存器和数据缓冲区进行通信。 第一种方法 : I/O端口号 每个控制寄存器被分配一个I/O端口号(8位或16位),所有I/O端口形成I/O端口空间,并且受到保护似的普通的用户程序不能对其进行访问,只有操作系统可以访问。 使用特殊的I/O指令 IN REG, PORT ,CPU可以读取控制寄存器PORT的内容并将结果存入到CPU寄存器REG中。类似地,使用 OUT PORT, REG ,CPU可以将REG的内容写入到控制寄存器中。 这种方案中,内存地址空间和I/O地址空间是不同的。 第二种方法 :

8086汇编 中断处理机制

时光总嘲笑我的痴心妄想 提交于 2019-12-02 03:16:35
我们在8086编程时,当一个CPU内部中断或者外部中断来了,该去执行什么样的中断处理程序呢?因为我们知道CPU就是个小傻瓜,只能机械的跟着CS,IP走,所以一切的一切,包括中断机制都是我们编程人员编出来的。 下面我们看这个中断指令:int 0; 这是一个masm风格汇编的调用中断指令,中断类型代码为0,意思是说我们要调用一个中断类型代码为0的中断,然后让CPU去处理这个中断类型代码相对应的中断处理程序,处理完中断后返回。 这条指令看起来也太智能了吧,仅仅一条指令就能干那么多事情,其实,这么理解完全错了,我们要了解一个道理,对于每一个汇编指令,就如int 0这个指令,虽然仅仅一句话,但是当汇编成机械语言时,可不仅仅就一句话了,只不过汇编器帮我们做了很多事,对于这条指令,汇编器碰到这条指令会产生如下代码: 这里又得说一个中断向量表的概念: 我们一般约定俗成的在内存0X000处建立一个中断向量表,这个中断向量表每4个字节的储存一个中断类型的中断处理程序地址。就是这么个意思: 从内存地址0开始,前两个字节存放与中断类型代码0相应的中断处理程序地址的ip偏移地址,然后后两个字节存放中断处理程序地址CS段地址,其后依次是中断类型1,2,.....的中断中断处理程序地址。 这样,我们就可以通过中断类型代码,中断向量表找到此中断类型的处理程序了。 至于中断处理程序,一般是这样的一个流程:

AVR_Interrupt

我是研究僧i 提交于 2019-12-02 03:01:36
https://blog.csdn.net/dandri/article/details/54799300 #AVR中断系统与基本应用(ATMega16)##一、中断的基本概念###1.1中断的基本概念 中断是指计算机自动响应的一个中断请求信号,暂时停止(中断)当前程序的执行,转而执行为外部设备服务 的型号(中断服务程序),并在执行完服务程序后自动返回原程序的过程。具有的优势实现实时处理实现分时操作,提高MCU的处理效率进行故障处理待机状态的唤醒###1.2中断的处理过程 由于MCU处理完中断之后需要返回原程序,因此,要在执行中断之前,要将主程序中断处的地址,即断点处(实际上是程序计数器PC的当前地址值——即即将执行的主程序的下一条指令,即图中的k + 1处)保护起来,称为保护断点除了保护断点,在程序执行之前,还要把有关的数据保护起来,称为中断现场保护,方便在返回主程序的时候继续执行,这一过程称为恢复现场和恢复断点简单说,在响应中断的时候,MCU的硬件系统会将断点地址压进系统的堆栈保护,而在执行中断返回指令时,硬件系统又会自动将断点地址弹出到程序计数器PC中。###1.3中断源、中断信号和中断向量中断源一般可分为内部中断和外部中断典型的中断有定时器溢出中断,ADC完成中断等系统中的外部设备也可以作为中断源,这些中断源位于单片机外部

异步事件的处理机制:上下文与执行流

和自甴很熟 提交于 2019-12-02 02:36:19
一、异步事件的处理机制 1、事件队列机制 2、中断机制 二、异常、异步与执行流 1、异常: 异常是切换到新的执行流以后,原来的执行流不再保存。 2、异步: 异步是切换到新的执行流,执行完毕后再切换到原来的执行流。 三、两个核心: 1、上下文: 保存了执行流的上下文(先后顺序);上下文是执行流信息的结构化描述。 2、执行流: 执行逻辑。 四、处理机制与线程 1、线程的事件循环: 新的执行流的上下文作为消息,进入消息的派发队列; 2、中断 原来的执行流上线文由中断栈保存。 执行新的指令流。 执行完毕后切换到原来的中断栈。 五、其它补充 Linux 中有几种栈?各种栈的内存位置? 介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。内核将栈分成四种: 进程栈 线程栈 内核栈 中断栈 四、中断栈 进程陷入内核态的时候,需要内核栈来支持内核函数调用。中断也是如此,当系统收到中断事件后,进行中断处理的时候,也需要中断栈来支持函数调用。由于系统中断的时候,系统当然是处于内核态的,所以中断栈是可以和内核栈共享的。但是具体是否共享,这和具体处理架构密切相关。 https://blog.csdn.net/yangkuanqaz85988/article/details/52403726 来源: https://www.cnblogs.com/feng9exe/p/11726240

4_中断现场中

三世轮回 提交于 2019-12-01 22:17:19
虚拟机和模拟器 区别: -- windbg双机调试给虚拟机下断点是跟虚拟机子系统进行交互,可能windbg调试器会修改到内核环境 :比如 寄存器、gdt表等会被改变(有时候你调试发现windbg中gdt 的某项数据 和 pchunter 中gdt的某个数据不一致;其实,大概率pchunter才是正确的 );原因如前面一句话所述 ; -- 模拟器 (如 bochs)是实时的数据;下断点是模拟断点(用内存模拟的)所以不会修改到内核的环境,但是效率比较低; 所以: 在写内核代码的时候;最好自己实时输出想观察的数据;而不是过度依赖调试器; 有些时候调试器并不可信,特别是和调试子系统相关的 。 前面使用中断实时代码输出: 发现: 中断处理 涉及 到 cs ss esp 的 切换 红色: 调试器数据差异; 绿色:中断切换涉及到的切换; 来源: https://www.cnblogs.com/leibso-cy/p/11718863.html

1_中断提权

北城余情 提交于 2019-12-01 22:16:20
1 使用pchunter查看系统中断表(中断描述符表) 1.1 那些中断处理地址内核高2GB ,所以中断处理环境坑定在0环 利用分析: 那我们把自己得处理函数放在这里面,那经过这个表调用就能获得高权限; 注意: 代码 应该把随机基址关闭,并且使用release版本,这样地址稳定一些,debug 即使不开随机基址,可能运行中 子函数的地址会因为重构(当你改变内容的时候,可能编译器判断换个地址更优)而改变。 注意:选择项目属性:工具集 vs-2015xp兼容,并MFC静态编译(因为缺少一个dll,当然你可以根据提示拷贝过去) 代码: 注意: 可以使用windbg 在 IDT 中空闲的位置添加我们 自己构造的中断向量 : eq 8003f500 0040ee0000081040 00401040 是目标处理地址 0xee : 0x1 11 0 1110 是 p =1 在物理内存,dpl =3 ,使得当前3环程序能访问 , s =0 代表是系统段描述符, type = e 中断门 还可以使用CE 来修改 IDT 添加我们 自己构造的中断向量 : 然后直接内存修改 高 2g 比如这里输入 我们的目标中断向量地址 0x8003f500,然后就能实现不用双机也行 环境 vs2017; 注意: 代码 应该把随机基址关闭,并且使用release版本,这样地址稳定一些,debug 即使不开随机基址

2_多核复杂性

删除回忆录丶 提交于 2019-12-01 22:16:02
前置知识 为了防止中断嵌套会自动 cli 在中断能处理的时候会自动 cli -- 清除中断标记位 if。 这样如果在if = 0 的时候 ,0环死循环 那么就会造成系统假死崩溃。 实际代码验证 我们把前一次的代码设置成死循环 void _declspec(naked) IdtEntry(){// 这里是裸函数,所以不会有函数头 push ebp,mov ebp,esp,,和 ret x / sub esp,x 来平衡堆栈;// 这样的好处是 我们能控制全部的代码。__asm{ //mov eax, dword ptr ds : [0x8003f500];// 注意 : 行内 汇编(内联汇编,要求严格,需要把ds 这些都明确,不然会意想不到) //mov g_iData, eax;// label: jmp label; iretd;//iret 是实地址模式 16位的中断返回}​} 效果: 系统假死,---实际也死了,,,windbg 也下中断不下来 因为if = 0. 实际 windbg 发送请求给子系统,然后处理。但是这下处理不下来了。 windbg ctrl+break 失效 虚拟机也动不了 2 多核的复杂性 实验1 2.1 每个核 有独立的idt、gdt 所以你每次做的时候在多核情况下得都修改 使用windbg 在每一个cpu的 idt 的 0x20向量中添加不同的中断处理

linux-3.4.6内核中断流程分析

大城市里の小女人 提交于 2019-12-01 22:11:35
每个内核版本的代码都会有小部分不同,但是大体流程基本相同,只是调用关系和函数名称有些变化,下面来分析中断流程 1:在 arch/arm/kernel/ 下有个traps.c 文件中的 void __init early_trap_init(void *vectors_base) 函数 进行重定位中断向量列表 搜索 __vectors_start 可以知道 在arch/arm/kernel/entry_armv.S 中有宏定义 在这个文件中找到 vector_stub irq, IRQ_MODE, 4 以这个为例分析一下游程 vector_stub 是一个宏。 下面以 __irq_usr 用户模式的中断来找流程 搜索 __irq_usr 有个 irq_handler 这也是一个宏,继续搜索 还是在这个 entry_armv.S 中 搜索 arch_irq_handler_default 后里面会调用 asm_do_IRQ 到这里 前面都是用汇编写的,asm_do_IRQ 后面都用C函数实现的   调用关系如下:   early_trap_init  //内核用的是虚拟地址,这里只是把原来的中断向量复制到新的虚拟地址去 在内核配置文件有 0xffff0000 或 0x00000000都可以     vector_stub irq  //以这用户模式中断为倒分析       __irq

ucore学习笔记_LAB3

ε祈祈猫儿з 提交于 2019-12-01 20:06:22
练习1:给未被映射的地址映射上物理页 虚拟地址空间和物理地址空间示意图 关键数据结构: struct vma_struct { struct mm_struct *vm_mm; //指向一个比vma_struct更高的抽象层次的数据结构mm_struct uintptr_t vm_start; //vma的开始地址 uintptr_t vm_end; // vma的结束地址 uint32_t vm_flags; // 虚拟内存空间的属性(只读,可读可写,可执行) list_entry_t list_link; //双向链表,按照从小到大的顺序把虚拟内存空间链接起来 }; struct mm_struct { list_entry_t mmap_list; //双向链表头,链接了所有属于同一页目录表的虚拟内存空间 struct vma_struct *mmap_cache; //指向当前正在使用的虚拟内存空间(利用局部性) pde_t *pgdir; //指向的就是 mm_struct数据结构所维护的页表 int map_count; //记录mmap_list里面链接的vma_struct的个数 void *sm_priv; //指向用来链接记录页访问情况的链表头 }; pagefault异常处理 CR2用于发生页异常时报告出错信息。当发生页异常时