中断处理

INT 3 中断调试处理流程

大城市里の小女人 提交于 2019-12-06 12:37:26
Windows内核分析索引目录 :https://www.cnblogs.com/onetrainee/p/11675224.html INT 3 中断调试处理流程 一、调试器如何下INT 3 断点    1)首先,调试器使用 ReadProcessMemory,读取断点内存地址的字节。   2)之后,调试器再使用 WriteProcessMemory,将指定的内存地址指令写为0xCC。   3)之后,当程序执行到这里,遇到CC指令,会从IDT表中查03号段描述符,其会定向到Trap03函数。   4)经过一系列操作(下面会介绍),此时调试器就会接收到INT 3中断,程序暂停,用户可以用来进行一些处理。   5)恢复时,将1)读取的字节再重新写入到CC处,这样就可以保证程序的正常执行。 二、INT 3 异常指令如何派发到调试器    我们在 一、3) 中,其会经过 Trap03,因此INT3异常信息肯定是在这里发送的。   我们前面学过异常等派发,其检测到存在三环调试器时会发送到三环调试器,因此其派发也就是在这时进行的。   派发流程大体如下:    三、上面产生的两个疑问:     1)在 _kiDispatchException 中存在 dec eip,为什么调试器还需要修复 eip   注意:这个是Context.eip--,而三环与零环走的是 TrapFrame 结构

VxWorks基本OS介绍

前提是你 提交于 2019-12-06 12:36:41
这里我就偷点懒,直接复制粘贴文档了。可能会有一些图片无法显示 ,可以直接管我索要文档。 每一个被切换的程序实体就是“任务”。每一个任务都有其自己的上下文——所谓上下文就是指任务在每一次被核心调度时所需要的 CPU环境、系统资源。在上下文的切换过程中,每一个任务的上下文被存在该任务的任务控制块中(TCB )。 ◆ 执行的线程,也就是任务程序计数器; ◆ CPU 寄存器的内容和浮点寄存器中的内容; ◆ 动态变量和程序调用所使用的堆栈; ◆ 标准输入输出的I/O 分配和错误; ◆ 延时计时器; ◆ 时间片计时器; ◆ 核心控制结构; ◆ 信号处理句柄; ◆ 调试和性能监视值。 wind核心中使用了基于优先级抢占式的任务调度策略,但是用户也可以选择优先级轮转调度策略。 1.优先级抢占策略 通过使用优先级抢占策略,每一个任务都会拥有一个优先级,这样内核就会确信将 CPU资源分给了优先级最高的就绪任务。这种方法之所以叫做抢占式的,是指任何运行的任务会被一个变成就绪状态而且优先级更高的任务打断,这时系统会保存当前任务的上下文并立即切换到高优先级的任务上下文,并且开始执行这个任务。在图14.2所示的任务优先级抢占图中给出了优先级抢占的例子,例子中任务t1被优先级较高的任务t2抢占,而更高优先级的任务t3则抢占了t2的执行,当t3执行完后,t2开始继续执行,接下来t1在t2

java多线程中篇(三) —— 线程的控制(创建,运行,阻塞,中断,结束)

大城市里の小女人 提交于 2019-12-06 12:27:11
简介   线程的控制就是程序对线程的主要管理,最重要的就是状态的切换维护。   每种转态都有不同的引发事件(对应线程的方法),每种状态又有各自不同的处理步骤和过程,整个线程控制主要就是涉及这些内容。    正文 线程等待与唤醒   所涉及到的方法:wait()、notify()、notifyAll()。   详细信息如下:      notify() -- 唤醒在此对象监视器上等待的单个线程。     notifyAll() -- 唤醒在此对象监视器上等待的所有线程。     wait() -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)。     wait(long timeout) -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。     wait(long timeout, int nanos) -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量”,当前线程被唤醒(进入“就绪状态”)。     

阅读GIC-500 Technical Reference Manual笔记

