gate 的用法

本文详细解释了gatedescriptor如何提供目标代码的访问途径,包括从selector获取codesegmentdescriptor,计算base和offset,最终确定代码入口点的过程。同时介绍了在用户代码中使用gatedescriptor调用目标代码的方法,以及远调用指令的格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:点击打开链接

gate descriptor 给出了目标代码的访问途径。


Click here to open new windowCTRL+Mouse wheel to zoom in/out

上面给出一个直观的访问途径图。这个途径就是:

1、gate descriptor 的 selector 给出目标代码的 code segment descriptor
2、由目标代码 code segment descriptor 的 base address 得出代码的 base
3、这个 base 加上 gate descriptor 的 offset 值,最终得到代码的入口点。

用 C 代码描述为:

void do_call_with_gate(selector_t call_gate_descriptor)
{
        code_descriptor = get_descriptor(call_gate_descriptor.selector);
        base = code_descriptor.base;

        void (*pf)() = (void(*)()) base + call_gate_descriptor.offset;

        pf();

}




在用户代码中使用如下指令:

  call  0x20:00000000                 /*  通过 call gate 调用 */
或:
  jmp 0x20:00000000               

---------------------------------------------------------------
  上面这条指令是 far call 指令格式:call cs:eip 这种形式。 0x20 为 call gate descriptor selector,在这里 0x000000000 是无意义的。只是为了完整这条指令格式,可以使用任意一个值。
  在 gate descriptor 格式里,高 16 位和低 16 位组成一个 32 位的 offset 值。这个值就是入口地址。在绝大多数的 OS 里使用的平坦内存模式下,base 为 0,那么,这个 offset 就是最终的服务例程的入口点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值