资源预览内容
第1页 / 共37页
第2页 / 共37页
第3页 / 共37页
第4页 / 共37页
第5页 / 共37页
第6页 / 共37页
第7页 / 共37页
第8页 / 共37页
第9页 / 共37页
第10页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
Linux0.11的中断处理过程和系统调用,本讲内容,中断机制 特权级 系统调用机制,中断机制,中断机制,中断种类 数据结构 中断的设置,中断种类,数据结构,中断的设置,特权级 Cpl、dpl、rpl 特权级之间的转移 特权级和堆栈,进程的核心态和用户态,在80386中,有4个特权级:特权级0,1,2,3,每一个段(码段、数据段或堆栈段)都处在一个特定的特权级(由段描述符中的DPL决定)unix系统通常把UNIX核心放在最高特权级0。而把用户进程放在最低特权级3。根据80386的特权规则,工作在特权级的操作系统核心代码,可以访问任务中处在所有不同特权级上的每一个段;而工作在特权级3上的用户进程的码段,只能访问也处在特权级3的自身的数据段及堆栈段.(自注:核心代码何时要访问用户进程的代码?规则不允许高调用低,但可以访问数据段,特权级主要还是用来提供用户态代码调用核心态代码的安全访问的) 综上所述,工作在80386硬件上的unix系统,用特权级区分核心态和用户态.实现在同一进程内的用户程序与核心程序的相互隔离和保护;用每一个进程(任务)有自己的ldt和页表,从而有不同的地址空间,实现进程(任务)之间的隔离和保护.,一、80386特权级规则 80386为了支持多用户、多任务的操作系统,为了使操作系统程序和用户程序之间的隔离和保护,提供了一个具有4个特权级的特权机制。利用这个特权机制,控制了特权指令和I/O指令的使用,并控制了对段和段描述符的访问。 在80386中,有4个特权级:特权级0,1,2,3,每一个段(码段、数据段或堆栈段)都处在一个特定的特权级(由段描述符中的DPL决定),正在执行的码有一个特权级称为当前特权级CPL (Current Privilege Level ),它取决于正在执行的码的码段寄存器CS的最后两位。处在当前特权级的执行码,要访问存储器段,或要实现控制转移时,就要遵循一定的特殊规则: 1、特权级为P的段中存储的数据,只能由特权高于或等于P(数值上小于或等于P)的段中的执行码来访问。 第一条规则是规定了数据的访问,即特权级高的程序可以访间特权级低(或相等)的数据,反之是不允许的。也就是说,工作在用户态(特权级3)的用户程序,只能访间在用户态特权级的数据,不允许访间存放在核心态(特权级0)的系统数据。这样,对系统管理十分重要的一些核心表格,例如进程表,页表,放在特权级D,只能由核心码段访问,用户程序就不会破坏(无意地或有意地)破坏这些数据。,2、具有特权级P的码段/过程(函数),只能由在低于或等于P(数值上大于或等于P)的恃权级下执行的任务调用。 第二条规则是规定了不同特权级之间的控制转移,即只能由特权级低的程序调用特权级高的码段(当然要通过调用门).反之是不允许的。这样的规定是符合多用户操作系统的实际情况下,通常只会由用户程序(特权级低)需要调用操作系统的核心(特权级高)以提供支持,而不会出现操作系统核心需要调用用户程序以得到用户的帮助这样的情况。这条规则,当系统初启,经过初始化(在核心态运行)要转至用户态,控制、管理用户登录及分派用户程序运行时就发生了困难。为此,系统中也安排了由特权级高的核心分派特权级低的用户程序运行的方法(具体方法我们在后面分析)。,二、系统中的各种特权级 任务特权 在任何时候,80386中的一个任务总是在4个特权级之一下运行,任务在特定时刻的特权级,称为当前特权级CPL,它是由当前正在执行的码的码段寄存器CS的最低两位决定的。当任务在用户态执行时,执行的是用户程序的码段,它的当前特权级就为3;而当任务因各种原因(中断、异常或系统调用)进入核心态,执行的是操作系统核心的码段,则它的当前特权级就为0. 通常,当一个任务由系统的任务转换操作(操作系统的进程调度任务)启动时,它就在由代码段寄存器(CS )所规定的CPL值所规定的特权级(通常为特权级3)上执行,一个任务的当前特权级CPL是不能随意改变的,只有在系统发生了中断或异常,或任务中通过调用门实现控制转移时才能改变。 描述符特权 80386中的每一个存储段都与一定的特权级相联系,每一个存储段的访问都要通过它的描述符。每一个描述符的访问权字节中,都有两位规定了此描述符的特权级DPL(Descriptor Privilege Level) 。DPL规定了可以访问该描述符的任务的最低特权级,也即CPL值的最高界限。换句话说,只有满足条件CPL=DPL (数值)时,当前的任务才可以访问该描述符。显然。具有DPL=0的描述符,受到最大的保护,只有在特权级0执行的任务,才能访问它们;具有DPL=3的描述符,受到最少的保护(即具有最少的访问限制),因为工作在特权级0,1,2,3上的任何任务,都可以访问它们。除了LDT描述符(该描述符的DPL字段没有意义)外,这个规则适用于所有的描述符。,选择子特权 一个选择子的特权,是由它的最低两位即请求特权级RPL (Request Privilege Level)字段所确定的。一个具有当前特权级CPL的任务,要访问某一个段,就要通过一个选择子以寻找此段的描述符。如前所述,段描述符中包含了此段的32位基地址、20位的段界限(还包括粒度位G)以及此段的访问权字节(包括此段的DPL) ,80386对这样的访问要进行特权检查,现在有三个特权级,即任务的当前特权级CPL、选择子的请求特权级RPL和描述符特权级DPL ,检查应如何进行呢?选择子的RPL的存在,建立了一个等于或低于任务的当前特权级的特权级,称为任务的有效特权级EPL(Effective Privi-lege Level,它取RPL和CPL中的较大值,即EPL = max (CPL ,RPL )。具有RPL = 0的选择子,在使用上没有附加特权的限制,而具有RPL = 3的选择子,附加了最大的特权限制,不管任务的CPL是什么,EPL都为3,就只能访问特权级为3的段。在附加了RPL后的描述符的访问条件为: EPL=max(GPL,RPL)IOPL时,执行I/O指令就会引起异常(可以用I/O位图来超越)。,三、控制转移 1.同一特权级内的控制转移 这种转移可以通过JMP,CALL或RET指令来实现,由于是段间转移,所以指令中要使用48位的全偏移量,即16位的目标段选择子、32位的入口偏移量。目标段选择子的RPL、对应的描述符的DPL和当前特权级CPL应该都是相等的,目标段描述符的存在位应是1这样就能实现控制转移:用目标段选择子加载CS寄存器,用目标的入口偏移量加载EIP寄存器(若是CALL指令,则在加载前先保留主调程序的CS和EIP.)由于是在同一任务内的同一特权级的控制转移,所以堆栈指针(SS和ESP)不发生变化.进程还可以转移到DPL=CPL,且是一个存在的、一致的可执行代码段。 一致的可执行段,是一种特别的存储器段。这种存储器段,为在多个特权级执行的程序,提供对子例程的共享支持,而不要求改变特权级。例如,通过把数值库例程放在一致的码段中,可以使不同级执行的程序共享数值库例程。这时,任何特权级的程序,可以使用段间调用指令,调用库中的例程,并在调用者具有的特权级执行该例程。 转移到一致的代码段的控制转移,将在调用者所在特权级执行;而不是在一致的代码段中,由DPL所表示的特权级执行。在一致的代码段中的DPL,用来规定可以转移到一致的代码段的最内层特权级.DPL的这种解释,正好与正常的DPL的解释相反;正常情况下,DPL用来规定允许访问一个段的最外层特权级。一致的码段用DPL规定允许转移到的最内层的特权级,这就意味着,3级的程序可以转移到任何一致码段,而0级例程只允许转移到DPL= 0的一致码段。,2.同一任务不同特权级的转移 能在相同特权级的段之间进行转移的能力是重要的,但这还不够充分,因为80386有四种特权级,而不是只有种CALL指令通过使用调用门,允许控制转移到更内层的特权级。RET指令则相反,允许转移到外层的段,以返回到来自外层的CALL调用。JMP指令,则不能在不同特权级之间进行转移。 支持向内层的调用,及向外层的返回,使应用程序可以直接调用内层的操作系统例程,以获得必要的系统服务。例如存储器分配及文件访问等。系统不支持向外层调用及向内层的返回,因为操作系统不大可能要调用应用程序级的程序来得到服务。只有很少的情形,操作系统必须转移到外层。这时,先将外层程序的段指针及偏移量压人堆栈,再执行一次RET指令。对于一个刚装入并可开始执行的程序,这种技术是有用的。 转移到内层特权极,必须小心地加以控制,以保证保护机制的完整性。只允许外层级通过操作系统规定的入口点转移到内层。操作系统还必须控制入口点的段及偏移量。否则,如果操作系统只控制段部分,则应用程序可以转移到段内的任何偏移量指示的位置。例如,可以规定一个刚刚超过程序代码之后的偏移量,更糟的是,外层可能规定一个位于一条指令中间的偏移量。在这种情况下,有可能造成灾难性的后果。,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号