如何从c程序访问rdmsr?

如何从c程序访问rdmsr?,c,linux,performance,intel,C,Linux,Performance,Intel,从《英特尔软件开发人员手册》3b中,我了解到MSR(10H)等于RDTSC。所以我想在我的程序中使用下面的代码来验证它: asm volatile("rdmsr":"=a"(lo),"=d"(hi):"c"(0x10)); 但当我运行我的程序时,它显示了分段错误。然后,a意识到它只在特权级别0下工作的警告。所以我用sudo访问再次运行这个程序。这次程序运行时没有seg错误,但asm volatile(..)之后的语句没有执行。甚至它也不起作用 如何使rdmsr在我的程序中工作? (我在i7内核

从《英特尔软件开发人员手册》3b中,我了解到MSR(10H)等于RDTSC。所以我想在我的程序中使用下面的代码来验证它:

asm volatile("rdmsr":"=a"(lo),"=d"(hi):"c"(0x10));
但当我运行我的程序时,它显示了分段错误。然后,a意识到它只在特权级别0下工作的警告。所以我用sudo访问再次运行这个程序。这次程序运行时没有seg错误,但asm volatile(..)之后的语句没有执行。甚至它也不起作用

如何使rdmsr在我的程序中工作? (我在i7内核上使用linux,它支持这些计数器。我已经验证过了。)


一些相关帖子是,你把CPU/硬件权限(对执行指令、内存访问的限制)与操作系统/系统权限(操作系统功能、文件等)混为一谈。根应用程序的CPU权限级别与普通用户的代码不同。它只是对操作系统功能有更多的考虑


您必须从操作系统内核运行该指令,操作系统内核通常在环0处运行。

您将CPU/硬件权限(对执行指令、内存访问的限制)与操作系统/系统权限(操作系统函数、文件等)混为一谈。根应用程序的CPU权限级别与普通用户的代码不同。它只是对操作系统功能有更多的考虑


您必须从操作系统内核运行该指令,操作系统内核通常在环0上运行。

特权级别0是内核模式。它不是根目录。权限级别0是内核模式。这不是root.oh,谢谢@Olaf,但知道如何从操作系统内核级运行它吗?为了在操作系统内核级运行代码,您可以开发内核模块。Linux内核模块在环0中运行。@ANTHONY:正如desowin所写:如果只有内核在环0中运行,那么显然需要一个内核模块。请注意,这不像一个简单的C程序,可能会对硬件和文件系统造成损坏,甚至完全丢失数据-因为环0允许代码基本上做任何事情。@ANTHONY:如果答案有帮助,请记住向上投票和/或接受。哦,谢谢@Olaf,但您知道如何从操作系统内核级运行它吗?为了在操作系统内核级运行代码,您可以开发内核模块。Linux内核模块在环0中运行。@ANTHONY:正如desowin所写:如果只有内核在环0中运行,那么显然需要一个内核模块。请注意,这不像一个简单的C程序,可能会对硬件和文件系统造成损坏,甚至完全丢失数据——因为环0允许代码基本上做任何事情。@ANTHONY:如果答案有帮助,请记住投票和/或接受。