【问题标题】:how to access rdmsr from c program?如何从c程序访问rdmsr?
【发布时间】:2016-09-06 17:14:46
【问题描述】:

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

asm volatile("rdmsr":"=a"(lo),"=d"(hi):"c"(0x10));

但是当我运行我的程序时,它显示了分段错误。然后意识到它只在权限级别 0 下工作的警告。所以我再次使用 sudo 访问运行程序。这次程序运行时没有出现段错误,但 asm volatile(..) 之后的语句没有被执行。即使它没有效果。

我应该怎么做才能使 rdmsr 在我的程序中工作? (我在支持这些计数器的 i7 内核上使用 linux。我验证了它。)

一些相关的帖子是Cannot read back from MSRrdmsr,wrmsr from c/c++ code

【问题讨论】:

  • 权限级别 0 是内核模式。这不是根。

标签: c linux performance intel


【解决方案1】:

您将 CPU/硬件权限(对执行指令的限制、内存访问)与操作系统/系统权限(操作系统功能、文件等)混淆了。根应用程序不会以与普通用户的代码不同的 CPU 特权级别运行。它只是为操作系统功能提供了更多的余地。

您必须从通常在 ring 0 运行的 OS 内核运行该指令。

【讨论】:

  • 哦,谢谢@Olaf 但是知道如何从操作系统内核级别运行它吗?
  • 为了在操作系统内核级别运行代码,您可以开发内核模块。 Linux 内核模块在 ring 0 中运行。
  • @ANTHONY:正如 desowin 所写:如果只有内核在 Ring 0 中运行,那么您显然需要一个内核模块。请注意,它不像一个简单的 C 程序,可能会损坏硬件和文件系统,甚至导致数据完全丢失 - 因为环 0 允许代码执行任何操作
  • @ANTHONY:如果回答有帮助,请记得点赞和/或接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多