中断向量

uboot的中断向量初始化

柔情痞子 提交于 2020-03-22 07:33:48
第一层引导程序的开始部分如下,正常启动的情况下程序从_start入口执行(config.mk定义,地址为0x00000000)。 但是开始有个疑问:就是_start入口后,第一个指令就执行了b reset,进入了reset标签,正常启动了,对于改指令后的红色部分,并不能有效执行,怎么才能把中断向量正常初始化呢?(中断函数在其他地方也没有执行、或定义过,只有此地方)。 经查,根据s3c2440的定义,中断向量的定义,是固定定义在0x0000000开始的地址上的,比如reset中断的地址是0x00000000,undefined_instruction是0x00000004,.......,这就可以解释了,编译时在固定位置上存储指定的中断处理方式即可(就是直接存储中断函数到pc,进行中断跳转)。而正常情况下是不需要执行的! 之所以执行b reset,是因为在启动时,中断已经发生了(重启)。 .globl _start _start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq _undefined_instruction:

中断实现的基本原理

不羁的心 提交于 2020-03-18 17:16:27
前言: 中断是计算机发展中一个重要的技术,它的出现很大程度上解放了CPU,提高了CPU的执行效率。 在中断出现之前,CPU对IO采用的是轮询的方式进行服务,这使的CPU纠结在某一个IO上,一直在等待它的响应,如果它不响应,CPU就在原地一直的等下去。这样就导致了其他IO口也在等待CPU的服务,如果某个IO出现了important or emergency affairs,CPU也抽不出身去响应这个IO。 为了解决这个纠结的问题就------>出现了中断 中断控制的主要优点是只有在IO接口需要服务时才去响应它,使得CPU很淡定的做它自己的事情,只有IO口有需求的时候才去响应它。同时中断中也设计了中断优先级,来处理一些很紧急的事件。 一.中断的基本知识 1.中断的概念: 所谓中断,是指CPU在正常运行程序时,由于程序的预先安排或内外部事件,引起CPU中断正在运行的程序,而转到发生中断事件程序中。这些引起程序中断的事件称为中断源。 其实从 物理学的角度看,中断是一种电信号,由硬件设备产生,并直接送入中断控制器(如 8259A)的输入引脚上,然后再由中断控制器向处理器发送相应的信号。处理器一经检测到该信号,便中断自己当前正在处理的工作,转而去处理中断。此后, 处理器会通知 OS 已经产生中断。这样,OS 就可以对这个中断进行适当的处理。不同的设备对应的中断不同

DmpAnalysis-中断和异常

半世苍凉 提交于 2020-03-07 00:11:38
part2-2-中断和异常-用户态异常 文章目录 part2-2-中断和异常-用户态异常 1. x86中断 2. x64中断 3. 中断帧以及栈修复 案例 4. x86 trap指令 5. x64 trap指令 6. R3异常 7. 如何区分 1ST AND 2ND CHANCES 8. 谁启动了后期调试器 9. vista错误报告 10. page fault 1. x86中断 以除零异常为例。cpu从idtr获取idt地址,idt是一个4或8字节描述符(中断向量)数组。cpu计算处理函数地址并调用,当然还要保存上下文。 中断向量可以从dmp中提取出来 前32个中断向量由intel使用。 windows启动时cpu从实模式切换到保护模式,这之前,cpu就会创建idt,并用 sidt 指令使idtr指向idt。 下面的UML是内核模式异常处理流程。用户模块流程还需要从R3栈切换到R0栈。 对于内核dmp,使用 !pcr PID 指令可以查看Processor Control Region 信息: 0: kd> !pcr 0 KPCR for Processor 0 at ffdff000: Major 1 Minor 1 NtTib.ExceptionList: f2178b8c NtTib.StackBase: 00000000 NtTib.StackLimit:

【自制操作系统08】中断

