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

  • 相关阅读:
    Windows Azure Storage (17) Azure Storage读取访问地域冗余(Read Access – Geo Redundant Storage, RA-GRS)
    SQL Azure (15) SQL Azure 新的规格
    Azure China (5) 管理Azure China Powershell
    Azure China (4) 管理Azure China Storage Account
    Azure China (3) 使用Visual Studio 2013证书发布Cloud Service至Azure China
    Azure China (2) Azure China管理界面初探
    Azure China (1) Azure公有云落地中国
    SQL Azure (14) 将云端SQL Azure中的数据库备份到本地SQL Server
    [New Portal]Windows Azure Virtual Machine (23) 使用Storage Space,提高Virtual Machine磁盘的IOPS
    Android数据库升级、降级、创建(onCreate() onUpgrade() onDowngrade())的注意点
  • 原文地址:https://www.cnblogs.com/findumars/p/4176420.html
Copyright © 2011-2022 走看看