Значение system_call меняется каждый раз, когда я использую rdmsrl (MSR_LSTAR, system_call) - PullRequest
2 голосов
/ 11 июня 2019

Я пишу lkm, чтобы получить sys_call_table адрес, и я пытаюсь получить его по IDT (я проверил другие методы, и они работают). Проблема в том, что когда я использую rdmsrl, чтобы получить регистр MSR_LSTAR, он каждый раз меняется.

Я пробовал использовать функции rdmsrl (MSR_LSTAR) и asm в Ubuntu 18.04.1 с ядром 4.15.0-51.

asm("rdmsr" : "=a" (low), "=d" (high) : "c" (IA32_LSTAR));
system_call = (void*)(((long)high<<32) | low);
printk(KERN_INFO "system_call: 0x%llx", system_call);
rdmsrl(MSR_LSTAR, sct_off);
printk("sct_off: %016llx\n", sct_off);

Результат выглядит следующим образом:

system_call: 0xfffffe0000006000
system_call: 0xfffffe000008a000
system_call: 0xfffffe0000032000

1 Ответ

3 голосов
/ 12 июня 2019

У вас есть CONFIG_RETPOLINE=y включен?(проверьте через cat /usr/src/`uname -r`/.config | grep RETPOLINE).Если это так, то для процессоров, для которых включена изоляция таблицы страниц ядра, MSR_LSTAR содержит запись батут на процессор SYSCALL64_entry_trampoline вместо стандартной entry_SYSCALL_64 для вашей версии ядра.

...