什么是异常/中断,在ubuntu 14 ia32 libs中,两者的关系如何

ia32模式指什么?介绍下_百度知道
ia32模式指什么?介绍下
我有更好的答案
按默认排序
一直反对Intel在自己的CPU内放这么一个玩意,就连正在进行中的I&#47。而触发SMI的唯一方法是将前述的SMI Pin引脚上加一个物理电平。可以通过设置SMBASE的寄存器来设置SMRAM的空间:如何退出。那就是执行RSM指令,用于探测是否处于一个I&#47SMM 。那么透明是如何做到的呢。并自动的将CPU设置成进入SMM之前的执行模式,如果有SMI到来: 完全透明 SMM的进入与退出对非SMM软件(如操作系统)而言,Intel在其CPU上新增了一个引脚SMI# Pin。这使得跟踪SMM的执行变得异常困难: 固件ONLY SMM如此强大。对于操作系统而言。SMM模式下的执行的程序被称作SMM处理程序。SMM模式对操作系统透明,什么时候会退出,一旦设置成锁定状态。并且SMM中断是如此的霸道,CPU会进入该模式,那么CPU也必须暂停I&#47:幽灵搬移。系统管理模式只能通过系统管理中断(System Management IO? 退出SMM的方法也只是一个。于是一些被折磨的难受的程序员就给SMM的这个feature起了个有趣的名字: 如何进入。 SMM 。而退出的时候。于是SMM内提供了一个手段,也许每次进入SMM的执行的入口地址都会不一样,由CPU自己主动的将当前的全部寄存器以及其他的任何需要保存的信息(公开的和不公开的全部保存)保存在之前体积的SMRAM的某个地方,包括所有的中断: 执行环境 SMM的执行环境与实模式与保护模式都不同,那么后果将不可想象,所有的SMM处理程序只能在称作系统管理内存(System Management RAM。系统完全执行在自然环境下。SMM下可以执行一切特权指令: 幽灵搬移 SMM程序可以重新定位SMRAM, SMI)进入,SMM从来没有存在过。在SMM模式下一切被都屏蔽。 SMM 。然后返回中断的地方继续执行程序;O Trap状态,也无法感知SMM模式曾经执行过。SMM模式下系统没有分页与分段支持。于是Intel规定SMM程序只能由系统固件使用。SMM处理程序只能由系统固件实现,也即是系统管理中断(System Management Interrupt),CPU可以寻址4GB的空间;O操作。 SMM ,换句话说。而这个电平是由系统chipset根据不同的物理执行环境(如某些事件到来。 SMM ,并只能通过执行RSM指令推出。固件会在每次启动操作系统之前。 SMM 。并且一切内存保护均失效。然后直接跳转到SMRAM内的某一个入口地址开始执行,所有的地址都是物理地址。换言之,是完全透明的,SMM是对系统进行监控的终极方法,SMRAM)的空间内运行,操作系统根本不知道系统何时进入SMM模式。从某种意义上说。CPU见到这个指令? 进入SMM的唯一方法就是通过SMI。操作系统根本不知道什么时候系统会进入SMM,可以说是IA32架构内的真正的无上霸主。如果这个特性被恶意代码利用。为了实现SMM,CPU会恢复所有事先保存的信息,没有逻辑地址与物理地址的区别? SMM会在进入之前。 SMM ,当这个引脚上为高电平的时候,那么任何程序都不可能将自己设置成SMM处理程序了,锁死SMM,就退出SMM。换言之: 概述 SMM是Intel在386SL之后引入x86体系结构的一种CPU的执行模式。系统内有个SMM Lock Register。或者说。故而被中断的程序根本无法感知,转发进入SMM。微软为了自己的利益,某些设备需要特别服务)加到CPU上去的
其他类似问题
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁IA32寄存器
IA32寄存器
IA32作为80x86系列中的一员,必须保证向后兼容,也就是说,既要支持16位的处理器,也要支持32位的处理器。在8086中,所有的寄存器都是16位的,下面我们来看一下IA32中寄存器有何变化:
把16位的通用寄存器、标志寄存器以及指令指针寄存器扩充为32位的寄存器
段寄存器仍然为16位。
增加4个32位的控制寄存器
增加4个系统地址寄存器
增加8个调式寄存器
增加2个测试寄存器
1、通用寄存器
8个通用寄存器是8086寄存器的超集,它们的名称和用途分别为:
EAX 一般用作累加器
EBX 一般用作基址寄存器(Base)
ECX 一般用来计数(Count)
EDX 一般用来存放数据(Data)
EBP 一般用作堆栈指针(Stack Pointer)
EBP 一般用作基址指针(Base Pointer)
ESI 一般用作源变址(Source Index)
EDI 一般用作目标变址(Destinatin Index)
8个通用寄存器中通常保存32位数据,但为了进行16位的操作并与16为机保持兼容,它们的低位部分被当成8个16位的寄存器,即AX、BX…DI。为了支持8位的操作,还进一步把EAX、EBX、ECX、EDX这四个寄存器低位部分的16位,再分为8位一组的高位字节和低位字节两部分,作为8个8位寄存器。这8个寄存器分别被命名为AH、BH、CH、DH和AL、BL、CL、DL。对8位或16位寄存器的操作只影响相应的寄存器。例如,在做8位加法运算时,位7的进位并不传给目的寄存器的位9,而是把标志寄存器中的进位标志(CF)置位。因此,这8个通用寄存器既可以支持1位、8位、16位和32位数据运算,也支持16位和32位存储器寻址。
2、段寄存器
8086中有4个16位的段寄存器:CS、DS、SS、ES,分别用于存放可执行代码的代码段、数据段、堆栈段和其他段的基地址。在IA32中,有6个16位的段寄存器,但是,这些段寄存器中存放的不再是某个段的基地址,而是某个段的选择符(Selector)。因为16位的寄存器无法存放32位的段基地址,段基地址只好存放在一个叫做描述符表(Descriptor)的表中。因此,在IA32中,我们把段寄存器叫做选择符。下面给出6个段寄存器的名称和用途:
CS 代码段寄存器
DS 数据段寄存器
SS 堆栈段寄存器
ES、FS及GS 附加数据段寄存器
3、状态和控制寄存器
状态和控制寄存器是由标志寄存器EFLAGS、指令指针EIP和4个控制寄存器组成:EFLAGS 标志寄存器
EIP 指令指针
CR0 机器状态字
CR1 Intel保留
CR2 页故障地址
CR3 页目录地址
3.1、指令指针寄存器和标志寄存器
指令指针寄存器EIP中存放下一条将要执行指令的偏移量(offset
),这个偏移量是相对于目前正在运行的代码段寄存器CS而言的。偏移量加上当前代码段的基地址,就形成了下一条指令的地址。EIP中的低16位可以分开来进行访问,给它起名叫指令指针IP寄存器,用于16位寻址。
标志寄存器EFLAGS存放有关处理器的控制标志,标志寄存器中的第1、3、5、15位及18~31位都没有定义。
EFLAGS(32位):
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 VM RF 0 NT IOPL OF DF IF TF SF ZF 0
AF 0 PF 0 CF
VM&虚拟方式
RF 恢复方式
NT 嵌套方式
IOPL I/O特权
OF 溢出标志
DF 定向标志
IF 允许中断标志
TF 自陷标志
SF 符号标志
AF 辅助进位
PF 奇偶标志
CF 进位标志
在这些标志位中,我们只介绍在Linux内核代码中常用且重要的几个标志位:
第8位TF(Trap
Flag)是自陷标志,当将其置1时则可以进行单步执行。当指令执行完后,就可能产生异常1的自陷。也就是说,在程序的执行过程中,每执行完一条指令,都要由异常1处理程序
(在Linux内核中叫做debug())进行检验。当将第8位清0后,且将断点地址装入调试寄存器DR0~DR3时,才会产生异常1的自陷。
第12、13位IOPL是输入输出特权级位,这是保护模式下要使用的两个标志位。由于输入输出特权级标志共两位,它的取值范围只可能是0、1、2和3共4个值,恰好与输入输出特权级0~3级相对应。但Linux内核只使用了两个级别,即0和3级,0表示内核级,3表示用户级。在当前任务的特权级CPL(Current
Level,CS段寄存器的一个两位字段,用以指明CPU的当前特权级)高于或等于输入输出特权级时,就可以执行像IN、OUT、INS、OUTS、STI、CLI和LOCK等指令而不会产生异常13(即保护异常)。在当前任务特权级CPL为0时,POPF(从栈中弹出至标志位)指令和中断返回指令IRET可以改变IOPL字段的值。
第9 位IF(Interrupt
Flag)是中断标志位,是用来表示允许或者禁止外部中断。若第9位IF被置为1,则允许CPU接收外部中断请求信号;若将IF位清0,则表示禁止外部中断。在保护模式下,只有当第12、13位指出当前CPL为最高特权级时,才允许将新值置入标志寄存器EFLAGS以改变IF位的值。
第10位DF(Direction
Flag)是定向标志。DF位规定了在执行串操作的过程中,对源变址寄存器ESI或目标变址寄存器EDI是增值还是减值。如果DF为1,则寄存器减值;若DF为0,则寄存器值增加。
第14位NT是嵌套任务标志位。在保护模式下常使用这个标志。当IA32在发生中断和执行CALL指令时就有可能引起任务切换。若是由于中断或由于执行CALL指令而出现了任务切换,则将NT置为1。若没有任务切换,则将NT位清0。
第17位VM (Virtual 8086 Mode
Flag)是虚拟8086方式标志,是IA32新设置的一个标志位。表示IA32CPU是在虚拟8086环境中运行。如果IA32CPU是在保护模式下运行,而VM为又被置成1,这时IA32
就转换成虚拟8086
操作方式,使全部段操作就像是在8086CPU上运行一样。VM位只能由两种方式中的一种方式给予设置,即或者是在保护模式下,由最高特权级(0)级代码段的中断返回指令IRET设置,或者是由任务转换进行设置。Linux内核实现了虚拟8086方式,但在本书中我们不准备对此进行详细讨论。
从上面的介绍可以看出,要正确理解标志寄存器EFLAGS的各个标志需要很多相关的知识,有些内容在本章的后续部分还会涉及到。在后面的章节中,你会体会如何灵活应用这些标志。
3.2、控制寄存器
状态和控制寄存器组除了EFLAGS、EIP
,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3。现在我们详细看看它们的结构。
CR0(32位寄存器):
PG 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ET TS EM MP
PG 分页允许
ET 处理器扩展
TS 任务转换
EM 模拟协处理器
MP 监控协处理器
PE 保护允许
CR1(32位寄存器)
CR2(32位寄存器):页故障线性地址寄存器
CR3(32位寄存器):
页目录基址寄存器 0 0 0 0 0 0 0 0 0 0 0 0
这几个寄存器中保存全局性和任务无关的机器状态。CR0中包含了6个预定义标志,0位是保护允许位PE(Protedted
Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。1位是监控协处理位MP(Moniter
coprocessor),它与第3位一起决定:当TS=1时操作码WAIT是否产生一个“协处理器不能使用”的出错信号。第3位是任务转换位(Task
Switch),当一个任务转换完成之后,自动将它置1。随着TS=1,就不能使用协处理器。CR0的第2位是模拟协处理器位EM
coprocessor),如果EM=1,则不能使用协处理器,如果EM=0,则允许使用协处理器。第4位是微处理器的扩展类型位ET(Processor
Extension Type),其内保存着处理器扩展类型的信息,如果ET=0,则标识系统使用的是287协处理器,如果
ET=1,则表示系统使用的是387浮点协处理器。CR0的第31位是分页允许位(Paging
Enable),它表示芯片上的分页部件是否允许工作。由PG位和PE位定义的操作方式:
PG&PE&方式
0&0&实模式,8086操作
0&1&保护模式,但不允许分页
1&1&允许分页的保护模式
CR1是未定义的控制寄存器,供将来的处理器使用。
CR2是页故障线性地址寄存器,保存最后一次出现页故障的全32位线性地址。
CR3是页目录基址寄存器,保存页目录表的物理地址,页目录表总是放在以4K字节为单位的存储器边界上,因此,它的地址的低12位总为0,不起作用,即使写上内容,也不会被理会。
这几个寄存器是与分页机制密切相关的,因此,在进程管理及虚拟内存管理中会涉及到这几个寄存器,读者要记住CR0、CR2及CR3这三个寄存器的内容。
4、系统地址寄存器
IA32有4个系统地址寄存器,它保存操作系统要保护的信息和地址转换表信息:
这4个专用寄存器用于引用在保护模式下所需要的表和段,它们的名称和作用如下:
全局描述符表寄存器GDTR(Global Descriptor Table Register
),是48位寄存器,用来保存全局描述符表(GDT)的32位基地址和16为GDT的界限。
中断描述符表寄存器IDTR(Interrupt Descriptor Table
Register),是48位寄存器,用来保存中断描述符表(IDT)的32位基地址和16为IDT的界限。
局部描述符表寄存器LDTR(Global Descriptor Table Register
),是16位寄存器,保存局部描述符表LDT段的选择符。
任务状态寄存器TR(Task State Register)是16位寄存器,用于保存任务状态段TSS段的16位选择符。
用以上4个寄存器给目前正在执行的任务(或进程)定义任务环境、地址空间和中断向量空间。有关全局描述符表GST、中断描述符表IDT、局部描述符表LDT及任务状态段TSS
的具体内容将在稍后进行详细描述。
5、调试寄存器和测试寄存器
5.1、调试寄存器
IA32为调试提供了硬件支撑。在IA32芯片内有8个32位的调试寄存器DR0~DR7。这些寄存器可以使系统程序设计人员定义4个断点,用它们可以规定指令执行和数据读写的任何组合。DR0~DR3是线性断点地址寄存器,其中保存着4个断点地址。DR5、DR6是两个备用的调试寄存器,目前尚未定义。DR6是断点状态寄存器,其低序位是指示符位,当允许故障调试并检查出故障而进入异常调试处理程序(debug())时,由硬件把指示符位置1,调试异常处理程序在退出之前必须把这几位清0。DR7是断点控制寄存器,它的高序半个字又被分为4个字段,用来规定断点字段的长度是1个字节、2个字节、4个字节及规定将引起断点的访问类型。低序半个字的位字段用于“允许”断点和“允许”所选择的调试条件。
5.2、测试寄存器
IA32 有两个32 位的测试寄存器TR6 和TR7。这两个寄存器用于在转换旁视缓冲器(Translation Lookaside
Buffer) 中测试随机存储器(RAM)
和相联存储器(CAM)。TR6是测试命令寄存器,其内存放测试控制命令。TR7是数据寄存器,其内保存转换旁路缓冲器测试的数据。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 ubuntu 14 ia32 libs 的文章

 

随机推荐