优先级划分、指令的权限检查和超出权限访问的异常处理等是构成特权保护的基础。本文将试图讲解为大家解决两大问题:
--win32汇编中为什么找不到中断指令的应用?比如int 7ch
--windows错误的‘蓝屏’是从哪里来的?
保护模式下,中断或异常往往从用户代码切换到操作系统代码中执行。由于保护模式下的代码有优先级之分,因此出现从优先级低的应用程序转移到优先级高的系统代码的问题,如果优先级低的代码能够任意调用优先级高的代码,就相当于了拥有了高优先级代码的权限。为了使高优先级代码能够安全的被低优先级代码调用,保护模式下增加了‘门’的概念。
门指向某个优先级高的程序所规定的入口点,所有优先级低的程序调用优先级高的程序只能通过门重定向,进入门所规定的入口点。这样就可以避免低级别的程序代码从任意位置进入优先级高的程序的问题。
保护模式下的中断和异常等服务也需要从‘门’进入,80386的门分为中断们、自陷门和任务门。
保护模式把所有的中断描述符放在一起组成中断描述符表IDT,为此80386处理器引入了一个新的48位寄存器IDTR。IDTR的高32位指定了IDT在内存中的基址(线性地址),低16位指定了IDT的长度,相当于指定了可以去支持的中断数量。
保护模式发生异常或者中断时,处理器先根据IDTR寄存器得到的中断描述符的地址,然后取出n号中断/异常的门描述符,再从描述符中取得中断服务程序的地址xxxx:yyyyyyyy,经过段地址转换后得到服务程序的32为线性地址并转移后执行。
windows中,操作系统使用动态链接库代替中断服务程序提供系统功能,所以win32汇编中int指令也就失去存在的意义。这就是在win32汇编中看不到int指令的原因,其实那么调用API的指令就相当于在DOS系统中使用int指令完成系统功能。
保护机制主要在下面几个方面:
段类型检查:由段描述符指定的
页类型检查
访问数据时的级别检查:
--优先级低的代码不能访问优先级高的数据段。80386的段描述符中有一个DPL(描述符优先级),表示这个段可以被访问的最低优先级
--而段选择符中含有RPL域(请求优先级),表示当前执行代码的优先级
知道有当DPL大于RPL时才可访问
以上是windows规定的保护条例,如果某个程序违反了,那么引发保护异常,这样就会蓝屏告诉用户试图访问不存在的内存。
x86 32位机的特权保护