保护模式中的特权级 之 使用调用门描述符实现段间跳转

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

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

在这里插入图片描述

调用门描述符 用于从 低特权级代码段跳转到高特权级代码段 并返回

门描述符也是描述符,结构上同 段描述符一样,也是占用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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值