Win32基础知识6 - Win32汇编语言007
Win32基础知识6
让编程改变世界
Change the world by program
Windows的特权保护
Windows 的特权保护和处理器硬件的支持是分不开的。 优先级的划分、指令的权限检查和超出权限访问的异常处理等是构成特权保护的基础。这一讲我们将试图讲过讲解为大家解决两大问题:
Win32汇编中为什么找不到中断指令的应用?
Windows错误的“蓝屏”是从哪里来的?
小甲鱼解释中断和异常
鱼C故事会: 假设某一天你正在兴致勃勃、兴高采烈地看一部爱情动作片,但是突然妈妈在外边猛敲你的房门,因为她发觉家里的酱油没了…… 这时候没办法,还是老妈的命令重要,因此,我们暂停了视频,然后去打酱油…… 打完酱油回来,你又接着往下看,意兴珊阑处,停电了…… 过了N久,好不容易来电了,一开机,它蓝屏了!官方解释 -- 什么是中断
中断指当程序执行过程中有更重要的事情需要实时处理时(如串口中有数据到达,不及时处理数据会丢失,串行控制器就提交一个中断信号给处理器要求处理),硬件通过中断控制器通知处理器。 接到命令后,处理器暂时挂起当前运行的程序,转移到中断处理程序中。 当中断处理程序处理完毕后,通过iret指令回到原先被打断的程序中继续执行。官方解释 -- 什么是异常
异常指指令执行中发生不可忽略的错误时(如遇到无效的指令编码,除法指令除零等),处理器用和中断处理相同的操作方法挂起当前运行的程序转移到异常处理程序中。 异常处理程序决定在修正错误后是否回到原来的地方继续执行。 注意:中断和异常处理的方式是相同的!!实模式下的中断或异常处理:
实模式下的中断和异常服务程序地址存放在中断向量表中。 中断向量表位于物理内存中,每个中断向量是一个xxxx:yyyy格式的地址,占用4字节。 当发生n号异常或n号中断,或者执行到int n指令的时候,CPU首先到内存n×4的地方取出服务程序的地址aaaa:bbbb 然后将标志寄存器、中断时的CS和IP压入堆栈,接着转移到aaaa:bbbb处执行保护模式下的中断或异常处理
保护模式下,中断或异常处理往往从用户代码切换到操作系统代码中执行。 由于保护模式下的代码有优先级之分,因此出现了从优先级低的应用程序转移到优先级高的系统代码中的问题。 如果优先级低的代码能够任意调用优先级高的代码,就相当于拥有了高优先级代码的权限。 为了使高优先级的代码能够安全地被低优先级的代码调用,保护模式下增加了“门”的概念。 “门”指向某个优先级高的程序所规定的入口点,所有优先级低的程序调用优先级高的程序只能通过门重定向,进入门所规定的入口点。 这样可以避免低级别的程序代码从任意位置进入优先级高的程序的问题。 保护模式下的中断和异常等服务程序也要从“门”进入,80386的门分为中断门、自陷门和任务门几种。 保护模式下中断或异常示意图 [caption id="attachment_667" align="aligncenter" width="300"]
保护模式下中断或异常示意图[/caption]
保护模式下把所有的中断描述符放在一起组成"中断描述符表IDT"。
为此80386处理器引入了一个新的48位寄存器IDTR。
IDTR的高32位指定了IDT在内存中的基址(线性地址),低16位指定了IDT的长度,相当于指定了可以支持的中断数量。
保护模式下发生异常或中断时,处理器先根据IDTR寄存器得到中断描述符的地址,然后取出n号中断/异常的门描述符,再从描述符中得到中断服务程序的地址xxxx:yyyyyyyy,经过段地址转换后得到服务程序的32位线性地址并转移后执行。
在Windows中,操作系统使用动态链接库来代替中断服务程序提供系统功能,所以 Win32汇编中int指令也就失去了存在的意义。
这就是在Win32汇编源代码中看不到int指令的原因。
其实那些调用API的指令原本是用int指令实现的。

浙公网安备 33010602011771号