很早之前Intel曾经提供过一个使用RDTSC在DOS下计算CPU频率的程序(在CPUID的Datasheet中)。简单的说就是延时一个固定的时间,然后看这个时间内经过了多少个指令周期,经过计算就能得到CPU的频率。下面的程序实现了在UEFI环境下计算频率的功能,同时也可以作为插入汇编指令的参考。需要注意,这是32位UEFI环境下,如果在64位的Shell环境下这样做是不行的。
//
// FreqCalc.C
//
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellLib.h>
EFI_SYSTEM_TABLE *gST;
EFI_BOOT_SERVICES *gBS;
UINT64 rdtsc()
{
UINT64 value;
__asm
{
rdtsc
mov dword ptr value,eax
mov dword ptr [value + 4],edx
}
return value;
}
//
// Entry point function - ShowVersion
//
EFI_STATUS
EFIAPI
UefiMain (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
UINT64 elsp;
gST = SystemTable;
gBS = SystemTable->BootServices;
elsp=rdtsc();
gBS -> Stall(1000000);
Print(L"CPU Frequency: %ld \n", rdtsc()-elsp);
return EFI_SUCCESS;
}
程序运行的结果:
虚拟机中运行的CPUZ读取的结果:
代码下载
特别的,有资料指出在当前的多核环境下,这样的方法并不准确,具体的原因请参考下面的文章
1. http://blog.csdn.net/solstice/article/details/5196544 “多核时代不宜再用 x86 的 RDTSC 指令测试指令周期和时间”
2. http://blog.chinaunix.net/uid-24774106-id-2779245.html “使用rdtsc指令,测量程序的运行速度”

