如果Proc在操作系统程序中,无论source源数据块和destination目标数据块属于操作系统或应用程序,都能合法的运作。

  如果Proc在应用程序中,有可能产生情形③和④。例如,应用程序传入的目标数据块选择字的RPL=0,意味着应用程序要对操作系统的数据段进行非法写入。为此,必须在MOVE过程中加以判断,避免情形③和④的产生。

  在 MOVE过程中采用的处理方法是:目标数据块选择子的RPL应以主调程序的CPL为准。即采用ARPL指令改目标数据块选择子的RPL为主调程序的 CPL(关于ARPL指令的使用说明见后)。依据应用程序调用MOVE过程的堆栈,如图2所示,在MOVE过程始部(开始)加入的指令为:

  MOV AX,SS:[ESP+4] ;AX=CS主调程序的代码段选择字

  ;其RPL字段为主调程序的CPL

  ARPL SS:[ESP+10],AX ;改目标数据块选择子的RPL为主调程序的CPL

  MOV ES,SS:[ESP+10] ;ES=目标数据块选择子(其RPL字段为主调程序 ;的CPL)

  ……

  进 行了上述处理以后,如果应用程序传入的目标数据块选择字的RPL=0,ARPL把它修改为RPL=3,再传送到ES段寄存器中,显然不能满足选择字的装载 要求,即MAX(CPL,RPL)≤DPL,其中,MOVE过程的CPL=0;目标数据块选择字对应的数据段描述符中的DPL=0。CPU内部立即产生通 用保护异常中断进行处理。处理的结果通常为:终止当前的MOVE过程操作,返回应用程序;或终止应用程序的运行,返回操作系统。从而达到了保护目的。而情 形①、②,应用程序完全可以合法实现。

  [关于ARPL指令的使用说明]

  调整申请特权级指令: ARPL OPRD1,OPRD2

  其 中,操作数OPRD1可以是16位通用寄存器或存储单元,操作数OPRD2是16位通用寄存器。该指令把操作数OPRD1和OPRD2视为两个选择子,用 OPRD2的RPL去检查OPRD1的RPL。(选择子OPRD1和OPRD2的RPL分别由它们的低2个位规定。)

  如 果OPRD1的RPL值小于OPRD2的RPL值(OPRD1的特权级高于OPRD2),那么零标志ZF被置1,并把OPRD2的RPL值赋予OPRD1 的RPL(使两个操作数的低2位相等);否则,零标志ZF被清0。OPRD1和OPRD2都可为空选择子。该指令只影响ZF标志。