idt

IDT系统中断描述表以及绕过Xurtr检测的HOOK姿势

笑着哭i 提交于 2020-01-14 08:22:17
什么是中断? 指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。 比如:除零(0号中断)、断点(3号中断)、系统调用(2e号中断)、以及异常处理等都会引发中断,所以自然需要相应的中断例程去进行处理。 这样操作系统就会用数据结构来维护这些中断例程,这个数据结构就是IDT(Interrupt Descriptor Table)。 中断描述表 IDT表的长度与地址是由CPU的IDTR寄存器来描述的。IDTR寄存器共有48位,高32位是IDT表的基地址,低16位是IDT的长度。 typedef struct _IDTR{ USHORT IDT_limit; USHORT IDT_LOWbase; USHORT IDT_HIGbase; }IDTR,*PIDTR; IDTR idtr; __asm SIDT idtr; 可以通过以上SIDT指令可以读取IDTR寄存器。然后通过MAKEWORD宏把高位与地位组合起来就可以获得IDT表的基地址了。 简单来说,IDT表是一张位于物理内存的线性表,共有256个表项。在32位模式下,每个IDT表项的长度是8个字节(64 bit),IDT表的总长度是2048字节。 kd> r idtr idtr

IDT 中断描述符表

≡放荡痞女 提交于 2020-01-08 00:44:52
中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。与GDT不同的是,表中第1项可以包含描述符。为了构成IDT表中的一个索引值,处理器把异常或中断的向量号乘以8。因为最多只有256个中断或异常向量,所以IDT无需包含多于256个描述符。IDT中可以含有少于256个描述符,因为只有可能发生的异常或中断才需要描述符。不过IDT中所有空描述符项应该设置其存在位(标志)为0。 IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。这个寄存器中含有IDT表32位的基地址和16位的长度(限长)值。IDT表基地址应该对齐在8字节边界上以提高处理器的访问效率。限长值是以字节为单位的IDT表的长度。 中断描述符表IDT和寄存器IDTR LIDT和SIDT指令分别用于加载和保存IDTR寄存器的内容。LIDT指令用于把内存中的限长值和基地址操作数加载到IDTR寄存器中。该指令仅能由当前 特权级 CPL 是0的代码执行,通常被用于创建IDT时的操作 系统初始化 代码中。SIDT指令用于把IDTR中的基地址和限长内容复制到内存中。该指令可在任何特权级上执行。   如果中断或异常向量引用的描述符超过了IDT的界限

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表示,称为 中断向量 。一个中断向量的值由引发中断的源决定,不同的设备

IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表

ぐ巨炮叔叔 提交于 2020-01-04 14:29:33
原文: IDT系列:(一)初探IDT,Interrupt Descriptor Table,中断描述符表 IDT,Interrupt Descriptor Table,中断描述符表是CPU用来处理中断和程序异常的。 一、有关IDT的基本知识 1、中断时一种机制,用来处理硬件需要向CPU输入信息的情况。 比如鼠标,键盘等。 2、中断和异常的产生是随机的,在CPU正常运行过程中随时可能产生。CPU的中断处理机制 3、中断可以由硬件产生(称为外部中断),也可以由软件产生(称为内部中断),在程序中写入int n指令可以产生n号中断和异常(n从0-ffh)。 4、同时CPU的中断异常机制还是重要特性的支持原理,比如程序调试,程序运行过程中的异常处理(如零除数异常、内存分页错误等)。 5、早期的操作系统甚至是通过中断来进行内核调用的。int指令是一种c从ring3 进入ring 0的方法。比如windows在xp版本之前使用的int 2e。在x86 CPU提供了sysenter指令后,这种方式才被放弃。 6、每一种中断对应一个中断号。CPU执行中断指令时,会去IDT表中查找对应的中断服务程序(interrupt service routine ,ISR)。ISR(为了表述方便后面用ISR n表示n号中断的处理程序),x86CPU最大可以支持256种中断。 7、中断是CPU的机制

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

IDT系统中断描述表以及绕过Xurtr检测的HOOK姿势