不羁岁月 提交于 2019-12-06 10:26:38
转自: https://www.cnblogs.com/arnoldlu/p/7406441.html 1.前言 了解Linux中断子系统,同时也需要了解ARM体系结构中断处理流程;在熟悉整个软硬件架构和流程基础上,才能对流程进行细化,然后找出问题的瓶颈。《 2. 梳理中断处理子系统 》 但是所有的优化都离不开一个量化的过程,有个可靠、高效、可读性强的度量必不可少。《 3. 一种测量中断性能手段 》 最后基于此,进行中断性能的优化。《 4.中断性能优化 》 2. 梳理中断处理子系统 中断系统涉及到软硬件两部分,具体到ARM系统和Linux涉及到很多相关点。 硬件以Cortex-A53为基础,整个GIC架构包括两部分:CPU内部的GIC CPU Interface( Cortex-A53 Chapter 9 )和CPU外部的GIC external distributor component。 《ARM Cortex-A53 MPCore Processor Technical Reference Manual》简单介绍了A53核内部的GIC CPU Interface。 《ARM Generic Interrupt Controller Architecture Specification v3/v4》详细介绍了整个GIC架构的方方面面,具体实现比如GIC-600在《GIC-600

xilinx基础入门

这一生的挚爱 提交于 2019-12-06 04:56:38
2019.09.03 一、基础部分及语法 一、FPGA程序的固化 [USF-XSim-62] 'simulate' step failed with errors. Please check the Tcl console or log files for more information. 1、 在C语言代码中,行结尾反斜杠\ 起到换行作用,用于宏定义和字符串换行。其中宏定义使用居多。如果一行中有很多元素导致太长影响阅读,可以在结尾加 \ 的方式实现换行,编译时会忽略\以及其后的换行符,当做一行处理。………\就是表示一行不间断。 2、 关于各种电压: VCCINT:内部PL核心电压 VCCAUX:辅助PL电压 VCCBRAM:PL BRAM电压 VCCPINT:PS内部核心电压 VCCPAUX:PS辅助电压 VCCDDR:DDR RAM的工作电压 VREFP:XADC正参考电压 VREFN:XADC负参考电压 3、 #ifdef __cplusplus Extern “C”{ #endif 代码说明: 为了在C++代码中调用用c写成的库文件,就需要用extern”C”来告诉编译器:这是一个用C写成的库文件,请用C的方式来链接它们。 二、断言函数 #define Xil_AssertNonvoid(Expression) \ { \ if (Expression) { \ Xil

利用AXI-DMA批量发送数据到DMA

旧街凉风 提交于 2019-12-06 04:55:43
1.1 主函数 int main ( void ) { XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID); XGpio_SetDataDirection(&Gpio, 1, 0); init_intr_sys(); XGpio_DiscreteWrite(&Gpio, 1, 1); axi_dma_test(); } 1.2 三个简单函数 (1)、XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID); 本语句对GPIO进行初始化,对实例数据进行配置。 (2)、XGpio_SetDataDirection(&Gpio, 1, 0); 设置GPIO的方向,向通道1写0,0:输出,1:输入。 (3)、XGpio_DiscreteWrite(&Gpio, 1, 1); 设置GPIO的输出为1。 一、 init_intr_sys函数分析 1、DMA_Intr_Init(&AxiDma,0); DMA中断实例化函数,将要配置的DMA信息先lookupConfig再进行CfgInitialize,DMA采用块模式(Block mode),如果是Sg模式,则配置失败。 2、Timer_init(&Timer,TIMER_LOAD_VALUE,0); 定时器初始化函数,传入参数有定时器结构、加载值,设备ID

关于ARM的PC指针(什么时候PC+8,PC+4,PC-4,PC-8)转

