问题标签 [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.
assembly - 内联汇编代码的准确解释?
我真的很想知道内联汇编的确切解释。
我基本上知道内联汇编的样子:
下面是一个例子:
两者都没有“破坏”部分。
首先,在 cpuGetMSR 中,我认为这意味着
是正确的解释吗?但是 rdmsr 去哪儿了?我需要可以帮助我解释 cpuGetMSR() 和 cpuSetMsr() 的人。谢谢
encryption - MSR DUKPT 的 MAC 变体?
目前我正在研究 ChipCard EMV 设备解密。下面是我使用交易后的相关数据(TLV格式作为标签长度值):
我知道这个设备的 BDK 是0123456789ABCDEFFEDCBA9876543210
. 根据解密指令,它提到 DFDF59 包含以下标签:
每条指令都提到了“ MSR DUKPT 的 MAC 变体”,其中 MAC 代表消息验证码,以及“通过 TLV 格式解析数据。对于加密的数据标签,使用 TDES_Decrypt_CBC 对其进行解密”。
我尝试通过 KSN、BDK 和加密数据 DFDF59 使用 3DES DUKPT。它行不通。解密领域的任何人都可以给我一些建议吗?我们的供应商非常不愿意分享他们的知识......
我不知道 MAC 如何在解密中真正发挥作用....我认为 MAC 只是一个完整性检查....我正在使用从 KSN 和 BDK 生成的 3DES DUKPT 会话密钥。这适用于该设备中的其他解密,但不能解决 DFDF59(芯片卡 EMV 解密)......这就是为什么我开始怀疑我是否使用了正确的会话密钥......随意只是把想法扔在那里。谢谢!
windows - 如何在 Windows 中写入调试寄存器?
我想从用户模式写入 x64 Windows 上的调试寄存器。最简单的方法是什么?
(我只能想出在驱动程序中编写汇编代码并导出此功能)
谢谢!
linux-kernel - /dev/cpu/cpu0/msr 和 /sys/class/powercap/energy_uj 的能量读数之间的差异
我发现我可以使用 /dev/cpu/cpu0/msr 文件使用 MSR_PKG_ENERGY_STATUS 以及读取 /sys/class/powercap/energy_uj 文件来测量能耗。尽管这两个为特定程序提供了大致相同的值,但我想知道这两个文件中的哪一个提供了更准确的结果,以及需要多个接口来获取能量读数。两者是否相互依赖?
intel - 大型程序的 LBR
英特尔处理器中的最后一个分支记录功能。它们是否适合具有大量分支的大型程序?如果是的话,你如何通过使用 Haswell 的 16 个 MSR 寄存器来找到整个路径?
linux - wrsmr 命令没有在 MSR 中注册我的输入
我有以下环境:ubuntu 12.04
kernel 3.2.0-29-generic-pae
全部安装在parallels version 11.0.1
. 我已经msr-tools
使用apt-get
命令安装了。
我的问题是当我执行以下应该在 msr 寄存器上写入值的命令时,没有任何反应。它没有返回错误,但是当我使用rdmsr
来读取相同的寄存器时,它会显示以前的值。
我在这里想念什么?当我运行 wrmsr 命令时,为什么我的输入没有注册到 msr 寄存器中?这是我尝试过的总结
linux-kernel - 如何在所有 CPU 上执行一段内核代码?
我正在尝试制作一个内核模块来为 x87 FPU 启用 FOP 兼容模式。这是通过设置IA32_MISC_ENABLE
MSR 中的位 2 来完成的。这是代码:
它似乎可以工作,但在多个insmod/rmmod
周期中,我有时会得到dmesg
兼容模式仍未启用的输出,尽管它是在wrmsr
. 经过一番思考,我意识到这是因为模块代码是在不同的逻辑 CPU 上执行的(我有 Core i7 和 4 核 * HT=8 逻辑 CPU),所以我有 1/8 的机会在rmmod
. 在重复循环大约 20 次后,我得到了一致的“启用”打印,并且我的用户空间应用程序很高兴地使用它。
所以现在我的问题是:如何让我的代码在系统上存在的所有逻辑 CPU 上执行,以便为所有这些 CPU 启用兼容模式?
linux-kernel - 使用 RDTSC 精确测量最大循环计数
我正在为 C 和 x64 程序集中的二进制搜索开发低级例程,并尝试测量搜索未缓存数组(RAM 中的数据)的确切执行时间。根据分支预测的“幸运”程度,在同一个数组中搜索不同目标所需的时间差异很大。我可以准确地测量最小和中值执行时间,但我发现很难测量最大执行时间。
问题是分支预测的最坏情况在时间上与平均情况加上处理器中断相当。最坏的情况和中断都是罕见的,但我还没有想出一个好的方法来区分一个罕见的事件和另一个。标准方法只是过滤掉所有“异常”的高测量值,但这只有在两者之间有明确的界限时才有效。
所以问题变成了,“我如何区分被中断的测量和合法地比其他测量花费更长的时间? ”
或者更一般地说,“如何在不预先假设硬最大值的情况下测量执行时间的完整分布? ”
内核是否存储任何我可以查询的关于是否发生中断的信息?我可以在测量之前和之后查询的东西会告诉我测量是否被中断?理想情况下,它会告诉我中断需要多长时间,但只要知道测量受到影响将是一个很好的开始。
也许除了(或代替)RDTSC,我可以使用 RDPMC 读取一个计数器,该计数器测量在 Ring 0(内核)而不是 Ring 3(用户)中花费的周期数?是否可能已经设置了一个计数器来执行此操作,还是我需要自己设置?我需要创建自己的内核模块来执行此操作,还是可以使用现有的 ioctls?
一些背景:
我主要在 Intel Skylake i7-6700 上运行 Ubuntu 14.03 Linux 4.2.0,但也在 Intel Sandy Bridge 和 Haswell 上进行测试。我已经尽我所能尽可能地减少系统上的抖动。我用CONFIG_NOHZ_FULL重新编译了一个无滴答内核,没有强制抢占,透明的大页面支持关闭,定时器频率为 100 Hz。
我已经停止了大多数不必要的进程,并删除了大多数不必要的内核模块。我正在使用cpuset / cset shield为单个进程保留一个 NoHZ 内核,并使用内核/调试/跟踪来验证我收到的中断很少。但我仍然得到足够的精确测量是困难的。也许更重要的是,我可以设想未来的长尾情况(一个很少需要调整大小的哈希表),能够区分有效和无效的测量值将非常有帮助
我正在使用英特尔在其白皮书中建议的技术测量 RDTSC/RDTSCP 的执行时间,并且通常获得我期望的准确性。我的测试涉及搜索 16 位值,并且我重复和单独地对不同长度的随机数组的 65536 个可能搜索中的每一个进行计时。为了防止处理器学习正确的分支预测,每次都以不同的顺序重复搜索。每次使用“CLFLUSH”搜索后,搜索的数组都会从缓存中删除。
这是一个研究项目,我的目标是了解这些问题。因此,我愿意采用可能被认为是愚蠢和极端的方法。自定义内核模块、保护模式 x64 程序集、未经测试的内核修改和处理器特定功能都是公平的游戏。如果有办法摆脱少数剩余的中断,以便所有测量都是“真实的”,那也可能是一个可行的解决方案。感谢您的建议!
intel - Haswell 微架构在 perf 中没有 Stalled-cycles-backend
我在 Haswell CPU(Intel Core i7-4790)上安装了 perf。但是“性能列表”不包括“停滞周期前端”或“停滞周期后端”。我检查了http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html并没有从表 19 中找到与stalled-cycles-backend 相关的性能事件- 7(第 4 代 Intel Core 处理器的处理器内核中的非架构性能事件)。
所以我的问题是:如何在 Haswell CPU 内核中使用 perf 或其他工具测量停滞周期后端。内核是3.19,性能版本也是3.19。
谢谢
linux - 如何启用 linux perf 工具的分支采样
我使用linux perf工具收集程序的分支信息,命令和结果如下:
/pro/cpuinfo 中的内容如下:
apic
并且bts
输入flags
得到加强(我想要但只是被“**”封装)而且我不知道这种情况下还有什么重要的。其他 7 个处理器与处理器 0 相同。
通过修改 /boot/grub/grub.cfg 添加引导参数“lapic”:
只需添加条目lapic
。linux
但是重启后没有任何意义。
我的问题:
1)错误信息是什么意思?
2) perf 工具分支采样是否使用 Intel Branch Trace Store(BTS)?还是最后一个分支记录(LBR)?
3) 如何查找 LBR 支持?
4) x86 32bit 和 64bit 之间的 LBR 和 BTS 支持有什么不同?
我的操作系统是Ubuntu 14.04 64bit
:
perf 安装说明:
更新:
/proc/interrupts 的内容:
我安装ubuntu 16.10 64bit
在我的电脑上并perf record -b
成功运行。我认为内核linux-tools-4.2.0-27-generic
或linux-cloud-tools-4.2.0-27-generic
包中可能有问题。