CnPack Forum


 
Subject: 如何获取多核、多cpu系统中指定cpu的序列号
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-1-23 13:42  Profile | Blog | P.M.  | QQ
如何获取多核、多cpu系统中指定cpu的序列号

如何获取多核、多cpu系统中指定cpu的序列号
http://www.cnpack.org
CnPack IV  QQ Group: 130970
2007-01-23
感谢:Passion,Bahamut,早安,空气,SkyJacker...
没有Bahamut的奇思妙点,就没有这片文章。

在多cpu、多核中,会随机的获得不同的序列号.
这就为我们根据cpu序列号来制作注册机带来了很大的麻烦。
Windows 2000/xp允许设置进程和线程的亲缘性。
换句话说,可以控制哪个C P U能够运行某些线程。这称为硬亲缘性。
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: string;
const
  CPUINFO = 'CPU制造商: %S  序列号: %x';
var
  s: array[0..19] of Char;
  MyCpuID: Integer;
begin
  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
  end;
  Result := Format(CPUINFO, [s, MyCpuID]);
end;

function GetCPUID: TCPUID; assembler; register;
asm
  PUSH    EBX         {Save affected register}
  PUSH    EDI
  MOV     EDI, EAX    [email={@Resukt]{@Resukt[/email]}
  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
end;

获取cpu的序列号:
function GetCnCPUID(): string;
const
  CPUINFO = '%.8x-%.8x-%.8x-%.8x';
var
  iEax: Integer;
  iEbx: Integer;
  iEcx: Integer;
  iEdx: Integer;
begin
  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
  end;
  Result := Format(CPUINFO, [iEax, iEbx, iEcx, iEdx]);
end;

2、如何获取指定cpu或指定cpu核的序列号。

根据Windows可以设置进程和线程的亲缘性的特点,使用SetProcessAffinityMask函数,
来控制哪个cpu来运行获取序列号的进程,因此也就获取了指定的cpu的序列号。
为了和单cpu兼容,建议总是获取第一个cpu的序列号。

procedure SetCPU(h: THandle;CpuNo: Integer);
//CpuNo:决定了获得第几个cpu内核的第几个序列号。
var
  ProcessAffinity: Cardinal;
  _SystemAffinity: Cardinal;
begin
    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)
end;

使用方法:
SetCPU(GetCurrentProcess,1); //第一个cpu的第一个cpu内核
ShowMessage(GetCnCPUID);

如果要更灵活的操作,可以通过注册表来获取cpu的数量:
在注册表下:
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

后记:这片文章源于CnPack 群里关于获取多核CPU的ID的问题讨论。
感谢CnPack 群里的所有成员。
BS下"早安空气",竟然说“你在你短暂的生命里花大量的时间去做这个没有价值的事情”-_-!!超级BS、BS、BS……^_^
for I:=0 to 10000000000000000000000000000 do
   BS;

附录“早安空气”语录:
"放弃吧,API不适合你"
"你在你短暂的生命里花大量的时间去做这个没有价值的事情"

[ 本帖最后由 skyjacker 于 2007-1-23 16:38 编辑 ]




一壶清茶煮青春.
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6758
Posts 3555
点点分 6758
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-1-23 13:49  Profile | Blog | P.M. 
貌似现在发技术帖都习惯顺便bs水版板“早安空气”
Top
bahamut8348
灌水司司长
Rank: 6Rank: 6


UID 4743
Digest Posts 14
Credits 337
Posts 79
点点分 337
Reading Access 10
Registered 2007-1-18
Status Offline
Post at 2007-1-23 13:52  Profile | Blog | P.M. 
多BS下是好事啊,后后
这就充分证明了空气的知名度啊

还有,这个不是我的奇思妙点,而是在客户那里遇到的问题,其实偶很懒滴




做人要厚道,看帖要回贴
Top
kendling (小冬)
高级版主
Rank: 8Rank: 8
MyvNet


Medal No.1  
UID 703
Digest Posts 5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
Post at 2007-1-23 14:25  Profile | Site | Blog | P.M.  | QQ | Yahoo!
支持支持。。。




小冬
http://MyvNet.com
Top
koalaone
新警察
Rank: 1



UID 4832
Digest Posts 0
Credits 17
Posts 4
点点分 17
Reading Access 10
Registered 2007-1-21
Status Offline
Post at 2007-1-26 15:34  Profile | Blog | P.M. 
bs下
Top
zzzl (早安的空气)
版主
Rank: 7Rank: 7Rank: 7