丶灬走出姿态 提交于 2020-02-16 18:29:21
由于中断这块的知识和代码都占较大篇幅,因此分成两章来讲,本章不包含任何中断的代码,只讲理论部分,以及中断的大概流程。代码实现部分由下一章来讲解 【自制操作系统09】中断的代码实现 一、到目前为止的程序流程图 为了让大家清楚目前的程序进度,画了到目前为止的程序流程图,如下。 二、什么是中断 这里我们先从形象的角度来描述,中断就是让操作系统停止手中正在进行的工作,先把中断信号对应的处理程序执行完毕,再回到之前的程序中继续进行,这样一个机制。 一个很形象的说法是,我们的操作系统就是 中断驱动 的,可以把操作系统简单理解为一个 死循环 ,无时无刻不在等待中断的来临, 被动 地执行相应的任务。 while(true){ 操作系统代码 } 三、中断的分类 外部中断 外部中断通过两个引脚连接到 CPU 上,一个是可屏蔽中断 INTR,一个是不可屏蔽中断 NMI INTR :硬盘、打印机、网卡等设备发出的中断信号,可通过 eflags 寄存器的 IF 位将所有这些外部设备的中断屏蔽 NMI :电源掉电、内存读写错误、总线奇偶校验错误等灾难性的错误,不可屏蔽,CPU 必须立刻处理 对于可屏蔽中断,Linux 的处理方式是分成 上半部 和 下半部 。上半部执行时关闭中断,立刻执行完毕;下半部执行时打开中断,此时如果有其他中断进来,则让给其他中断(也是上半部执行完毕)。 内部中断 内部中断可分为 软中断

BIOS的启动原理学习--加载引导程序

做~自己de王妃 提交于 2020-01-27 22:24:44
在Windows系统以及有图形界面的其他操作系统中要想执行一个程序,必须在窗口中双击它,或者在命令行界面中输入相应的执行命令。从计算机底层机制上讲,这其实是在一个已经运行起来的操作系统的可视化界面或命令行界面中执行一个程序。感觉要进入先有鸡还是先有蛋的循环之中了。但是,在开机加电的一瞬间,内存中什么程序也没有,没有任何程序在运行,不可能有操作系统,更不可能有操作系统的用户界面。 既然软件方法不可能执行BIOS,那就只能靠硬件方法完成了。这让我想起了老式打字机,每打完一行字都要手动推一下滑杆,手动换位,挺麻烦的。 理解参考 实模式,保护模式 Intel x86架构的CPU可以分别在16位实模式和32位保护模式下运行。为了兼容,也为了解决最开始的启动问题,Intel将所有x86架构CPU(包括最新型号的CPU)的硬件都设计为加电即进入16位实模式状态运行。同时,还有一点非常关键,即将CPU硬件逻辑设计为加电瞬间强行将代码段寄存器(cs)的值置为0xFFFF,偏移量(IP)的值置为0x0000,这样CS:IP就指向0xFFFF0这个地址位置。BIOS程序的第一条指令就设计在这个位置上。 以上是一个纯硬件完成的动作!如果此时这个位置没有可执行代码,那就什么也不做,计算机就此死机。反之,如果这个位置有可执行代码,计算机将从这里的代码开始,沿着后续程序一直执行下去

K60笔记

孤者浪人 提交于 2020-01-17 05:35:54
ADC,DAC是模数,数模采集模块 PIT,LPTMR,FTM,SysTick(内核自带)都是计时器,FTM还可以做PWM控制器 DMA是用来专用传输数据的,在不经过内核控制的情况下可以大数据传输到指定地址 Flexbus用于和外部RAM,ROM,液晶显示屏等外部模块进行通信,数据读写。 CAN 差分传输数据,多个CAN寄存器公用一条CAN路,有很强的抗干扰通信能力 CPSIE:系统总中断 K60可以用JTAG,Ezport,SWD三种方式下载,详情参见图1 KL26下载方式和对应管脚参见图2 K60开机启动顺序和启动项目参见图3 存放中断程序或生成中断程序的入口地址的首地址叫中断向量。 80x86系统是把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域内,这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表。 malloc函数申请的地址和动态分配的数据存放在堆中,局部变量和函数内部局部变量 来源: CSDN 作者: 猫老板来嗨 链接: https://blog.csdn.net/qq_21464351/article/details/103990252

linux中断源码分析 - 概述(一)

