Циркулярные ссылки и сборка низкого уровня - PullRequest
0 голосов
/ 27 ноября 2011

У меня есть файл с именем idt.c, и в этом файле мне нужно вызвать функцию idt_load из сборки.Теперь это будет работать нормально, за исключением того, что мне нужен доступ к переменной idtp из файла сборки, и переменная объявлена ​​в idt.c

Это не будет работать, потому что компоновщик будетскажите мне, что либо idt_load не определено, либо idtp не определено.Как я могу заставить это работать?

Соответствующие части idt.c

struct idt_entry
{
    unsigned short base_lo;
    unsigned short sel;
    unsigned char always0;
    unsigned char flags;
    unsigned short base_hi;
} __attribute__((packed));

struct idt_ptr
{
    unsigned short limit;
    unsigned int base;
} __attribute__((packed));


struct idt_entry idt[256];
struct idt_ptr idtp;

extern void idt_load();

//Later in the code...
idt_load();

idt.asm

global idt_load
extern idtp
idt_load:
    lidt [idtp]
    ret

1 Ответ

1 голос
/ 27 ноября 2011

Обдумать две вещи:

  1. idt какого типа?(Ответ: это указатель на idt_entry или, строго говоря, это имя адреса idt[0].)

  2. Как бы вы объявили внешнюю ссылку на указатель в файле asm?

Самый простой способ получить все это - скомпилировать код C с соответствующим флагом (по крайней мере, в gcc I думать это -S) и посмотретьсгенерированный ассемблерный код.

У вас нет циклической ссылки, вам просто нужно сообщить компоновщику, что вы хотите обратиться к памяти, определенной в коде C, под названием idt.

...