Я только начинаю пытаться понять ядро 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 бита для смещения. Является ли проблема просто тем, что я не могу использовать структуру как выходную цель? Как бы я это сделал? Кроме того, поскольку ресурсы (на мой взгляд) были немного скудными, могли бы кто-нибудь порекомендовать хороший учебник или книгу на эту тему?
Спасибо.
Спасибо, я знал, что это было что-то простое (что я смутил, и я не смущаюсь). Совершенно ясно, что я обошел это назад. Спасибо за вашу помощь. – fromClouds