很早之前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指令,测量程序的运行速度”