问题:如何在不同特权级的代码之间跳转执行?

调用门描述符 用于从 低特权级代码段跳转到高特权级代码段 并返回
门描述符也是描述符,结构上同 段描述符一样,也是占用8个字节。

调用门描述符: 调用门中保存了 某个段的选择子以及相应的偏移地址。 地址位一共32位 4个字节,正好是一个偏移地址所需要存储空间。

调用门描述符的工作原理:
只要是描述符,那么必然会对应有一个选择子,既然调用门描述符是一个描述符,那么就会对应一个选择子,即调用门选择子。可以使用 调用门选择子 来访问对应的门描述符, 门描述符中有两个很重要的信息,一个是选择子,一个是偏移地址。选择子指的是段描述符的选择子,所以我们可以通过这个段选择子 访问到一个对应的段描述符,拿到对应的段基地址和段界限,再使用门描述符中的记录的偏移地址,就可以得到一个确定的内存地址,就可以跳转到该地址执行。所以 通过调用门选择子 最终得到一个确定的内存地址,然后跳转到该地址,所以通过调用门选择子可以跳转到某个固定的内存地址上来执行。有点类似于 C语言中 函数指针。

全局段描述附表
[section .gdt]
; GDT definition
; 段基址, 段界限, 段属性
GDT_ENTRY : Descriptor 0, 0, 0
...
;定义一个专门定义函数的 代码段
FUNCTION_DESC : Descriptor 0, FunctionSegLen - 1, DA_C + DA_32
调用门描述符
; Gate Descriptor
; Call Gate 选择子, 偏移, 参数个数, 属性
;定义两个门描述符,分别对应 FUNCTION_DESC代码段中两个函数的入口地址
;该调用门描述符中保存 FUNCTION_DESC段的选择子,以及段内偏移地址(指的是该代码段中某个函数的入口地址
FUNC_CG_ADD_DESC Gate FunctionSelector, CG_Add, 0, DA_386CGate
FUNC_CG_SUB_DESC Gate FunctionSelector, CG_Sub, 0, DA_386CGate
; GDT end
;代码段 段描述符选择子
FunctionSelector equ (0x0004 << 3) + SA_TIG + SA_RPL0
;定义两个调用门描述符选择子 分别指向对应的函数地址,类似于C语言中的函数指针,所以通过选择子调用相应的函数
FuncCGAddSelector equ (0x0005 << 3) + SA_TIG + SA_RPL0
FuncCGSubSelector equ (0x0006 << 3) + SA_TIG + SA_RPL0

本文详细讲解了如何利用调用门描述符在不同特权级代码间进行跳转,以及其工作原理,包括门描述符的结构、选择子的作用以及与段间跳转和函数调用的关联。通过实例演示了GDT和GDTR的设置,以及如何通过调用门选择子实现跨权限级别的功能调用。
最低0.47元/天 解锁文章
625

被折叠的 条评论
为什么被折叠?



