[英]system_call value is different each time when I use rdmsrl(MSR_LSTAR, system_call)
我正在写一个lkm来获取sys_call_table
地址,而我正在尝试通过IDT来获取(我已经测试了其他方法并且它们可以工作)。 问题是,当我使用rdmsrl
获取寄存器MSR_LSTAR
,每次都不同。
我已经在Ubuntu 18.04.1中使用内核4.15.0-51尝试过函数rdmsrl
( MSR_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
您是否已启用CONFIG_RETPOLINE=y
? (通过cat /usr/src/`uname -r`/.config | grep RETPOLINE
)。 如果是这样的话,对于启用了内核页表隔离的CPU, MSR_LSTAR
保存每个蹦床的蹦床条目SYSCALL64_entry_trampoline
而不是内核版本的标准entry_SYSCALL_64
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.