段描述符(GDT)
Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类

Linux中断技术、门描述符、IDT(中断描述符表)、异常控制技术总结归类相关学习资料《深⼊理解计算机系统(原书第2版)》.pdf/zh/%E4%B8%AD%E6%96%B7独辟蹊径品内核:Linux内核源代码导读李云华著中⽂ PDF版https:////orange_os/article/details/7485069/sunnybeike/article/details/6958473/di_yang@yeah/blog/static/861184922012124105030284//content/13/0829/21/7377734_310810291.shtm⽬录1. 从异常控制流开始说起2. 中断类型3. 中断的初始化4. 门描述符5. IDT中断描述符表6. 异常控制类型1. 从异常控制流开始说起0x1: 异常控制流简介从给处理器加电开始,知道断电为⽌,程序计数器假设⼀个值的序列:A0, A1, ...., An-1其中,每个Ak是某个相应的指令Ik的"地址"。
每次从Ak到Ak+1的过渡称为控制转移(control transfer)。
这样的控制转移序列叫作处理器的控制流(flow of control或control flow)控制流可以⼤致分为:1. "平滑的"序列(即顺序执⾏)其中每个Ik和Ik+1在存储器中都是相邻的,CPU按照计数器进⾏逐条指令的依次执⾏2. ⾮平滑控制流Ik+1与Ik不相邻,是由诸如跳转、调⽤、和返回这样⼀些程序指令造成的。
这样⼀些指令都是必要的机制,使得程序能够对由程序变量表⽰的内部状态中的变化做出反应。
但是系统也必须能够对系统状态变化做出反应,这些系统状态不是被内部程序变量捕获的,⽽且也不⼀定和程序的执⾏相关。
⽐如:但是系统也必须能够对系统状态变化做出反应,这些系统状态不是被内部程序变量捕获的,⽽且也不⼀定和程序的执⾏相关。
第4章指令系统层习题参考解答-汇编语言与计算机组成原理 答案

1.什么是“程序可见”的寄存器?程序可见寄存器是指在用户程序中用到的寄存器,它们由指令来指定。
2. 80x86微处理器的基本结构寄存器组包括那些寄存器?各有何用途?基本结构寄存器组按用途分为通用寄存器、专用寄存器和段寄存器3类。
通用寄存器存放操作数或用作地址指针;专用寄存器有EIP和EFLAGS,分别存放将要执行的下一条指令的偏移地址和条件码标志、控制标志和系统标志;段寄存器存放段基址或段选择子。
3.80x86微处理器标志寄存器中各标志位有什么意义?常用的7位:CF进位标志: 在进行算术运算时,如最高位(对字操作是第15位,对字节操作是第7位)产生进位或借位时,则CF置1;否则置0。
在移位类指令中,CF用来存放移出的代码(0或1)。
PF奇偶标志: 为机器中传送信息时可能产生的代码出错情况提供检验条件。
当操作结果的最低位字节中1的个数为偶数时置1,否则置0。
AF辅助进位标志: 在进行算术运算时,如低字节中低4位(第3位向第4位)产生进位或借位时,则AF置1;否则AF置0。
ZF零标志:如指令执行结果各位全为0时,则ZF置1;否则ZF置0。
SF符号标志:其值等于运算结果的最高位。
如果把指令执行结果看作带符号数,就是结果为负,SF置1;结果为正,SF置0。
OF溢出标志: 将参加算术运算的数看作带符号数,如运算结果超出补码表示数的范围N,即溢出时,则OF置1;否则OF置0。
DF方向标志: 用于串处理指令中控制处理信息的方向。
当DF位为1时,每次操作后使变址寄存器SI和DI减小;当DF位为0时,则使SI和DI增大,使串处理从低地址向高地址方向处理。
4.画出示意图,简述实模式下存储器寻址的过程。
20位物理地址如下计算(CPU中自动完成):10H×段基址+偏移地址=物理地址5. 画出示意图,简述保护模式下(无分页机制)存储器寻址的过程。
采用对用户程序透明的机制由选择子从描述子表中选择相应的描述子,得到欲访问段的段基址、段限等有关信息,再根据偏移地址访问目标存储单元。
段描述符(GDT)

段描述符(GDT)在8086中,段寄存器用来存放诸如代码段、数据段的段首址,再根据指令中的寻址方式计算出来的偏移量即可找到该指令或者数据在内存中的实际位置。
但在80386以后的系统中,因其寻址范围的扩大(段的基址需要32位长度,而不是8086的16位),段寄存器不再用来存储段基址,取而代之的是存储段选择符,而其基址由段描述符提供。
在段选择符中保存了段描述符在段描述符表中的偏移地址(段描述符统一存放在内存中的段描述符表中,以方便管理)。
本文旨对段描述符作简要介绍。
段描述符由两个双字即64位组成,用来提供段的基址、段长、段类型以及当前特权级等的信息。
下图为段描述符的结构图。
现将段描述符中各位的含义列表如下,以便读者能对段描述符有更清晰的理解。
①段是实现虚拟地址到线性地址转换机制的基础,在保护方式下,每个段由三个参数进行定义:段基地址,段界限,段属性。
段基地址规定线性地址空间中段的开始地址,段界限定义段的大小,段属性中有一位对此进行定义,把该位称为粒度位用G标记,G=0表示段界限以字节为单位,于是20位界限可表示的范围是1字节到1M字节,增量为1字节,G=1表示段界限以4K字节为单位,于是20位的界限可表示的范围程序说明:要读懂上面的程序,必需要对计算机如何存储信息有清楚的认识。
计算机存储信息时,将高字内容存放在高字节中,将低字内容存储在低字节中。
上而的程序的读法并不是按我们读数的顺序去读取,而是依次从低向高读取,这就对我们的解析造成了一字的麻烦,但仍然还是可以分析出来的。
下面以段属性为例进行说明。
查表可知决定该段描述符是属于系统段还是代码段的标志位于第一个双字的第12位,根据操作系统的存储特点,应该是放在偶数第二个字节中,而且是该字节的4位,故程序中有“TEST DL,40H”句进行判断。
下图为该程序的执行结果。
计算机系统基础:IA-32、Linux中的地址转换单元测试与答案

一、单选题1、对于IA-32中的指令“movl 8(%edx, %esi, 4), %edx”,若R[edx]=0000 01B6H,R[esi]=0000 0008H,其源操作数的有效地址EA是()。
A. 0000 01B6HB.0000 06E8HC.0000 01DEHD.0000 01F0H正确答案:C解析: C、源操作数的有效地址为R[edx]+R[esi]*4+8=0000 01B6H+00000008H*4+8=0000 01DEH。
2、以下是有关IA-32段页式虚拟存储管理方式的叙述,其中错误的是()。
A.进程的虚拟地址有48位逻辑地址和32位线性地址两种形式B.指令中隐含给出的32位有效地址就是32位段内偏移量C.32位线性地址构成的地址空间就是4GB主存地址空间D.逻辑地址由16位段选择符和32位段内偏移量组成正确答案:C解析: C、32位线性地址空间是4GB的虚拟地址空间,也就是可执行目标程序(即进程)所在的虚拟地址空间,需要对其进一步进行分页存储管理,访问指令和数据时,应根据页面和页框之间的映射关系进行线性地址到物理地址的转换。
3、以下是有关IA-32保护模式下地址转换过程的叙述,其中错误的是()。
A.地址转换前先计算出32位有效地址B.顺序为逻辑地址→线性地址→物理地址C.采用先分页、再分段的地址转换过程D.32位物理地址就是指32位主存地址正确答案:C解析: C、地址转换顺序是先通过分段方式将48位逻辑地址转换为32位线性地址,然后再通过分页方式将32位线性地址转换为32位物理地址。
4、以下有关IA-32段选择符的叙述中,错误的是()。
A.段选择符中的高13位为对应段表项的索引B.程序的代码段和数据段共用同一个段选择符C.段选择符存放在一个16位段寄存器中D. CS寄存器中RPL字段表示当前特权级CPL正确答案:B解析: B、IA-32中提供了多个段寄存器,如代码段寄存器CS、数据段寄存器DS、堆栈段寄存器SS等,它们可以分别存放代码段、数据段和堆栈段的段选择符。
虚拟机去虚拟化及检测技术攻防