梦想的初衷 提交于 2020-01-04 14:35:28
本文为原创,转载请注明: http://www.cnblogs.com/tolimit/ 关于中断和异常   一般在书中都会把中断和异常一起说明,因为它们具有相同的特点,同时也有不同的地方。在CPU里,中断和异常都会放入到一个中断描述符表中,都需要特定的处理程序进行处理,并且它们都是异步事件,内核完全不知道何时会有一个异常或者中断发生。当异常或者中断发生时,进程都会陷入内核,在内核中执行相应的处理。异常一般都是由CPU内部或者进程产生,而中断一般都是由外部设备产生。异常处理过程实际上和系统调用没什么区别(实际上系统调用是通过一个0x80异常陷入内核当中),而中断的处理过程和情况就相对来说比较复杂。一个中断处理分为硬中断和软中断两个部分,在中断处理的过程中系统是禁止调度和抢占的,而异常处理过程中是允许的。一个中断处理程序可以抢占其他的中断处理程序,也可以抢占异常处理程序,相反的,异常处理程序却不能够抢占中断处理程序。 可编程中断控制器(PIC、APIC)   为了方便说明,这里我们将PIC和APIC统称为中断控制器。中断控制器是作为中断(IRQ)和CPU核之间的一个桥梁而存在的,每个CPU内部都有一个自己的中断控制器,中断线并不是直接与CPU核相连,而是与CPU内部或外部的中断控制器相连。而为什么叫做可编程中断控制器,是因为其本身有一定的寄存器

MIT-JOS系列6:用户环境(二)

回眸只為那壹抹淺笑 提交于 2020-01-04 14:30:14
Part A:用户环境和异常处理 注:根据MIT-JOS的lab指导手册,以下不明确区分“环境”和“进程” 用户环境创建 见上一篇: MIT-JOS系列5:用户环境(一) 处理中断和异常 基础知识 受保护的控制转移 异常(exceptions)和中断(interrupts)都是受保护的控制转移(protected control transfers),它们将处理器模式从用户态切换到内核态,不给用户模式干扰到其他环境或内核功能的机会。在Intel的术语里, 中断一般是指由处理器外部的异步事件引发 的受保护的处理器控制权转移,例如外部I/O设备发出的活动信号; 异常则是由当前执行的代码同步地引起 的控制权转移,例如除零异常或非法存储器访问 为了确保这些控制转移被切实地受到了保护,处理器的中断/异常机制被设计为: 当中断或异常发生时,当前执行的代码无法选择进入内核的位置或方式 。处理器确保只能在严格受控的情况下才能进入内核态。在x86下,两种机制配合工作以提供这种保护: 中断描述符表IDT (中断向量表):处理器保证中断和异常只能引起代码进入到内核的一些特定的、已被明确定义的入口点。这些入口点由内核决定,而非中断或异常引发时正在执行的代码决定 x86允许内核有256种不同的中断或异常入口,每个入口的值由整数0~255表示,称为 中断向量 。一个中断向量的值由引发中断的源决定,不同的设备

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

软件中断调用

被刻印的时光 ゝ 提交于 2019-12-06 03:18:16
DOS功能调用 DOS中断号范围:0x20H~0x3FH,总共32个中断向量 INT 21H 01H号子功能: 等待从键盘输入一个字符,同时将该字符显示在显示器上 入口参数:无 出口参数:AL=按键的ASCII码 02H号子功能: 显示一个字符 入口参数:DL=待显示字符的ASCII码 出口参数:无 07H号子功能: 等待从键盘输入一个字符,但该字符不显示在显示器上,不响应CTRL_C 入口参数:无 出口参数:AL=按键的ASCII码 08H号子功能: 等待从键盘输入一个字符,同时将该字符显示在显示器上,响应CTRL_C 入口参数:无 出口参数:AL=按键的ASCII码 09H号子功能: 显示字符串,响应CTRL_C 入口参数:DS:DX=字符串首地址,字符串必须以'$'为结束标志 出口参数:无 0AH号子功能:等待从键盘输入字符串,并保存在输入数据缓冲区,同时在屏幕上显示 入口参数:DS:DX=输入数据缓冲区首地址,回车键为结束符,回车键'0DH'保存在缓冲区中,缓冲区首单元预置接收的字符个数(包括回车键),BUF+1单元有0AH功能写入实际接收字符个数,因此缓冲区大小应大于等于接收字符(包括回车键)个数+2。 出口参数:AL=按键的ASCII码 0BH号子功能:查询有无键盘输入,响应CTRL_C 入口参数:无 出口参数:AL=0,无输入;AL=FFH,有输入。 4CH号子功能