UID 590
Digest Posts 0
Credits 399
Posts 199
点点分 399
Reading Access 100
Registered 2004-11-29
Status Offline
Post at 2007-2-1 20:43  Profile | Blog | P.M.  | QQ
  最后的那个哪是附录?根本就是参考文献嘛
Top
Passion (LiuXiao)
管理员
Rank: 9Rank: 9Rank: 9


UID 359
Digest Posts 19
Credits 6758
Posts 3555
点点分 6758
Reading Access 102
Registered 2004-3-28
Status Offline
Post at 2007-2-2 11:14  Profile | Blog | P.M. 
还好不是鸣谢。
Top
kendling (小冬)
高级版主
Rank: 8Rank: 8
MyvNet


Medal No.1  
UID 703
Digest Posts 5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
Post at 2007-2-5 21:44  Profile | Site | Blog | P.M.  | QQ | Yahoo!
哈哈,什么变鸣谢了?




小冬
http://MyvNet.com
Top
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-2-5 22:11  Profile | Blog | P.M.  | QQ
类似于熊猫烧香鸣谢单位:
      卡巴
      瑞兴
      蒋民
      ........




一壶清茶煮青春.
Top
kendling (小冬)
高级版主
Rank: 8Rank: 8
MyvNet


Medal No.1  
UID 703
Digest Posts 5
Credits 978
Posts 580
点点分 978
Reading Access 101
Registered 2005-2-18
Location 广东
Status Offline
Post at 2007-2-6 00:53  Profile | Site | Blog | P.M.  | QQ | Yahoo!


不错不错。




小冬
http://MyvNet.com
Top
wangdragon
新警察
Rank: 1



UID 32258
Digest Posts 0
Credits 7
Posts 2
点点分 7
Reading Access 10
Registered 2007-11-24
Location 广东
Status Offline
Post at 2007-11-24 14:13  Profile | Blog | P.M.  | QQ
上面的取CPU有问题,发一下Bahamut的函数

function GetCPUID: TCPUID; assembler; register;
asm
  PUSH    EBX         {Save affected register}
  PUSH    EDI
  MOV     EDI, EAX    {@Resukt}
  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
end;

function GetCPUIDStr: string; //返回CPU序列号
  var
    CPUID: TCPUID;
    ProcessAffinity, _SystemAffinity: Cardinal;
begin
  GetProcessAffinityMask(GetCurrentProcess, ProcessAffinity, _SystemAffinity);
  SetProcessAffinityMask(GetCurrentProcess, 1);
  CPUID:= GetCPUID;
  Result:= IntToHex(CPUID[1], 2) + '-' +
           IntToHex(CPUID[2], 2) + '-' +
           IntToHex(CPUID[3], 2) + '-' +
           IntToHex(CPUID[4], 2);
  SetProcessAffinityMask(GetCurrentProcess, ProcessAffinity);
end;




为什么不能用呀
Top
skyjacker
版主
Rank: 7Rank: 7Rank: 7
茶农


UID 2239
Digest Posts 9
Credits 617
Posts 269
点点分 617
Reading Access 100
Registered 2006-6-8
Status Offline
Post at 2007-11-26 14:58  Profile | Blog | P.M.  | QQ
谢谢

最终版本在 cnpack\Source\Common\CnHardWareInfo.pas 中的 TCnCpuId
在 cnpack\Examples 中有 Demo CnCpuID.

欢迎测试




一壶清茶煮青春.
Top
wsc188
新警察
Rank: 1



UID 39119
Digest Posts 0
Credits 28
Posts 11
点点分 28
Reading Access 10
Registered 2008-3-22
Status Offline
Post at 2008-6-18 10:56  Profile | Blog | P.M. 
急!!~救命呀..

procedure SetCPU(h: THandle;CpuNo: Integer);
//CpuNo:决定了获得第几个cpu内核的第几个序列号。
var
  ProcessAffinity: Cardinal;
  _SystemAffinity: Cardinal;
begin
    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)
end;

使用方法:
SetCPU(GetCurrentProcess,1); //第一个cpu的第一个cpu内核

我怎么在主程序用了..SetCPU(GetCurrentProcess,1);
在退出程序时.就像死机一样慢的呀,.!~
哪个可以说下是怎么回事吗?
多谢!~~
Top
bahamut8348
灌水司司长
Rank: 6Rank: 6


UID 4743
Digest Posts 14
Credits 337
Posts 79
点点分 337
Reading Access 10
Registered 2007-1-18
Status Offline
Post at 2008-6-18 20:27  Profile | Blog | P.M. 
LS的,跟个断点,看看执行在什么地方慢




做人要厚道,看帖要回贴
Top
 




All times are GMT++8, the time now is 2024-4-27 05:53

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.009344 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP