2012-04-14 3 views
0

Я только начинаю пытаться понять ядро ​​Linux и пытаюсь найти местоположение IDTR. Это кажется, как будто это должен быть достаточно простой процесс, поскольку язык ассемблера предоставляет инструкцию lidt только для этой цели. Я думаю поэтому, что я мог бы обеспечить структуру, достаточно большой, чтобы вместить содержимое этого регистра в качестве выходного операнда, например, так:Чтение реестра нестандартного размера (IDTR) в встроенной сборке (легко?)

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

struct idt_ptr idtp; 

int * get_idt() { 
    __asm__ 
    __volatile__(
     "lidt %0;" 
     : "=&r"(idtp) 
    ); 
} 

Это не работает, конечно. Это приводит к

/var/folders/yb/ybzqw8850nz9lzjsc6jf9hkw0000gn/T//ccvNm3SA.s:11:suffix or operands invalid for `lidt' 

Я думаю размер структуры является правильным, short должен обеспечивать 16 бит для адреса сегмента и long long 64 бита для смещения. Является ли проблема просто тем, что я не могу использовать структуру как выходную цель? Как бы я это сделал? Кроме того, поскольку ресурсы (на мой взгляд) были немного скудными, могли бы кто-нибудь порекомендовать хороший учебник или книгу на эту тему?

Спасибо.

ответ

2

an example Использование LIDT в сборке gcc inline. Обратите внимание: LIDT устанавливает новое значение IDTR вместо чтения текущего. Вы должны использовать SIDT, чтобы прочитать IDTR. Вот example, как это сделать в встроенной сборке с gcc.

+0

Спасибо, я знал, что это было что-то простое (что я смутил, и я не смущаюсь). Совершенно ясно, что я обошел это назад. Спасибо за вашу помощь. – fromClouds

Смежные вопросы