如何获取多核cpu工作原理,多cpu系统中指定cpu的序列号

如何获取多核、多cpu系统中指定cpu的序列号
如何获取多核、多cpu系统中指定cpu的序列号
作者:SkyJacker
(转贴请保持完整并注明作者和出处)
CnPack IV& QQ Group: 130970
感谢:Passion,Bahamut,早安,空气,SkyJacker...
没有Bahamut的奇思妙点,就没有这片文章。
在多cpu、多核中,会随机的获得不同的序列号.这就为我们根据cpu序列号来制作注册机带来了很大的麻烦。
Windows 2000/xp允许设置进程和线程的亲缘性。换句话说,可以控制哪个
能够运行某些线程。这称为硬亲缘性。Windows提供了设置亲缘性的函数SetProcessAffinityMask
。使用它可控制获取指定cpu的序列号。
本文分为2部分:
1、如何获得cpu的序列号。
2、如何获取指定cpu或指定cpu核的序列号。
1、如何获得cpu的序列号。
使用cpuid指令来获取。
在调用CPUID之前,EAX中存放的是功能代码。在调用CPUID之后,EAX,EBX,ECX,EDX存放的是CPU的各种特征信息。这些信息也就是我们通常所说的CPU序列号。
& mov& eax,
0& //获取制造商信息
& mov& eax,& 1
//获得CPU的序列号
以下三个函数,可供参考:
function NewCPUID:
& CPUINFO = 'CPU制造商: %S&
序列号: %x';
& s: array[0..19] of C
& MyCpuID: I
& FillChar(s, 20, 0);
mov& eax, 0
mov& dword& ptr&
mov& dword& ptr&
mov& dword& ptr&
mov& eax,& 1
mov& MyCpuID,& edx
& Result := Format(CPUINFO, [s, MyCpuID]);
function GetCPUID: TCPUID;
EBX&&&&&&&&
{Save affected register}
EDI, EAX&&&
[email={@Resukt]{@Resukt[/email]}
$A20F&&&&&&
{CPUID Command}
STOSD&&&&&&&&&&&&&&
{CPUID[1]}
STOSD&&&&&&&&&&&&&&
{CPUID[2]}
STOSD&&&&&&&&&&&&&&
{CPUID[3]}
STOSD&&&&&&&&&&&&&&
{CPUID[4]}
EDI&&&&&&&&
{Restore registers}
//获取cpu的序列号:
function GetCnCPUID():
& CPUINFO = '%.8x-%.8x-%.8x-%.8x';
mov& eax, 1
$A20F//cpuid
mov& iEax, eax
mov& iEbx, ebx
mov& iEcx, ecx
mov& iEdx, edx
& Result := Format(CPUINFO, [iEax, iEbx, iEcx,
2、如何获取指定cpu或指定cpu核的序列号。
根据Windows可以设置进程和线程的亲缘性的特点,使用SetProcessAffinityMask函数,来控制哪个cpu来运行获取序列号的进程,因此也就获取了指定的cpu的序列号。为了和单cpu兼容,建议总是获取第一个cpu的序列号。
procedure SetCPU(h: THCpuNo:
//CpuNo:决定了获得第几个cpu内核的第几个序列号。
& ProcessAffinity: C
& _SystemAffinity: C
GetProcessAffinityMask(h, ProcessAffinity, _SystemAffinity) ;
ProcessAffinity := CpuNo; //this sets the process to only run on
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//for CPU 1 only use 2 and for CPUs 1 & 2 use 3
SetProcessAffinityMask(h, ProcessAffinity)
使用方法:
SetCPU(GetCurrentProcess,1);
//第一个cpu的第一个cpu内核
ShowMessage(GetCnCPUID);
后记:这片文章源于CnPack 群里关于获取多核CPU的ID的问题讨论。
感谢CnPack 群里的所有成员。
BS下'早安空气',竟然说“你在你短暂的生命里花大量的时间去做这个没有价值的事情”-_-!!超级BS、BS、BS……^_^
for I:=0 to 00000 do
附录“早安空气”语录:
'放弃吧,API不适合你'
'你在你短暂的生命里花大量的时间去做这个没有价值的事情'
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1432人阅读
在多cpu、多核中,会随机的获得不同的序列号.这就为我们根据cpu序列号来制作注册机带来了很大的麻烦。Windows 2000/xp允许设置进程和线程的亲缘性。换句话说,可以控制哪个 CPU 能够运行某些线程。这称为硬亲缘性。Windows提供了设置亲缘性的函数SetProcessAffinityMask 。使用它可控制获取指定cpu的序列号。
本文分为2部分:
1、如何获得cpu的序列号。2、如何获取指定cpu或指定cpu核的序列号。
1、如何获得cpu的序列号。
使用cpuid指令来获取。在调用CPUID之前,EAX中存放的是功能代码。在调用CPUID之后,EAX,EBX,ECX,EDX存放的是CPU的各种特征信息。这些信息也就是我们通常所说的CPU序列号。
&&mov&&eax, 0&&//获取制造商信息&&cpuid&&&&&&mov&&eax,&&1 //获得CPU的序列号&&cpuid&&&&&&&&以下三个函数,可供参考:
function NewCPUID:const&&CPUINFO = 'CPU制造商: %S&&序列号: %x';var&&s: array[0..19] of C&&MyCpuID: Ibegin&&FillChar(s, 20, 0);&&asm&&&&push ebx&&&&push ecx&&&&push edx&&&&mov&&eax, 0&&&&cpuid&&&&mov&&dword&&ptr&&s[0],&&&&ebx&&&&mov&&dword&&ptr&&s[4],&&&&edx&&&&mov&&dword&&ptr&&s[8],&&&&ecx&&&&mov&&eax,&&1&&&&cpuid&&&&mov&&MyCpuID,&&edx&&&&pop edx&&&&pop ecx&&&&pop ebx&&&&Result := Format(CPUINFO, [s, MyCpuID]);
function GetCPUID: TCPUID;asm&&PUSH&&&&EBX&&&&&&&& {Save affected register}&&PUSH&&&&EDI&&MOV&&&& EDI, EAX&&&&}&&MOV&&&& EAX, 1&&DW&&&&&&$A20F&&&&&& {CPUID Command}&&STOSD&&&&&&&&&&&&&& {CPUID[1]}&&MOV&&&& EAX, EBX&&STOSD&&&&&&&&&&&&&& {CPUID[2]}&&MOV&&&& EAX, ECX&&STOSD&&&&&&&&&&&&&& {CPUID[3]}&&MOV&&&& EAX, EDX&&STOSD&&&&&&&&&&&&&& {CPUID[4]}&&POP&&&& EDI&&&&&&&& {Restore registers}&&POP&&&& EBX
//获取cpu的序列号:
function GetCnCPUID():const&&CPUINFO = '%.8x-%.8x-%.8x-%.8x';var&&iEax: I&&iEbx: I&&iEcx: I&&iEdx: Ibegin&&asm&&&&push ebx&&&&push ecx&&&&push edx&&&&mov&&eax, 1&&&&DW $A20F//cpuid&&&&mov&&iEax, eax&&&&mov&&iEbx, ebx&&&&mov&&iEcx, ecx&&&&mov&&iEdx, edx&&&&pop edx&&&&pop ecx&&&&pop ebx&&&&Result := Format(CPUINFO, [iEax, iEbx, iEcx, iEdx]);
2、如何获取指定cpu或指定cpu核的序列号。
根据Windows可以设置进程和线程的亲缘性的特点,使用SetProcessAffinityMask函数,来控制哪个cpu来运行获取序列号的进程,因此也就获取了指定的cpu的序列号。为了和单cpu兼容,建议总是获取第一个cpu的序列号。
procedure SetCPU(h: THCpuNo: Integer);//CpuNo:决定了获得第几个cpu内核的第几个序列号。var&&ProcessAffinity: C&&_SystemAffinity: Cbegin&&&&GetProcessAffinityMask(h, ProcessAffinity, _SystemAffinity) ;&&&&ProcessAffinity := CpuNo; //this sets the process to only run on CPU 0&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//for CPU 1 only use 2 and for CPUs 1 & 2 use 3&&&&SetProcessAffinityMask(h, ProcessAffinity)
使用方法:
SetCPU(GetCurrentProcess,1); //第一个cpu的第一个cpu内核ShowMessage(GetCnCPUID);
后记:这片文章源于CnPack 群里关于获取多核CPU的ID的问题讨论。感谢CnPack 群里的所有成员。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4995次
排名:千里之外
(2)(3)(1)(1)评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
赞助商广告
相关内容推荐}

我要回帖

更多关于 多核操作系统 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信