gpt4 book ai didi

linux - 从内核模块读取 x86 MSR

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:19 24 4
gpt4 key购买 nike

我的主要目标是在程序崩溃时获取 LBR 寄存器维护的最后 16 个分支的地址值。到目前为止,我尝试了两种方法 -

1) msr-工具这允许我从命令行读取 msr 值。我从 C 程序本身对它进行系统调用并尝试读取值。但是寄存器值似乎与程序本身的地址无关。很可能寄存器被系统代码中的其他分支污染了。我尝试关闭 ring 0 中的分支记录和远距离跳跃。但这无济于事。仍然得到不相关的值。

2) 通过内核模块访问好的,我写了一个非常简单的模块(我以前从未这样做过)来直接访问 msr 寄存器并可能避免寄存器污染。

这是我所拥有的 -

#define LBR 0x1d9 //IA32_DEBUGCTL MSR
//I first set this to some non 0 value using wrmsr (msr-tools)
static void __init do_rdmsr(unsigned msr, unsigned unused2)
{
uint64_t msr_value;
__asm__ __volatile__ (" rdmsr"
: "=A" (msr_value)
: "c" (msr)
);

printk(KERN_EMERG "%lu \n",msr_value);
}
static int hello_init(void)
{
printk(KERN_EMERG "Value is ");
do_rdmsr (LBR,0);
return 0;
}

static void hello_exit(void)
{
printk(KERN_EMERG "End\n");
}

module_init(hello_init);
module_exit(hello_exit);

但问题是,每次我使用 dmesg 读取输出时,我都会得到

Value is 0 

(我已经尝试过其他寄存器 - 它总是以 0 出现)

我在这里忘记了什么吗?有什么帮助吗?谢谢

最佳答案

使用以下内容:

unsigned long long x86_get_msr(int msr)
{
unsigned long msrl = 0, msrh = 0;

/* NOTE: rdmsr is always return EDX:EAX pair value */
asm volatile ("rdmsr" : "=a"(msrl), "=d"(msrh) : "c"(msr));

return ((unsigned long long)msrh << 32) | msrl;
}

关于linux - 从内核模块读取 x86 MSR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10253325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com