Как читать / записывать регистры LAPIC из модуля ядра? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь отключить все прерывания.Большинство из них просты, но у меня есть проблемы с немаскируемыми прерываниями (NMI).Чтобы отключить их, я хочу манипулировать регистрами LVT в локальном APIC.В настоящее время я тестирую внутри модуля ядра, потому что это среда, и должен выполняться финальный код.

Как я могу читать / записывать в отображенные в память регистры APIC?

I 'Мы уже прочитали много статей, и все предложили эту процедуру.Я также пытался получить прямой доступ к * сопоставленному указателю, который разрешается с тем же результатом.

Вместо функции foo () я реализовал поиск правильного адреса.Но согласно руководству Intel и моим личным проверкам, APIC всегда отображается на физический адрес 0xFEE00000, что интересно, потому что я также пробовал программу на виртуальной машине с 2 ГБ ОЗУ.

phys_addr_t apic_base_phys = foo(); // fee00000
void __iomem *mapped = ioremap(apic_base_phys + 0x20, 0x4);

if(mapped == NULL){
    printk(KERN_INFO "nullpointer\n");
} else {
    uint32_t value = ioread32(mapped);
    printk(KERN_INFO "Value: %x\n", value); // 0xffffffff
}

iounmap(mapped);

Вывод:

[ 1329.743182] apic_base_phys: fee00000
[ 1329.743198] Value: ffffffff

Адрес 0xFEE00020 должен выводить локальный идентификатор APIC, который, вероятно, не равен 0xFFFFFFFF.
Я также пытался прочитать 0xFEE00030, который должен выводить версию LAPIC.

1 Ответ

1 голос
/ 17 апреля 2019

Получил решение сам: на моей Системе работает более новая версия x2APIC. При этом используется другой режим передачи.

Это можно отключить, добавив nox2apic к параметрам загрузки.

...