虚拟机去虚拟化及检测技术攻防在当今信息安全领域,特别是恶意软件分析中,经常需要利用到虚拟机技术,以提高病毒分析过程的安全性以及硬件资源的节约性,因此它在恶意软件领域中是应用越来越来广泛。
这里我们所谓的虚拟机(Virtual Machine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。
通过虚拟机软件(比如VMware,Virtual PC ,VirtualBox),你可以在一台物理计算机上模拟出一台或多台虚拟的计算机,这些虚拟机完全就像真正的计算机那样进行工作,例如你可以安装操作系统、安装应用程序、访问网络资源等等。
攻击者为了提高恶意程序的隐蔽性以及破坏真实主机的成功率,他们都在恶意程序中加入检测虚拟机的代码,以判断程序所处的运行环境。
当发现程序处于虚拟机(特别是蜜罐系统)中时,它就会改变操作行为或者中断执行,以此提高反病毒人员分析恶意软件行为的难度。
本文主要针对基于Intel CPU的虚拟环境VMware中的Windows XP SP3系统进行检测分析,并列举出当前常见的几种虚拟机检测方法。
方法一:通过执行特权指令来检测虚拟机Vmware为真主机与虚拟机之间提供了相互沟通的通讯机制,它使用“IN”指令来读取特定端口的数据以进行两机通讯,但由于IN指令属于特权指令,在处于保护模式下的真机上执行此指令时,除非权限允许,否则将会触发类型为“EXCEPTION_PRIV_INSTRUCTION”的异常,而在虚拟机中并不会发生异常,在指定功能号0A(获取VMware版本)的情况下,它会在EBX中返回其版本号“VMXH”;而当功能号为0x14时,可用于获取 VMware内存大小,当大于0时则说明处于虚拟机中。
VMDetect正是利用前一种方法来检测VMware的存在,其检测代码分析如下:代码:bool IsInsideVMWare(){ bool rc = true; __try { __asm { push edx push ecx push ebx mov eax, 'VMXh' mov ebx, 0 // 将 ebx设置为非幻数’VMXH’的其它值mov ecx, 10 // 指定功能号,用于获取VMWare版本,当它为0x14时用于获取VMware内存大小mov edx, 'VX' // 端口号in eax, dx // 从端口dx读取 VMware版本到eax//若上面指定功能号为0x14时,可通过判断eax中的值是否大于0,若是则说明处于虚拟机中cmp ebx, 'VMXh' // 判断ebx中是否包含VMware版本’VMXh’,若是则在虚拟机中setz [rc] // 设置返回值pop ebx pop ecx po p edx } } __except(EXCEPTION_EXECUTE_HANDLER) // 如果未处于VMware中,则触发此异常{ rc = false; } return rc;}测试结果:图1如图1所示,VMDetect成功检测出VMWare的存在。
全局描述符表

全局描述符表全局描述符表 GDT(Global Descriptor Table)在Protected Mode 下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table)。
为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型:在Real Mode下,我们对一个内存地址的访问是通过Segment:Offset 的方式来进行的,其中Segment是一个段的Base Address,一个Segment 的最大长度是64 KB,这是16-bit系统所能表示的最大长度。
而Offset则是相对于此Segment Base Address的偏移量。
Base Address+Offset就是一个内存绝对地址。
由此,我们可以看出,一个段具备两个因素:Base Address和Limit(段的最大长度),而对一个内存地址的访问,则是需要指出两点:1.使用的是哪个段 2.相对于这个段Base Address的Offset,这个Offset应该小于此段的Limit。
当然对于16-bit系统,Limit不用指定,默认为最大长度64KB,而 16-bit的Offset也永远不可能大于此Limit。
我们在实际编程的时候,使用16-bit段寄存器CS(Code Segment),DS (Data Segment),SS(Stack Segment)来指定Segment,CPU将段寄存器中的数值向左偏移4-bit,放到20-bit的地址线上就成为20-bit的Base Address。
到了Protected Mode,内存的管理模式分为两种,段模式和页模式,其中页模式也是基于段模式的。
也就是说,Protected Mode的内存管理模式事实上是:纯段模式和段页式。
进一步说,段模式是必不可少的,而页模式则是可选的——如果使用页模式,则是段页式;否则这是纯段模式。
既然是这样,我们就先不去考虑页模式。
段页管理

段页管理机制声明:收集转载别人部分自己加工过内存管理分为两种方式:1分段管理逻辑地址->物理地址2段页管理逻辑地址->线性地址->物理地址(一)GDT与LDT保护模式下的段寄存器由 16位的选择器与 64位的段描述符寄存器构成段描述符寄存器:存储段描述符选择器:存储段描述符的索引(GDTR: 48b=32+16;LDTR: 16b)PS:原先实模式下的各个段寄存器作为保护模式下的段选择器,80486中有6个(即CS,SS,DS,ES,FS,GS)80位的段寄存器,同时提供6个段左右机器当前运行的地址空间。
由选择器CS对应表示的段仍为代码段,选择器SS对应表示的段仍为堆栈段(1)全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT 只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT 的入口地址装入此积存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。
GDTR中存放的是GDT在内存中的基地址和其表长界限。
(2)段选择子(Selector)由GDTR访问全局描述符表是通过“段选择子”(实模式下的段寄存器)来完成的,如图三①步。
段选择子是一个16位的寄存器(同实模式下的段寄存器相同)如图四段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。
他的index(描述符索引)部分表示所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符(如图三①步)。
然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址(如图三②步),段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。
嵌入式100题(77):中断怎么发生,中断处理大概流程

嵌⼊式100题(77):中断怎么发⽣,中断处理⼤概流程中断怎么发⽣,中断处理⼤概流程1. 中断概念:1. 中断是指由于接收到来⾃外围硬件(相对于中央处理器和内存)的异步信号或来⾃软件的同步信号,⽽进⾏相应的硬件/软件处理。
发出这样的信号称为进⾏中断请求(interrupt request,IRQ)。
硬件中断导致处理器通过⼀个上下⽂切换(context switch)来保存执⾏状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的⼀个指令,以可编程的⽅式直接指⽰这种上下⽂切换,并将处理导向⼀段中断处理代码。
中断在计算机多任务处理,尤其是实时系统中尤为有⽤。
这样的系统,包括运⾏于其上的操作系统,也被称为“中断驱动的”(interrupt-driven)。
2. 中断是⼀种使CPU中⽌正在执⾏的程序⽽转去处理特殊事件的操作,这些引起中断的事件称为中断源,它们可能是来⾃外设的输⼊输出请求,也可能是计算机的⼀些异常事故或其它内部原因。
3. 中断:在运⾏⼀个程序的过程中,断续地以“插⼊”⽅式执⾏⼀些完成特定处理功能的程序段,这种处理⽅式称为中断。
2. 中断的作⽤:1. 并⾏操作2. 硬件故障报警与处理3. ⽀持多道程序并发运⾏,提⾼计算机系统的运⾏效率4. ⽀持实时处理功能3. 术语: 按中断源进⾏分类:发出中断请求的设备称为中断源。
按中断源的不同,中断可分为:1. 内中断:即程序运⾏错误引起的中断2. 外中断:即由外部设备、接⼝卡引起的中断3. 软件中断:由写在程序中的语句引起的中断程序的执⾏,称为软件中断 允许/禁⽌(开/关)中断: CPU通过指令限制某些设备发出中断请求,称为屏蔽中断。
从CPU要不要接收中断即能不能限制某些中断发⽣的⾓度,中断可分为:1. 可屏蔽中断:可被CPU通过指令限制某些设备发出中断请求的中断,那是不是意味着进中断时disable整个中断,其实disable的都是可屏蔽中断?2. 不可屏蔽中断:不允许屏蔽的中断如电源掉电 中断允许触发器:在CPU内部设置⼀个中断允许触发器,只有该触发器置“1”,才允许中断;置“0”,不允许中断。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
段描述符(GDT)
在8086中,段寄存器用来存放诸如代码段、数据段的段首址,再根据指令中的寻址方式计算出来的偏移量即可找到该指令或者数据在内存中的实际位置。
但在80386以后的系统中,因其寻址范围的扩大(段的基址需要32位长度,而不是8086的16位),段寄存器不再用来存储段基址,取而代之的是存储段选择符,而其基址由段描述符提供。
在段选择符中保存了段描述符在段描述符表中的偏移地址(段描述符统一存放在内存中的段描述符表中,以方便管理)。
本文旨对段描述符作简要介绍。
段描述符由两个双字即64位组成,用来提供段的基址、段长、段类型以及当前特权级等的信息。
下图为段描述符的结构图。
现将段描述符中各位的含义列表如下,以便读者能对段描述符有更清晰的理解。
①段是实现虚拟地址到线性地址转换机制的基础,在保护方式下,每个段由三个参数进行定义:段基地址,段界限,段属性。
段基地址规定线性地址空间中段的开始地址,段界限定义段的大小,段属性中有一位对此进行定义,把该位称为粒度位用G标记,G=0表示段界限以字节为单位,于是20位界限可表示的范围是1字节到1M字节,增量为1字节,G=1表示段界限以4K字节为单位,于是20位的界限可表示的范围
程序说明:要读懂上面的程序,必需要对计算机如何存储信息有清楚的认识。
计算机存储信息时,将高字内容存放在高字节中,将低字内容存储在低字节中。
上而的程序的读法并不是按我们读数的顺序去读取,而是依次从低向高读取,这就对我们的解析造成了一字的麻烦,但仍然还是可以分析出来的。
下面以段属性为例进行说明。
查表可知决定该段描述符是属于系统段还是代码段的标志位于第一个双字的第12位,根据操作系统的存储特点,应该是放在偶数第二个字节中,而且是该字节的4位,故程序中有“TEST DL,40H”句进行判断。
下图为该程序的执行结果。