中断处理

Virtualbox源码分析16 APIC虚拟化1 APIC概念和初始化

♀尐吖头ヾ 提交于 2020-02-06 18:08:57
说明: APIC我其实也理解的不是特别明白,只是从网上找些资料和阅读源码理解,如果有错误,麻烦在下面评论里指出。 虚拟化有个重要的功能: APIC虚拟化,本章重点介绍这个功能 中断是什么 一般来说,中断主要是由一些硬件设备产生的,表示这些硬件有一些重要的事件需要通知处理器,比如某些从外部设备请求的数据准备好了,需要通知处理器对其进行读取等。当然这里所谓的“一般来说”是指也可以通过软件的方式来触发中断,比如调用 INT n 指令,当然这种方式产生的中断和通过意见产生的中断最终的处理方式会有很大的不同。 因此从种类来分,可以将中断分为通过硬件产生的外部中断(External interrupt)和通过软件产生的软件中断(Software interrupt)。不管是外部中断还是软件中断,每个中断都有一个中断号与之对应,对于外部中断来说,可使用的中断号范围从16到255(0到15)为系统预留的中断号,而对于软件中断来说,可使用的中断号为0到255。除此之外,16到255范围内的中断是可以通过EFLAGS中的 IF flag 进行disable的,如果EFLAGS中的 IF flag 被清零,则表示当前CPU不接受这个范围内的中断,如果其被置为1,则表示当前CPU可以正常处理这个范围内的中断。 中断是如何被发送给CPU的? 中断在进入CPU之前,首先会进入一个被称为Advanced

Java-Interrupt-中断信号

