zoukankan      html  css  js  c++  java
  • 如何获取多核、多cpu系统中指定cpu的序列号

    如何获取多核、多cpu系统中指定cpu的序列号
    作者:SkyJacker
    (转贴请保持完整并注明作者和出处)
    http://www.cnpack.org
    CnPack IV  QQ Group: 130970
    2007-01-23

    感谢:Passion,Bahamut,早安,空气,SkyJacker...
    没有Bahamut的奇思妙点,就没有这片文章。

    在多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    
        
    以下三个函数,可供参考:

    [c-sharp] view plaincopy
     
    1. function NewCPUID: string;  
    2. const  
    3.   CPUINFO = 'CPU制造商: %S  序列号: %x';  
    4. var  
    5.   s: array[0..19] of Char;  
    6.   MyCpuID: Integer;  
    7. begin  
    8.   FillChar(s, 20, 0);  
    9.   asm  
    10.     push ebx  
    11.     push ecx  
    12.     push edx  
    13.     mov  eax, 0  
    14.     cpuid  
    15.     mov  dword  ptr  s[0],    ebx  
    16.     mov  dword  ptr  s[4],    edx  
    17.     mov  dword  ptr  s[8],    ecx  
    18.     mov  eax,  1  
    19.     cpuid  
    20.     mov  MyCpuID,  edx  
    21.     pop edx  
    22.     pop ecx  
    23.     pop ebx  
    24.   end;  
    25.   Result := Format(CPUINFO, [s, MyCpuID]);  
    26. end;   
    27.   
    28. function GetCPUID: TCPUID; assembler; register;  
    29. asm  
    30.   PUSH    EBX         {Save affected register}  
    31.   PUSH    EDI  
    32.   MOV     EDI, EAX    [email={@Resukt]{@Resukt[/email]}  
    33.   MOV     EAX, 1  
    34.   DW      $A20F       {CPUID Command}  
    35.   STOSD               {CPUID[1]}  
    36.   MOV     EAX, EBX  
    37.   STOSD               {CPUID[2]}  
    38.   MOV     EAX, ECX  
    39.   STOSD               {CPUID[3]}  
    40.   MOV     EAX, EDX  
    41.   STOSD               {CPUID[4]}  
    42.   POP     EDI         {Restore registers}  
    43.   POP     EBX  
    44. end;   
    45.   
    46. //获取cpu的序列号:  
    47.   
    48. function GetCnCPUID(): string;  
    49. const  
    50.   CPUINFO = '%.8x-%.8x-%.8x-%.8x';  
    51. var  
    52.   iEax: Integer;  
    53.   iEbx: Integer;  
    54.   iEcx: Integer;  
    55.   iEdx: Integer;  
    56. begin  
    57.   asm  
    58.     push ebx  
    59.     push ecx  
    60.     push edx  
    61.     mov  eax, 1  
    62.     DW $A20F//cpuid  
    63.     mov  iEax, eax  
    64.     mov  iEbx, ebx  
    65.     mov  iEcx, ecx  
    66.     mov  iEdx, edx  
    67.     pop edx  
    68.     pop ecx  
    69.     pop ebx  
    70.   end;  
    71.   Result := Format(CPUINFO, [iEax, iEbx, iEcx, iEdx]);  
    72. end;  

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

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

    [c-sharp] view plaincopy
     
    1. procedure SetCPU(h: THandle;CpuNo: Integer);  
    2. //CpuNo:决定了获得第几个cpu内核的第几个序列号。  
    3. var  
    4.   ProcessAffinity: Cardinal;  
    5.   _SystemAffinity: Cardinal;  
    6. begin  
    7.     GetProcessAffinityMask(h, ProcessAffinity, _SystemAffinity) ;  
    8.     ProcessAffinity := CpuNo; //this sets the process to only run on CPU 0  
    9.                               //for CPU 1 only use 2 and for CPUs 1 & 2 use 3  
    10.     SetProcessAffinityMask(h, ProcessAffinity)  
    11. end;   

    使用方法:

    SetCPU(GetCurrentProcess,1); //第一个cpu的第一个cpu内核
    ShowMessage(GetCnCPUID);


    后记:这片文章源于CnPack 群里关于获取多核CPU的ID的问题讨论。
    感谢CnPack 群里的所有成员。

    BS下'早安空气',竟然说“你在你短暂的生命里花大量的时间去做这个没有价值的事情”-_-!!超级BS、BS、BS……^_^
    for I:=0 to 10000000000000000000000000000 do
       BS;

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

    参考:http://blog.csdn.net/iseekcode/article/details/5284803

  • 相关阅读:
    常见的兼容问题
    css3新增伪类
    完美的js运动框架
    C++ 常用宏
    多线程代码段 自清理线程
    寒假自学(十一)
    寒假自学(十)
    寒假自学(九)
    寒假自学(八)
    寒假自学(七)
  • 原文地址:https://www.cnblogs.com/findumars/p/4176420.html
Copyright © 2011-2022 走看看