蓝咒 提交于 2019-12-06 04:28:37
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/lee244868149/article/details/49488575 要理解PC指针,首先就要好好了解LR指针 连接寄存器LR(r14):用来保存和恢复PC寄存器的内容,它有两个特殊功能。 (1)保存子程序返回地址。使用BL或BLX时,跳转指令自动把返回地址放入r14中;子程序通过把r14复制到PC来实现返回,通常用下列指令之一: MOV PC, LR BX LR 通常子程序这样写,保证了子程序中还可以调用子程序。 stmfd sp!, {lr} …… ldmfd sp!, {pc} (2)当异常发生时,异常模式的r14用来保存异常返回地址,将r14如栈可以处理嵌套中断。 程序计数器r15(PC):PC是有读写限制的。当没有超过读取限制的时候,读取的值是指令的地址加上8个字节,由于ARM指令总是以字对齐的,故bit[1:0]总是00。当用str或stm存储PC的时候,偏移量有可能是8或12等其它值。在V3及以下版本中,写入bit[1:0]的值将被忽略,而在V4及以上版本写入r15的bit[1:0]必须为00,否则后果不可预测。 知道PC寄存器和LR寄存器功能以后,再了解一下ARM处理器的三级流水线和多级流水线 首先

接口技术第六章——输入输出接口及数据传输控制方式总结

老子叫甜甜 提交于 2019-12-06 04:14:53
正在学习接口技术和计算机组成原理,中间有一些重叠的部分就放在一起了,至于DMA,中断之类的会放在后面讲解 6.1 接口综述 硬件接口通常称为I/O接口,把外围设备同微型计算机连接起来的电路称为外设接口电路,简称外设接口。I/O接口是CPU同外界进行信息交换的中转站 使用接口的原因 速度不匹配 外设外慢 时序不匹配 各个外部设备都有自己的定时控制电路,以自己的速度进行传输,同CPU的时序不匹配 信息格式不匹配,不同的外设存储和处理信息的格式不同 信息类型不匹配,有些是数字电路,有些是模拟电路 CPU与外设之间所传送的数据类型 数据信息 包括模拟量,数字量,开关量,可以输入也可以输出 状态信息 这是I/O端口送给CPU的有关本端口所对应的外设当前状态的信息,供CPU参考分析 控制信息 这是CPU送给I/O设备的控制命令,使相应的外部设备完成特定的操作 在8086/8088中,这三种信息的输入输出基本一致,可以分发不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入输出的数据中设置特征位 接口的功能(背) 执行CPU命令 CPU将对外设的控制命令发到接口电路的命令寄存器中,以便控制外设按要求进行工作 返回外设状态 通过外设寄存器(状态口)完成,包括正常工作状态和故障状态 数据缓冲的功能 (平滑作用)接口电路中的数据寄存器(数据口)对CPU与外设设备之间的数据进行中转

详解Condition的await和signal等待/通知机制

谁说胖子不能爱 提交于 2019-12-06 03:34:59
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。 传送门: https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 1.Condition简介 任何一个java对象都天然继承于Object类,在线程间实现通信的往往会应用到Object的几个方法,比如wait(),wait(long timeout),wait(long timeout, int nanos)与notify(),notifyAll()几个方法实现等待/通知机制,同样的, 在java Lock体系下依然会有同样的方法实现等待/通知机制。从整体上来看Object的wait和notify/notify是与对象监视器配合完成线程间的等待/通知机制,而Condition与Lock配合完成等待通知机制,前者是java底层级别的,后者是语言级别的,具有更高的可控制性和扩展性。两者除了在使用方式上不同外,在功能特性上还是有很多的不同: Condition能够支持不响应中断,而通过使用Object方式不支持; Condition能够支持多个等待队列(new 多个Condition对象),而Object方式只能支持一个;

FreeRTOS----调度器

我们两清 提交于 2019-12-06 02:39:20
FreeRTOS----调度器 调度器的启动流程分析 当创建完任务之后,会调用vTaskStartScheduler()函数,启动任务调度器; void vTaskStartScheduler( void ) { /* 部分代码如下: */ BaseType_t xReturn; xReturn = xTaskCreate( prvIdleTask, configIDLE_TASK_NAME, configMINIMAL_STACK_SIZE, ( void * ) NULL, portPRIVILEGE_BIT, &xIdleTaskHandle ); #if ( configUSE_TIMERS == 1 ) { if( xReturn == pdPASS ) { xReturn = xTimerCreateTimerTask(); } else { mtCOVERAGE_TEST_MARKER(); } } #endif /* configUSE_TIMERS */ if( xReturn == pdPASS ) { #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT { freertos_tasks_c_additions_init(); } #endif portDISABLE_INTERRUPTS(); #if ( configUSE