Адрес возврата кода операции SIDT для неправильно сформированной структуры IDT
Моя цель - получить доступ к IDT из модуля ядра MacOS.
Я использую macOS 10.13.2 под VMFusion 10.0.1, и кажется, что sidt
команда сборки указывает на поврежденную структуру таблицы.
Этот код операции должен возвращать адрес в "Таблицу дескрипторов прерываний", которая содержит дескрипторы для каждого прерывания.
Каждое прерывание содержит указатель на функцию обратного вызова, которая должна вызываться при вызове определенного прерывания.
Например, вот два дескриптора прерывания, которые указывают на допустимые обратные вызовы из секции ядра __TEXT в предыдущих более старых версиях.
- int3 указывает на idt64_int3
- int80 указывает на idt64_unix_scall
так далее...
По какой-то причине, начиная с высокой Сьерры 10.13.2, sidt
возвращает диапазон памяти, который не содержит допустимых указателей (все находятся за пределами ядра __TEXT
раздел). возможно есть другой способ получить указатель на таблицу?
Вот мой исходный код для поиска указателя idt:
unsigned char idt_out[10];
__asm__ volatile ("sidt %0": "=m" (idt_out));
// skip the first 2 bytes as they are not part of the address
uint64_t idt_address = *((unsigned long long *)(idt_out+2));
printf("idt address is %llx \n", idt_address);
int80_desc = (struct descriptor_idt*)(idt_address + sizeof(struct idt_desc)*0x80);
int80_address = (mach_vm_address_t)(((unsigned long)int80_desc->offset_high << 32) + ((unsigned int)int80_desc->offset_middle << 16) + int80_descriptor->offset_low); // this should point to idt64_unix_scall
1 ответ
Видимо, причина sidt
перестал работать намеренно и является частью исправления Meltdown.
Это все, что мне удалось выяснить до сих пор, если кто-нибудь получил больше подсказок о рассуждениях, пожалуйста, просветите нас.