【发布时间】:2016-08-08 16:52:41
【问题描述】:
我正在尝试设置内核的 IDT,但出现此链接错误:
bin/obj/idt.o: In function `setup_idt':
idt.c:(.text+0x9b): undefined reference to `interrupt_handler_1'
错误说没有定义interrupt_handler_1,但它是interrupt_manager.asm中的一个宏:
%macro no_error_code_interrupt_handler 1
global interrupt_handler_%1
interrupt_handler_%1:
cli
push dword 0 ; push 0 as error code
push dword %1 ; push the interrupt number
jmp common_interrupt_handler ; jump to the common handler
%endmacro
这里是setyup_idt函数:
extern void interrupt_handler_1();
void setup_idt()
{
// Set the special idt_pointer
idt_pointer.limit = ( sizeof(struct InterruptDescriptorTableEntry) * 256 ) - 1; // Subsract 1 because sizeof doesn't start from 0
idt_pointer.address = (uint32)&idt;
// Clear the whole idt to zeros
memset(&idt, 0, sizeof(struct InterruptDescriptorTableEntry) * 256 );
for(unsigned int i = 0; i < 256; i++)
{
idt_set_gate(i, (uint32)&interrupt_handler_1, 0x8, 0x8E);
}
__asm__ __volatile__("lidt %0": :"m"(idt_pointer));
}
我做错了什么?
额外的问题:是否有宏/另一种方法可以将 GDT 的 i 条目自动链接到 i 中断处理程序,让我尝试更好地解释一下自己:
我想做的是这样的:
for(unsigned int i = 0; i < 256; i++)
{
idt_set_gate(i, (uint32)&interrupt_handler_[i], 0x8, 0x8E);
}
interrupt_handler[i] 将是中断处理程序_[i] 将被 nasm 宏替换
【问题讨论】:
-
链接器看不到宏。使用函数。
-
宏不是代码的一部分,您需要使用宏才能将其扩展为实际的汇编代码..
-
@Joachim Pileborg Okey,额外的问题呢?
标签: c assembly nasm linker-errors osdev