【问题标题】:Linux Change IDT, how to read offset?Linux 更改 IDT,如何读取偏移量?
【发布时间】:2021-08-08 21:07:09
【问题描述】:

我正在尝试编辑 linex 内核以更改 IDT,因此我编写了以下帮助函数:

#include <asm/desc.h>

unsigned long my_get_gate_offset(gate_desc *gate) {
    unsigned long res = 0;
    return result;
}

res如何填写如下?

低 16 位应为 offset_low,中间 16 位为 offset_middle,高 32 位应为 offset_high 如何在 C 中完成?

另外,我如何联系offset_lowoffset_middleoffset_high?它们在 gate_struct 中声明,而不是在 gate_desc 中声明

【问题讨论】:

  • 我的问题够清楚了吗?

标签: c linux linux-kernel operating-system offset


【解决方案1】:

已经有函数gate_offset 可以满足您的要求:

static inline unsigned long gate_offset(const gate_desc *g)
{
#ifdef CONFIG_X86_64
    return g->offset_low | ((unsigned long)g->offset_middle << 16) |
        ((unsigned long) g->offset_high << 32);
#else
    return g->offset_low | ((unsigned long)g->offset_middle << 16);
#endif
}

【讨论】:

  • 你能解释一下吗?什么|是这里的意思吗?为什么我们将 middle 转换为 (unsigned long) 而 offset_low 没有?
  • |: Bitwise inclusive OR operator; offset_low 不需要提升到更大的宽度,因为它没有向左移动。
  • 但这样做也不会产生任何影响
  • 对,编译器可能会产生相同的代码。
  • 是的,由于 C 整数提升规则,编译器在执行按位包含 OR 时也会将 g-&gt;offset_low 提升为 unsigned long。移位需要强制转换的原因是 g-&gt;offset_middle 是 16 位,g-&gt;offset_high 是 32 位,我们需要将它们提升为最终类型 before 移位,获得正确/完整的结果。我喜欢 Armali 的代码,我自己也会使用相同的代码。
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 1970-01-01
相关资源
最近更新 更多