调用门的作用
gate简单来说可以想象成政府为人民提供的一个政府诉求中心,它可以集中收集人民对政府的要求和投诉,然后把这些诉求发给相关的政府部门来处理。
门提供了受保护的间接调用,为任务内的特权转移提供了安全可靠的方法。由于程序不可能进入具有更高优先级段中的任何位置。如果他们一定要进入,则只能使用调用门进入到调用门描述符指定的位置。而操作系统中定义了系统中的全部门,因此也就保证了所有的门只能进入几个受托的过程。这与试用软中断间接调用BIOS和DOS的功能调用所提供的机制相似。例如分配存储空间和I/O等操作。一旦通过调用门进入后,CPL发生改变,程序就完全进入了被调用代码的特权级。
调用门描述符的存储位置:
调用门描述符可以放在GDT、LDT中,但是不能放在IDT中。
调用们的访问规则:
调用门就是允许外层程序访问非一致代码时能够像一致代码那样使用。门的访问规则就像是对数据段的访问——使用调用门的代码的特权级要>=调用门的特权级才能使用该门,否则(调用程序的特权级比调用门中的特权级低)不允许访问。
例如,如果调用门描述符中的DPL=2,那么一个CPL=2的程序可以使用该门调用一个特权级为1的过程,但特权级为3的程序则不行。
通过调用门调用门描述符所对应的选择子中对应的代码需要对以下几个标志进行检查:
● CPL(当前特权级)
● 调用门选择子的RPL
● 调用门描述符的DPL
● 目标代码段的段描述符的DPL
规则对一致码和非一致码也有所不同(C=1/0)
处理器首先会处理调用进程和调用门之间的特权级检查,如果检验通过了处理器紧接着就用代码段描述符DPL和调用进程的CPL进行特权级检查。
从下表中可以看到,只有CALL指令可以使用调用门将进程控制转移到一个特权级更高(DPL<CPL)的非一致代码段,而对JMP指令使用调用门与否是一样的。
指令 | 访问门的权限 | 访问代码权限 |
CALL | CPL <= callgate.DPL && RPL <= callgate.DPL | 目标为一致代码段:destination. DPL <= CPL |
目标为非一致代码段:destination.DPL <= CPL | ||
JMP | CPL <= callgate.DPL && RPL <= callgate.DPL | 目标为一致代码段:DPL <= CPL |
目标为非一致代码段:DPL = CPL |
如果调用特权级更高的非一致目标代码段,CPL就降为目标代码段的DPL特权级,并且会发生栈切换。如果调用或者跳转到一个特权级更高的一致目标代码段,CPL不会发生变化,也不会发生栈切换。
我在想如果系统有定义的话,如果不嫌麻烦,你也完全可以从一个门调用另一个门中的程序(调用门1→调用门2→程序)。这样做不会让你得到任何额外的好处,你的权限也不会有任何提升。所以你完全可以直接调用门2去调用希望被调用的代码。