相关疑难解决方法(0)

在组装/编译/链接时构建静态IDT和GDT所需的解决方案

多年来,尤其是在x86操作系统开发中遇到的许多问题都激发了这个问题。最近,有关NASM的一个问题因修改而引起争议。在那种情况下,该人正在使用NASM并遇到汇编时间错误:

移位运算符只能应用于标量值

另一个相关问题是在编译时生成静态IDT时导致错误的GCC代码问题:

初始值设定项元素不是常量

在这两种情况下,此问题都与以下事实有关:IDT条目需要一个指向异常处理程序的地址,而GDT可能需要到另一个结构(如任务段结构(TSS))的基地址。通常这不是问题,因为链接过程可以通过重定位修复程序解析这些地址。对于IDT条目GDT条目,这些字段将基地址/功能地址拆分开。没有重定位类型可以告诉链接程序将位移位,然后按照它们在GDT / IDT条目中的布局方式放置到内存中。彼得·科德斯(Peter Cordes)在这个答案对此作了很好的解释。

我的问题是不是问这个问题是什么,但对于一个请求的功能,以及实用的解决方案的问题。尽管我对此进行了自我回答,但这只是许多可能的解决方案之一。我只要求提出的解决方案满足以下要求:

  • GDT和IDT的地址不应固定为特定的物理或线性地址。
  • 该解决方案至少应能够使用ELF对象和ELF可执行文件。如果它适用于其他格式,那就更好了!
  • 解决方案是否是构建最终可执行文件/二进制文件的过程的一部分都没有关系。如果解决方案在生成可执行文件/二进制文件后需要构建时间处理,那也是可以接受的。
  • GDT(或IDT)在加载到内存后需要显示为完全解析。解决方案必须不需要运行时修复程序。

无效的示例代码

我以传统的引导加载程序1的形式提供了一些示例代码,该示例试图在组装时创建静态IDT和GDT,但是在与组装时会出现以下错误nasm -f elf32 -o boot.o boot.asm

boot.asm:78: error: `&' operator may only be applied to scalar values
boot.asm:78: error: `&' operator may only be applied to scalar values
boot.asm:79: error: `&' operator may only be applied to scalar values
boot.asm:79: error: `&' operator …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm ld osdev

6
推荐指数
1
解决办法
105
查看次数

在编译/链接时如何使用地址进行计算?

我编写了一些初始化IDT的代码,该IDT将32位地址存储在两个不相邻的16位半部分中。IDT可以存储在任何地方,您可以通过运行LIDT指令告诉CPU在哪里。

这是初始化表的代码:

void idt_init(void) {
    /* Unfortunately, we can't write this as loops. The first option,
     * initializing the IDT with the addresses, here looping over it, and
     * reinitializing the descriptors didn't work because assigning a
     * a uintptr_t (from (uintptr_t) handler_func) to a descr (a.k.a.
     * uint64_t), according to the compiler, "isn't computable at load
     * time."
     * The second option, storing the addresses as a local array, simply is
     * inefficient …
Run Code Online (Sandbox Code Playgroud)

c x86 linker interrupt osdev

2
推荐指数
1
解决办法
391
查看次数

标签 统计

osdev ×2

x86 ×2

assembly ×1

c ×1

interrupt ×1

ld ×1

linker ×1

nasm ×1