半城伤御伤魂 提交于 2019-12-17 10:49:01
什么是中断? 指当出现需要时,CPU暂时停止当前程序的执行转而执行处理新情况的程序和执行过程。即在程序运行过程中,系统出现了一个必须由CPU立即处理的情况,此时,CPU暂时中止程序的执行转而处理这个新的情况的过程就叫做中断。 比如:除零(0号中断)、断点(3号中断)、系统调用(2e号中断)、以及异常处理等都会引发中断,所以自然需要相应的中断例程去进行处理。 这样操作系统就会用数据结构来维护这些中断例程,这个数据结构就是IDT(Interrupt Descriptor Table)。 中断描述表 IDT表的长度与地址是由CPU的IDTR寄存器来描述的。IDTR寄存器共有48位,高32位是IDT表的基地址,低16位是IDT的长度。 typedef struct _IDTR{ USHORT IDT_limit; USHORT IDT_LOWbase; USHORT IDT_HIGbase; }IDTR,*PIDTR; IDTR idtr; __asm SIDT idtr; 可以通过以上SIDT指令可以读取IDTR寄存器。然后通过MAKEWORD宏把高位与地位组合起来就可以获得IDT表的基地址了。 简单来说,IDT表是一张位于物理内存的线性表,共有256个表项。在32位模式下,每个IDT表项的长度是8个字节(64 bit),IDT表的总长度是2048字节。 kd> r idtr idtr

IDT 中断描述符表

拜拜、爱过 提交于 2019-12-09 13:58:52
中断描述符表(Interrupt Descriptor Table,IDT)将每个异常或中断向量分别与它们的处理过程联系起来。与GDT和LDT表类似,IDT也是由8字节长描述符组成的一个数组。与GDT不同的是,表中第1项可以包含描述符。为了构成IDT表中的一个索引值,处理器把异常或中断的向量号乘以8。因为最多只有256个中断或异常向量,所以IDT无需包含多于256个描述符。IDT中可以含有少于256个描述符,因为只有可能发生的异常或中断才需要描述符。不过IDT中所有空描述符项应该设置其存在位(标志)为0。 IDT表可以驻留在线性地址空间的任何地方,处理器使用IDTR寄存器来定位IDT表的位置。这个寄存器中含有IDT表32位的基地址和16位的长度(限长)值。IDT表基地址应该对齐在8字节边界上以提高处理器的访问效率。限长值是以字节为单位的IDT表的长度。 中断描述符表IDT和寄存器IDTR LIDT和SIDT指令分别用于加载和保存IDTR寄存器的内容。LIDT指令用于把内存中的限长值和基地址操作数加载到IDTR寄存器中。该指令仅能由当前 特权级 CPL 是0的代码执行,通常被用于创建IDT时的操作 系统初始化 代码中。SIDT指令用于把IDTR中的基地址和限长内容复制到内存中。该指令可在任何特权级上执行。   如果中断或异常向量引用的描述符超过了IDT的界限

Bran的内核开发教程(bkerndev)-08 中断服务程序(ISR)

牧云@^-^@ 提交于 2019-12-05 14:33:20
中断服务程序(ISR)   中断服务程序(ISR)用于保存当前处理器的状态, 并在调用内核的C级中断处理程序之前正确设置内核模式所需的段寄存器。而工作只需要15到20行汇编代码来处理, 包括调用C中的处理程序。我们还需要将IDT条目指向正确的ISR以正确处理异常。   异常是导致处理器无法正常执行的特殊情况, 比如除以0结果是未知数或者非实数, 因此处理器会抛出异常, 这样内核就可以阻止进程或任务引起任何问题。如果处理器发现程序正尝试访问不允许其访问的内存, 则会引起一般保护错误。当你设置内存页时, 处理器将会产生页面错误, 但这是可以恢复的: 你可以将内存页映射到错误的地址(但这需要另开一篇教程来讲解)。   IDT的前32个条目与处理器可能产生的异常对应, 因此需要对其进行处理。某些异常会将另一个值压入堆栈中: 错误代码, 该值为每个异常的特定代码。 Exception # Description Error Code? 0 Division By Zero Exception No 1 Debug Exception No 2 Non Maskable Interrupt Exception No 3 Breakpoint Exception No 4 Into Detected Overflow Exception No 5 Out of Bounds Exception

Statically Defined IDT

匿名 (未验证) 提交于 2019-12-03 08:44:33
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试): 由 翻译 强力驱动 问题: I'm working on a project that has tight boot time requirements. The targeted architecture is an IA-32 based processor running in 32 bit protected mode. One of the areas identified that can be improved is that the current system dynamically initializes the processor's IDT (interrupt descriptor table). Since we don't have any plug-and-play devices and the system is relatively static, I want to be able to use a statically built IDT. However, this proving to be troublesome for the IA-32 arch since the 8 byte interrupt gate descriptors