天大地大妈咪最大 提交于 2020-02-05 06:34:48
1、中断信号Interrupt 1.如果线程处于阻塞状态会立马退出阻塞并抛出InterruptedException异常,线程可以通过捕获InterruptedException方法来做一定处理,然后让线程退出。 2.如果线程处于运行中则不受任何影响继续运行,仅仅将线程的中断标记设置为true。 2、示例代码 public class ThreadInterruptDemo { public static void main(String[] args) throws InterruptedException { // 模拟正常运行发出中断信号 Thread threadOne = new Thread(new Runnable() { public void run() { Thread currentThread = Thread.currentThread(); while (!currentThread.isInterrupted()) { System.out.println("Thread One 正在运行!"); } System.out.println("Thread One 正常结束!" + currentThread.isInterrupted()); } }); // 模拟阻塞线程发出中断信号 Thread threadTwo = new Thread(new

Linux驱动面试题

时间秒杀一切 提交于 2020-02-05 01:14:24
Linux驱动面试题 1、 Linux设备中字符设备与块设备有什么主要的区别?请分别列举一些实际的设备说出它们是属于哪一类设备。 字符设备:字符设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符设备驱动程序通常至少实现open,close,read和write系统调用。字符终端、串口、鼠标、键盘、摄像头、声卡和显卡等就是典型的字符设备。 块设备:和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。块设备上能够容纳文件系统,如:u盘,SD卡,磁盘等。 字符设备和块设备的区别仅仅在于内核内部管理数据的方式,也就是内核及驱动程序之间的软件接口,而这些不同对用户来讲是透明的。在内核中,和字符驱动程序相比,块驱动程序具有完全不同的接口。 2、查看驱动模块中打印信息应该使用什么命令?如何查看内核中已有的字符设备的信息?如何查看正在使用的有哪些中断号? 查看驱动模块中打印信息的命令:dmesg 查看字符设备信息可以用lsmod 和modprobe,lsmod可以查看模块的依赖关系,modprobe在加载模块时会加载其他依赖的模块。 显示当前使用的中断号cat /proc/interrupt 3、Linux中引入模块机制有什么好处? 首先,模块是预先注册自己以便服务于将来的某个请求,然后他的初始化函数就立即结束。换句话说

单片机的中断系统

独自空忆成欢 提交于 2020-02-02 04:38:04
有关单片机中断系统的概念:什么是中断,我们从一个生活中的例程引入。你正在家中看书,突然电话铃响了,你放下书本,去接电话,和来电话的人交谈,然后放下电话,回来继续看你的书。这就是生活中的“中断”的现象,就是正常的工作过程被外部的事件打断了。仔细研究一下生活中的中断,对于我们学习单片机的中断也很有好处。 第一、什么可经引起中断,生活中很多事件能引起中断:有人按了门铃了,电话铃响了,你的闹钟闹响了,你烧的水开了….等等诸如此类的事件,我们把能引起中断的称之为中断源,单片机中也有一些能引起中断的事件,8031中一共有5个:两个外部中断,两个计数/定时器中断,一个串行口中断。 第二、中断的嵌套与优先级处理:设想一下,我们正在看书,电话铃响了,同时又有人按了门铃,你该先做那样呢?如果你正是在等一个很重要的电话,你一般不会去理会门铃的,而反之,你正在等一个重要的客人,则可能就不会去理会电话了。如果不是这两者(即不等电话,也不是等人上门),你可能会按你常常的习惯去处理。总之这里存在一个优先级的问题,单片机中也是如此,也有优先级的问题。优先级的问题不仅仅发生在两个中断同时产生的情况,也发生在一个中断已产生,又有一个中断产生的情况,比如你正接电话,有人按门铃的情况,或你正开门与人交谈,又有电话响了情况。考虑一下我们会怎么办吧。 第三、中断的响应过程:当有事件产生

关于单片机中断

给你一囗甜甜゛ 提交于 2020-02-02 03:57:43
中断 :CPU停止当前任务,去处理中断内容,处理完后自动恢复以前任务。   单片机有5个中断源,2个中断优先级,中断受两级控制:     1、CPU开总中断;     2、中断源开中断。 中断源 :引起中断事件的类型。    5个中断源:     1、外部中断请求0,由INT0(P3.2)输入;     2、外部中断请求1,由INT1(P3.3)输入;     3、片内定时器/计数器0溢出中断请求;     4、片内定时器/计数器1溢出中断请求;     5、片内串行口发送/接收中断请求。//很重要,单片机应用中用了很多        定时器/计数器控制寄存器(Timer/counter Control Register ): 用来查看是否产生了外部中断             IT0,IT1(Interrupt Type):外部中断0、1触发方式选择位,由软件设置。         0-->下降沿触发方式,INT0/INT1引脚上从高到低的复跳变可引起中断;         1-->电平触发方式,INT0/INT1引脚上低电平可引起中断。       IE0,IE1(Interrupt Edge):外部中断0、1请求标志位。         当外部中断0、1依据触发方式满足条件产生中断请求时,由硬件置位(IE0/IE1=1);         当CPU响应中断时,由硬件清楚

多线程之美8一 AbstractQueuedSynchronizer源码分析<二>

a 夏天 提交于 2020-02-01 03:54:51
目录 宠文 m.shupu.org AQS的源码分析 <二> 该篇主要分析AQS的ConditionObject,是AQS的内部类,实现等待通知机制。 1、条件队列 条件队列与AQS中的同步队列有所不同,结构图如下: 两者区别: 1、链表结构不同,条件队列是单向链表,同步队列是双向链表。 2、两个队列中等待条件不同,条件队列中线程是已经获取到锁,主动调用await方法释放锁,挂起当前线程,等待某个条件(如IO,mq消息等),同步队列中的线程是等待获取锁,在获取锁失败后挂起等待锁可用。 两者联系: 当等待的某个条件完成,其他线程调用signal方法,通知挂起在条件队列中的线程,会将条件队列中该node移出,加入到同步队列中,node的ws状态由Node.CONDITION改为0 ,开始等待锁。 2、ConditionObject ConditionObject 和 Node一样,都是AQS的内部类, ConditionObject实现Condition接口,主要实现线程调用 await和signal ,实现线程条件阻塞和通知机制,Condition对象通过 Lock子类调用newConditon方法获取,以 ReentrantLock为例,代码如下: ReentrantLock lock = new ReentrantLock(); Condition condition =

04_ESP8266 NONOS_SDK GPIO

我的梦境 提交于 2020-02-01 01:37:54
相关资料准备: (1)GPIO相关API请查看2c-esp8266_non_os_sdk_api_reference_cn手册 (2)GPIO相关寄存器请查看 esp8266-technical_reference_cn 手册 (3)ESP8266 的 16 个通⽤ IO 的管脚位置和名称如下表所示: 图1.1-GPIO管脚定义 其中,在四线( QUAD)模式 Flash 下,有 6 个 IO 口用于 Flash 通讯。 在两线( DUAL)模式 Flash 下,有 4 个 IO 口用于与 Flash 通讯。 说明: 本说明如果对照以下资料阅读,会更有助理解: • “附录 1 - GPIO 寄存器” • 引脚功能复⽤表:《 ESP8266_Pin_List.xlsx》 https://www.espressif.com/sites/default/files/documentation/ESP8266_Pin_List.xls 一、GPIO 口输出 目标: 将GPIO2和GPIO4设置成IO口,将管脚设为输出模式,并输出对应电平,加入delay延时,使LED按照一定频率闪烁。步骤如下: 1 、首先将添加两个头文件: "eagle_soc.h"和 "gpio.h" 2 、管脚功能选择: 将GPIO2定义为IO口,PIN_FUNC_SELECT( PERIPHS_IO_MUX

自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析

蹲街弑〆低调 提交于 2020-01-31 03:56:30
转自:http://blog.csdn.net/wh_19910525/article/details/11536279 自旋锁的初衷:在短期间内进行 轻量级的锁定 。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋( 特别浪费处理器时间 ),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。 单处理器的自旋锁: 首先,自旋锁的目的如果在系统不支持内核抢占时,自旋锁的实现也是空的,因为单核只有一个线程在执行,不会有内核抢占,从而资源也不会被其他线程访问到。 其次,支持内核抢占,由于自旋锁是禁止抢占内核的,所以不会有其他的进程因为等待锁而自旋. 最后,只有在多cpu下,其他的cpu因为等待该cpu释放锁,而处于自旋状态,不停轮询锁的状态。所以这样的话,如果一旦自旋锁内代码执行时间较长,等待该锁的cpu会耗费大量资源,也是不同于信号量和互斥锁的地方。 简单来说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。 自旋锁内睡眠禁止睡眠问题: 如果自旋锁锁住以后进入睡眠,而此时又不能进行处理器抢占(锁住会disable prempt),其他进程无法获得cpu,这样也不能唤醒睡眠的自旋锁,因此不相应任何操作。 自旋锁为什么广泛用于内核: 自旋锁是一种轻量级的互斥锁,可以更高效的对互斥资源进行保护

计算机组成:输入输出系统

老子叫甜甜 提交于 2020-01-29 18:22:09
输入输出系统 通道可以看做是DMA的升级版,通道有自己的控制器甚至是存储器、内存 通道可以执行由通道指令编写的程序,由操作系统完成 如果使用通道,就不是连接接口了,而是连接设备管理器 I/O处理机可以使用微处理器甚至直接使用和主处理器相同的处理器来做,当然这就不是家用电脑的范畴了,强大的I/O处理机甚至在没有IO工作时,可以作为主机的处理器来使用 I/O和主机的连接方式 统一编址:将io地址看成内存地址的一部分。这种方式实现了io和内存的统一不需要单独的io指令,CPU指令集相对简单,如果内存空间比较大(eg.64位)可以采用这种方式 单独编址: 串行速度慢,但是适合长距离传输 不便于增删设备 外部设备输出的数据可以先缓存到io接口,进行数据格式的转换等操作再输入主机 便于增删设备、采用标准接口,可移植性强 信息传送的控制方式 CPU直接对IO进行管理 缺点就是广为人知的,浪费CPU DMA请求:向CPU申请占用一个存取周期的总线控制权从而将外部设备的数据加载到内存中,这个周期内CPU不能使用总线对内存进行访问,但是这段时间CPU依然可以正常使用(由于CPU会预先取一部分指令,这段时间不能访问内存有可能影响不大) 外部设备简介 主观图像:用户绘制的图像,由点线面构成,就是简单的那种 客观图像:eg.GUI A:模拟信号 D:数字信号 IO接口 为什么使用接口 主机可能使用并行传输

QNX驱动开发——中断处理 http://www.cnblogs.com/splovecyk/p/4383162.html的描述

感情迁移 提交于 2020-01-29 05:32:04
中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感) http://blog.csdn.net/samantha_sun/article/details/6790492 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念; 2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据CPU频率进行一定 次数的循环;最好不要使用mdelay,因为毫秒延时对内核来说已经是非常大了。而在中断处理程序中使用msleep却绝对不行。(见linux设备驱动开发详解第二版p210页) 3,printk函数在中断处理函数中可以使用,但是会占用较多时间,降低效率。在调IIC驱动的时候,由于IIC读取写入处理时必须进行一定延 时,在我没有使用udelay的时候,竟然用printk就使IIC中断正常运行,当时在调试的时候,发现有些printk加上程序就正常,去掉就不正 常,当时真是匪夷所思,但现在明白了,因此printk占用时间比较大,正好充当了IIC延时的功能。最后我把printk全部去掉,在需要延时的地方加 入udelay,才使程序正常运行。 4,使用for和while等的空循环在中断处理函数中进行延时操作