问题标签 [msr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
macos - 如何从 OSX 的用户空间写入 x86 调试寄存器?
我想在我的 OSX 用户空间程序中使用 x86 规范 (DR0-7) 中定义的调试 MSR。不幸的是,这些需要 CPL == 0(又名环 0)。我已经翻阅了 OSX 系统调用,除了kernel_debug
没有真正跳出来作为访问这些系统调用的方法。
可能情况是它们只能通过一些更高级别kernel_debug
的接口(如
我的最终目标是访问这些寄存器的功能,而不是寄存器本身。有没有人知道如何做设置硬件断点之类的事情?
assembly - CPUID:为什么某些功能必须将 MISC_ENABLE.LCMV 设置为 0?我可以暂时覆盖它吗?
我正在尝试使用 CPUID,但附加了一些字符串。根据sandpile.org的 CPUID 页面,CPUID 标准函数 0000_0004h 及更高版本只有在 MISC_ENABLE.LCMV 标志设置为 0 时才能工作。该标志是特定型号寄存器 (MSR) 1A0 的第 22 位。显然,这个限制是由于 Windows NT 中的一个错误造成的(感谢微软让事情变得更容易;))。
我可以使用 CPUID 0000_0001h(ecx 标志,位 3)测试是否存在 LCMV 标志。假设它存在,它到底是做什么用的,为什么它对 CPUID 有这样的影响?MSR 1A0 是读/写寄存器还是只读的?这种特殊用途的寄存器是如何使用汇编代码读取/写入的?
如果寄存器在技术上是读/写的,在 CPUID 指令的持续时间内将第 22 位重置为 0 是否安全,然后再将其恢复为原始设置?或者,如果设置不正确(即启用),我是否会搞砸?
最后,sandpile使用了这样的措辞,“只有当 MISC_ENABLE.LCMV 设置为 0 时才启用此级别。这是由于 Windows NT 错误造成的。” 如果出于这个原因专门禁用了一堆标准级别,那会反映在 CPUID 级别 0000_000h 的 eax 寄存器(支持的最大标准级别)的输出中吗?
呼……我想就是这样。
prefetch - 无法禁用硬件预取器
我正在尝试禁用硬件预取器以在 Intel core i5 2500 上运行一些内存基准测试。问题是我的 BIOS 中没有任何选项可以启用或禁用预取器。所以我试图使用 msr-tools 来禁用预取器。但是 msr-tool 无法将某些特定值写入所需的寄存器 (0x1a0h)。
这对所有 cpu 都是一样的。但是,如果我尝试写入值 0x850088(仅选择用于测试),它将成功写入该值。
谁能指出问题出在哪里以及解决方案是什么?
我也觉得奇怪的是我的 BIOS 中没有预取器禁用选项。这是某些版本的 BIOS 的情况吗?
谢谢。
linux - 从内核模块读取 x86 MSR
我的主要目标是在程序崩溃时获取由 LBR 寄存器维护的最后 16 个分支的地址值。到目前为止,我尝试了两种方法-
1) msr-tools 这允许我从命令行读取 msr 值。我从 C 程序本身对其进行系统调用并尝试读取这些值。但是寄存器值似乎与程序本身的地址无关。很可能寄存器被系统代码中的其他分支污染了。我尝试关闭环 0 和远跳中的分支记录。但这无济于事。仍然获得不相关的值。
2) 通过内核模块访问 好的,我编写了一个非常简单的模块(我以前从未这样做过)来直接访问 msr 寄存器并可能避免寄存器污染。
这就是我所拥有的 -
但问题是每次我使用 dmesg 读取输出时,我得到的只是
(我尝试过其他寄存器 - 它始终为 0)
我在这里忘记了什么吗?有什么帮助吗?谢谢
msr - 哪些型号特定的寄存器控制 Ivy Bridge Xeon 上的 RAM 纠错?
如何确定 Ivy Bridge 系统上的纠错功能是否有效?(需要 Xeon 12xx-v2 CPU 和 ECC UDIMM 的组合)。
理想情况下,这种方法也可以在没有必要硬件的系统上运行(并返回 ECC 已禁用),并在硬件存在时检查内存控制器配置。但就我的目的而言,我只需要它在一个绝对具有 ECC 功能的 CPU 和 RAM 的系统上工作。
通常我会使用诸如 MemTest86+ 之类的现有工具来检查这一点,但它尚未更新以支持 Ivy Bridge。
c - 硬件处理器计数器重置不正确
我写了一个程序,它读取英特尔芯片上的 APERF/MPERF 计数器( http://www.intel.com/content/dam/doc/manual/64-ia-32-architectures-software-developer-vol上的第 2 页-3b-part-2-manual.pdf)。
这些计数器可通过 readmsr/writemsr 指令读取/写入,我目前只是通过 Windows 7 中的设备驱动程序定期读取它们。计数器是 64 位,并且随着每个处理器时钟大约递增,所以你预计它们会在很长一段时间内溢出,但是当我读取计数器时,它们的值会跳跃,就好像它们正在被另一个程序重置一样。
有什么方法可以追踪哪些程序会重置计数器?其他东西会导致读取不正确的值吗?我正在使用的相关程序集和相应的 C 函数附在下面。rdmsr 的 64 位结果保存到 eax:edx 中,因此为了确保我没有丢失 r_x 寄存器中的任何数字,我多次运行该命令以检查它们。
C:
集会:
打印出来的结果如下所示,但唯一改变的寄存器是 rax 寄存器,它不会单调增加(可以跳来跳去):
c - 确定 LBR 堆栈何时满
我将从我参与的项目的一些背景开始。我们正在尝试编写一个 Linux 内核模块(在 3.5 内核中),它将启用一些较新的 x86 处理器中存在的最后分支记录 (LBR) 功能并将分支数据写入硬盘上的文件以供以后分析。
我们目前已经能够启用 LBR,并且可以看到 LBR 堆栈顶部指针在检测到分支时发生变化(因此我们知道 LBR 已启用)。
我们的问题出现在我们无法确定如何确定 LBR 堆栈何时变满,以便我们可以从中读取数据并将其写入硬盘。理想情况下,我们希望在 LBR 中启用一个选项,以便在 LBR 堆栈接近满时抛出异常,并编写一个检索信息的处理程序。
到目前为止,我能找到的最接近的方法是设置 IA32_DEBUGCTL MSR 上的第 8 位,这使得每次检测到分支时都可以引发中断。不幸的是,每次发生分支时都写入磁盘会产生比我们想要的更多的性能影响。我们宁愿在每次 LBR 堆栈满时分批写入数据,而不是在每个单独的分支上写入数据。有没有我遗漏的替代方案,或者我们只需要在每个分支之后硬着头皮写到磁盘?
谢谢
file-permissions - 从用户空间读取 /dev/cpu/*/msr:不允许操作
我正在尝试编写一个可以读取 msr 寄存器的简单应用程序,并且正在从用户空间运行该应用程序。
我已经加载了 msr 模块,并为每个人授予了 /dev/cpu/*/msr 的读取权限。但是用户仍然无法访问这些文件,但 root 可以。
权限如下所示:
当我尝试从用户空间读取这些文件时,我不断收到“不允许操作”错误消息,但当 root 尝试访问它们时工作正常。我究竟做错了什么?我在内核版本为 3.11.0 的 Ubuntu 13.04 上。
assembly - 读MSR MPERF的条件是什么?
我正在尝试阅读 MPERF 和 APERF MSR。但是,当我这样做时,机器重新启动,可能是因为 GP 异常。
这是我使用的代码:
代码在 rdmsr 上中断。我有一个英特尔 Haswell 处理器。我正在以长模式运行。
我很确定我在 Ring 0 中运行,因为我运行的是我自己的操作系统。此外,如果我这样做:
它毫无例外地工作。
读取此特定寄存器 (MPERF) 的其他条件是什么?
linux - 无法在 Core i7 中禁用硬件预取器
尝试在我的 Core i7 系统中禁用硬件预取器时出现错误。我按照链接如何以编程方式禁用硬件预取?
在我的系统中
grep -i msr /boot/config-$(uname -r)
CONFIG_X86_DEBUGCTLMSR=y
CONFIG_X86_MSR=y
CONFIG_SCSI_ARCMSR=m
这是我的错误信息
根@ ./rdmsr 0x1a0
850089
[root@ ./wrmsr -p 0 0x1a0 0x850289(在 Core i7 中禁用硬件预取器)
wrmsr:pwrite:输入/输出错误
我在禁用相邻缓存行预取器时遇到同样的错误
知道如何解决这个问题吗?提前致谢 。