全部博文(436)
分类: LINUX
2013-02-27 19:05:55
Cpu控制单元:control unit(CU)
CPU部件之一。
其基本功能是从内存取指令、分析指令和执行指令。
实现一种或多种规律的或控制部件。
如:、。
功能
单元(control unit)负责程序的流程管理。正如工厂的物流分配部门,单元是整个CPU的指挥控制中心,由IR(Instruction Register)、ID(Instruction Decoder)和0C(Operation Controller)三个部件组成,对协调整个电脑有序工作极为重要。它根据用户预先编好的程序,依次从中取出各条指令,放在指令寄存器IR中,通过指令(分析)确定应该进行什么操作,然后通过OC,按确定的时序,向相应的部件发出微操作。OC中主要包括节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路和启停电路等控制逻辑。
中断和异常
IRQ:IRQ全称为Interrupt Request,即是“”的意思(以下使用IRQ称呼)。IRQ的作用就是在我们所用的电脑中,执行硬件的动作,比如我们需要读取硬盘中的一段数据时,当数据读取完毕,硬盘就通过IRQ来通知系统,相应的数据已经写到指定的内存中了。在每台电脑的系统中,是由一个中断控制器8259或是8259A的芯片(现在此芯片大都集成到其它的芯片内)来控制系统中每个硬件的中断控制。目前共有16组IRQ,去掉其中用来作的一组IRQ,实际上只有15组IRQ可供硬件调用。
1、 中断和异常的定义以及分类
中断通常被定义为改变处理器执行指令顺序的事件。这句话简单来说就是当CPU在执行一项任务时,来了一个事件,打乱CPU原先的指令执行顺序,不得不去先处理这个事件,这样的事件成为中断。
中断通常分为同步中断(异常)和异步中断(中断)
同步中断——指令执行时由CPU控制单元产生的,之所以称之为同步,是因为只有一条指令执行完毕后,CPU才会发出中断。
异步中断——是由其他硬件设备依照CPU时钟信号随机产生的。
中断和异常的针对对象: CPU芯片内部和外部的硬件电路产生的电信号。
中断和进程的区别:中断并不是进程,中断的上下文很少,建立或终止中断的时间很少。
Intel文档把中断和异常分为以下几类:
·中断:
可屏蔽中断(Maskable interrupt):
被送到处理器的INTR引脚。通过eflag寄存器的IF(可中断标志)标志关闭中断。所有I/O设备暗处的IRQ均可引起可屏蔽中断
不可屏蔽中断(Nonmaskable Interrupt)
被送到微处理器的NMI(Nonmaskable Interrupt)引脚。通过清IF标志,中断不能关闭。只有几个危急的事件,例如硬件故障才能引起补课评比行中断
·异常
处理器探测异常(Processor-detected exceptions)(CPU所探测到的一个反常条件产生的异常)通过CPU控制单元产生异常时保存在内核态堆栈段eip寄存器的值可以分为以下三种:
故障(Fault)
保存在eip中的值是引起故障的指令地址。因此当程序终止时,会重新执行那条指令。原因参见第7章
陷阱(Trap)
保存在eip中的地址是故障之前的一个指令的地址
异常结束(Abort)(软中断)
发生严重错误不能在寄存器中保存有意义的值
编程异常(Programmed exception)在编程者发出请求时发生,控制单元把异常当成陷阱来处理
2、 如何处理中断
中断处理必须满足的约束条件:
·当内核正打算去做一些其他的事情时,中断会随之到来。内核的首要任务是让中断尽可能快的被处理完,尽其所能把其他更多的处理推迟(这里的其他更多处理指的是中断的其他更多处理),以便能更快地回到原先的任务中去。为应答中断可以讲内核分为两部分:上半部分和下半部分,上半部分内核立即执行,下半部分留着稍后执行
3、 中断和异常向量
每个中断和异常是由0~255之间的一个数来标志。把这个8位的无符号数叫做一个向量
Linux用了一下向量:
·0~31的向量对应于异常和不可屏蔽中断
·32~到47的向量被分配给可屏蔽中断
·剩余的用来标志软中断
4、 CPU控制单元如何处理中断和异常
假定已经初始化,CPU在保护模式下运行。
执行完一条指令后,cs和eip这对寄存器包含下一条将要执行的指令的逻辑地址,控制单元在执行前一条指令时是否发生了一个中断和异常。如果发生了,控制单元将进行一下处理。
(1)确定中断或异常关联向量i
(2)读由idtr寄存器指向的IDT表中的第i项(假定IDT表中包含的是一个中断门或一个陷阱门)
(3)从gdtr寄存器获得GDT的基地址,并在GDT中查找,以读取IDT表项中的选择符所标识的段描述符。这个描述符指定了中断或异常处理程序所在的段的基地址。
(4)确信中断是由被授权的发生源发出的。首先,比较当前特权级CPL(存放在cs寄存器的低两位)与段描述符(存放在GDT)描述符特权级比较,如果CPL小于DPL,就产生一个“一般性保护”异常,因为中断处理程序的特权不能小于引起中断程序的特权。对于编程异常进行以下检查:比较CPL与处于IDT中的门描述符的DPL,如果DPL小于CPL则产生一个“一般性保护”异常。最后一个检查的作用是避免用户的应用程序访问特殊的陷阱门或中断门。
(5)检查是否发生了特权级的变化(即CPL是否不同于所选择的段描述符的DPL)如果是,控制单元必须开始使用与新的特权级相关的栈。方法:
(一)读tr寄存器,以访问当前进程的TSS段。
(二)用与新特权级相关的栈段和栈指针的正确值装载ss和esp寄存器,这些值可以再TSS中找到(参见第三章“任务状态段”一节)
(三)在新的栈中保存ss和esp以前的值,这些值定义了与旧特权级相关的栈的逻辑地址
(6)如果故障已经发生,用引起故障的指令地址装载cs和eip寄存器,从而使这条指令能够再次被执行
(7)在战中保存eflag,cs以及eip的内容
(8)如果一场产生了一个硬件错误码,则将它保存在栈中
(9)装载cs和eip寄存器,其值分别是IDT表中第i项门描述符段选择符合偏移量域。这些值给出了中断或异常处理程序的第一条指令的逻辑地址
最后控制单元跳转到中断或异常处理程序。
中断或异常被处理完后,相应的程序必须产生一条iret指令把控制权转交给被中断的进程,这将迫使控制单元:
(1)用保存在栈中的值装载cs,eip,或eflag寄存器。如果一个硬件错误码曾被压入栈中,并在eip内容上面,那么,执行iret(中断返回)指令前必须先弹出这个硬件错误码
(2)检查处理程序的CPL是否等于cs中最低两位的值(这意味着被中断的进程和处理程序运行在同一特权级),如果是,iret终止执行;否则转入下一步。
(3)从栈中装载ss和esp寄存器,因此,返回到与旧特权级相关的栈
(4)检查ds,es,fs及gs段寄存器的内容,如果其中一个寄存器包含的选择符是一个段描述符,并且DPL值小于CPL,那么,清相应的段寄存器控制单元这么做是为了禁止用户态的程序(CPL=3)利用内核以前所用的段寄存器(DPL=0)。如果不请这些寄存器,怀有恶意的用户程序就可能利用他们来访问地址空间
5、 初始化中断描述符表(IDT)
为了防止用户通过int指令模拟非法的中断和异常,IDT的初始化要非常小心,可以通过吧中断或陷阱门描述符的DPL域设置成0来实现,如果进程试图发出这样的一个中断信号,控制单元将检查出CPL的值与DPL域有冲突并且发布一个“一般保护性”异常。但是在少数情况下,用户进程必须能发出一个编程异常,可以将中断或陷阱门描述符的DPL域设置成3,即特权级尽可能一样高。
在linux中是如何实现的?
Intel提供了三种中断描述符:任务门,中断门及陷阱门描述符。任务门描述符与Linux无关,linux的中断描述符分类如下: