每次使用rdmsrl(system_call,MSR_LSTAR)时,system_call值都不同

时间:2019-06-11 11:26:51

标签: linux linux-kernel x86 x86-64 inline-assembly

我正在写一个lkm来获取sys_call_table地址,而我正试图通过IDT来获取(我已经测试了其他方法,并且它们可以工作)。问题是,当我使用rdmsrl获取寄存器MSR_LSTAR时,每次都不同。

我已在内核4.15.0-51的Ubuntu 18.04.1中尝试过函数rdmsrlMSR_LSTAR)和asm语句。

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 个答案:

答案 0 :(得分:3)

您启用了CONFIG_RETPOLINE=y吗? (通过猫/usr/src/`uname -r`/.config | grep RETPOLINE检查)。如果是这样,对于启用了内核页表隔离的CPU,MSR_LSTAR保留您的内核版本的trampoline per-cpu entry SYSCALL64_entry_trampoline instead of the standard entry_SYSCALL_64