过去十年中的所有英特尔CPU(至少)都包括一组可以计算各种事件的性能监视器.最新的Intel CPU,Core i3,i5和i7(又名Nehalem)是否提供计算每时钟指令(IPC)的机制?如果是这样,他们是如何使用的?
如果这是可能的,我可能会在汇编中为此编写代码,但Windows或Linux系统调用也可能有用.
英特尔的64位IDT门描述符中有一个段选择器.但是,根据我对5部分英特尔手册的理解,中断处理程序的线性地址从IDT门描述符中指定的64位偏移量加载到RIP中.
段选择器的唯一用途是检查:
我的问题是:
提前谢谢了!
我创建了一个简单的pin工具,可以转储任何win32 CreateFileW调用.它工作正常,但当我尝试将它附加到已经运行的进程时,该过程只是终止.尝试了几个应用程序(记事本,wordpad,Internet Explorer),相同的结果.这是我使用的命令:
.\pin -pid 8804 -t dumpfile.dll
Run Code Online (Sandbox Code Playgroud)
我有一个提示尝试关闭多线程,如下所示:
.\pin -mt 0 -pid 8804 -t dumpfile.dll
Run Code Online (Sandbox Code Playgroud)
但它没有帮助.还尝试了另一个,开箱即用的pintool,也没有工作,所以问题不在我的pintool.有任何想法吗?
提前致谢!
生成的操作码:
or ebx, 0ffffffffh
Run Code Online (Sandbox Code Playgroud)
与NASM是:
83CBFF
Run Code Online (Sandbox Code Playgroud)
但在英特尔说明手册中:
81 /1 id OR r/m32, imm32
83 /1 ib OR r/m32, imm8
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么NASM使用操作码83代替81,以及如何生成操作码81?
这是NASM的命令行: nasm -fwin32 file.asm -l list.lst
在之前的Stackoverflow 回答中,玛格丽特·布鲁姆 (Margaret Bloom) 说道:
\n\n\n\n\n唤醒 AP
\n\n这是通过向所有 AP 发出 INIT-SIPI-SIPI (ISS) 序列来实现的。
\n\n将发送 ISS 序列的 BSP 使用“全部排除自身”简写作为目的地,从而针对所有 AP。
\n\nSIPI(启动处理器间中断)会被所有在收到 SIPI 时被唤醒的 CPU 忽略,因此,如果第一个 SIPI 足以唤醒目标处理器,则第二个 SIPI 将被忽略。出于兼容性原因,英特尔建议这样做。
\n
我多年来一直在编写多处理代码,我对硬件的观察是,在某些处理器上,它似乎与所述不同。我很确定我已经观察到应用处理器 (AP) 在收到启动 IPI 后修改了其指令指针,即使它处于活动状态(不在等待启动 IPI 中)。
\n\n是否有任何英特尔文档说明 AP在不处于等待启动 IPI 状态时收到启动 IPI 后将执行的操作,或将行为记录为未定义?我似乎无法在英特尔软件文档手册或补充英特尔文档Minimal Boot Loader for Intel\xc2\xae Architecture中找到明确的答案。
\n\n通常,我编写初始化代码来初始化并启动 AP,假设 AP 可以获取 SIPI 并在活动状态(而不是等待启动 IPI 状态)下重置其指令指针。
\n\n我正在尝试确定 Margaret Bloom 声明的准确性,即先前已唤醒的 …
在这篇文章和这篇文章之后,我正在这个 GitHub Gistmain.c上编译代码。
运行 CMake 命令find_package(OpenCL REQUIRED)我得到这个:
-- 寻找 CL_VERSION_2_2 - 已找到 -- 找到 OpenCL: C:/Program Files (x86)/IntelSWTools/system_studio_2020/OpenCL/sdk/lib/x86/OpenCL.lib (找到版本“2.2”)
表明已找到 OpenCL SDK 版本 2.2。这与我从clinfo工具中检测到适用于英特尔 SDK/平台的 1.2 OpenCL 的结果相矛盾。现在,当运行可执行文件时,我得到:
cl_version.h:CL_TARGET_OPENCL_VERSION 未定义。默认为 220 (OpenCL 2.2)
我的问题是:
clinfo?PS 这是输出cmake .. --debug-find
首先,我不知道我是否应该在这里问这个问题,或者在 Electronics StackExchange 中问这个问题,所以如果您认为我应该在那里问这个问题,请告诉我。
我对测量 Intel CPU 中每个 CPU 核心的能耗感兴趣。我已阅读 Intel 的 Intel 64 开发人员手册,据我了解,RAPL 将提供以下方面的能耗估算:
这表明我能期望的最好结果是 CPU 中所有内核的集体能耗值。然而,我也知道“RAPL不是模拟功率计,而是使用软件功率模型”,根据https://01.org/blogs/2014/running-average-power-limit-%E2%80 %93-rapl。
我想知道的是,这个模型的工作方式是已知的还是公开的?并且,是否可以使用 RAPL 或其他接口提供的指标来估计各个核心功耗?我知道,如果英特尔不通过 RAPL 提供此信息,则可能无法获得它,但我想至少找到一个证实这一点的来源。
感谢您的帮助!
尽管单词的常见定义(如维基百科所述)是:
用于指定存储器中的位置的最大可能地址大小通常是硬件字(这里,“硬件字”是指处理器的全尺寸自然字,而不是使用的任何其他定义)。
根据一些消息来源,x86 系统注意到它被视为 16 位:
在 x86 PC(Intel、AMD 等)中,虽然架构很早就支持 32 位和 64 位寄存器,但其本机字大小可以追溯到 16 位起源,“单个”字为 16 位。“双”字是 32 位。请参阅 32 位计算机和 64 位计算机。
然而英特尔的官方文档(sdm 第 2 卷,第 1.3.1 节)指出:
这意味着字的字节从最低有效字节开始编号。图 1-1 说明了这些约定。
图 1-1 显示了 x86-64 上下文中单词的小端序列中的 4 个字节,而不是 2 个字节或 8 个字节(如上面链接的来源的不同定义所建议的那样):
我对这一切真正感到困惑的是如何获取和解析指令。我正在编写一个模拟器,一旦我解析 PE 格式的可执行文件并进入文本部分,如果我要遵循 4 字节小端格式,这是否意味着将首先解析第 4 个字节?
让我们组成一些字节,例如:
.text segment buffer:
< 0x10, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20 > ....
Run Code Online (Sandbox Code Playgroud)
我会将第一条指令解析为 1C、1B、1A、10、20、1F、1E、1D ...(等等,由于长度可变,显然可能有更多的单词需要读取,具体取决于这里的实际字节是什么)?
哪个逻辑处理器属于 P 核心组,哪个属于 E 核心组?
我的第一个想法是检查每个逻辑处理器的基本时钟,然后假设最低的基本时钟属于 E 核(根据英特尔规范,E 核的基本时钟总是明显低于 P 核)。
我希望HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor在注册表中进行检查就足够了。不幸的~MHz是始终包含 P 核的基本时钟。
我一直在EnterCriticalSection对 Windows 10 上的函数进行逆向工程,发现了这个有趣的自旋循环:
它是这样的:
lbl_loop:
mov ecx, [rsp+60h]
mov ecx, [rsp+60h]
mov ecx, [rsp+60h]
pause
mov ecx, [rsp+60h]
inc ecx
mov [rsp+60h], ecx
cmp ecx, eax
jb lbl_loop
Run Code Online (Sandbox Code Playgroud)
[rsp+60h]所以我的问题是 -循环读取 4 次然后写回的目的是什么?
为什么他们不能这样做:
lbl_loop:
pause
inc ecx
cmp ecx, eax
jb lbl_loop
mov [rsp+60h], ecx
Run Code Online (Sandbox Code Playgroud)
附言。请注意,这是 Windows 10 的生产版本。其余功能EnterCriticalSection均已优化。所以这不是调试版本。