如何获取多核、多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
以下三个函数,可供参考:
- 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);
后记:这片文章源于CnPack 群里关于获取多核CPU的ID的问题讨论。
感谢CnPack 群里的所有成员。
BS下'早安空气',竟然说“你在你短暂的生命里花大量的时间去做这个没有价值的事情”-_-!!超级BS、BS、BS……^_^
for I:=0 to 10000000000000000000000000000 do
BS;
附录“早安空气”语录:
'放弃吧,API不适合你'
'你在你短暂的生命里花大量的时间去做这个没有价值的事情'
参考:http://blog.csdn.net/iseekcode/article/details/5284803
如何获取多核、多cpu系统中指定cpu的序列号的更多相关文章
- C++获取Windows7 32位系统中所有进程名(类似于任务管理器中的进程)
代码是网上查找资料,然后自己调试,修改之后可以运行. 系统:win7 32位,VS2008 ------------------------------------------------------ ...
- Linux系统下的CPU、内存、IO、网络的压力测试
本文转载自:小豆芽博客 一.对CPU进行简单测试: 1.通过bc命令计算特别函数 例:计算圆周率 echo "scale=5000; 4*a(1)" | bc -l -q MATH ...
- h.264并行解码算法2D-Wave实现(基于多核共享内存系统)
cache-coherent shared-memory system 我们最平常使用的很多x86.arm芯片都属于多核共享内存系统,这种系统表现为多个核心能直接对同一内存进行读写访问.尽管内存的存取 ...
- 梦回----32位CPU和64位CPU的通用寄存器
1 32位Intel的CPU通用寄存器 32位CPU所含有的寄存器有:4个数据寄存器(EAX.EBX.ECX和EDX):2个变址和指针寄存器(ESI和EDI):2个指针寄存器(ESP和EBP):6个段 ...
- Linux系统中CPU使用率查询常用的5个命令
在程序开发中,我们一般都是在Linux系统上进行开发,因此对Linux系统的维护工作很重要.在Linux系统维护中,我们需要经常查看的就是cpu的使用率,分析系统的整体运行情况.那CPU使用率怎么查询 ...
- linux系统中的基础监控(硬盘,内存,系统负载,CPU,网络等)
Linux系统常见日常监控 系统信息 查看 CentOS 版本号:cat /etc/redhat-release 综合监控 nmon 系统负载 命令:w(判断整体瓶颈) 12:04:52 up 1 ...
- 获取系统中所有进程&线程信息
读书笔记--[计算机病毒解密与对抗] 目录: 遍历进程&线程程序 终止进程 获取进程信息 获取进程内模块信息 获取进程命令行参数 代码运行环境:Win7 x64 VS2012 Update3 ...
- 如何获取Android系统中申请对象的信息
最近一直在做有关内存方面的优化工作,在做优化的过程,除了关注内存的申请量以及GC的情况之外,我们经常需要想方法找出是那些对象占用了大量内存,以及他们是如何导致GC的,这意味着我们需要获取对象申请的信息 ...
- Java获取Linux和Window系统CPU、内存和磁盘总使用率的情况
这是一个工具类,获取的内容: CPU使用率:得到的是当前CPU的使用情况,这是算出的是两次500毫秒时间差的CPU使用率 内存使用率:[1 - 剩余的物理内存/(总的物理内存+虚拟内存) ] * 1 ...
随机推荐
- CSS居中的实现用法实例
转载的一篇文章,讲解css内容居中的. 网上有关css 居中的文章不胜枚举,不过大多没有做系统的总结.这里分享的这篇有关css居中的文章,个人感觉不错,值得收藏. 一.水平居中1,将元素水平居中(us ...
- How to generate number Sequence[AX 2012]
Suppose we want create number sequence for Test field on form in General ledger module Consideratio ...
- js 数组去重复键
Array.prototype.deleteEle = function() { var newArr = this; for (var i = newArr.length - 1; i >= ...
- 通过js获取DropDownList的选中项
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...
- Oracle 动态视图4 V$SESSION_WAIT & V$SESSION_EVENT
一.视图V$SESSION_WAIT显示了session的当前等待事 Column Datatype Description SID NUMBER Session identifier SEQ# NU ...
- python学习第四天第一部分
1.字典的特性:无序.去重.查询速度快.比list占用内存多. 2.字典查询速度快的原因:因为他是哈希类型的. 3.什么是(hash)哈希? hash把任意长度的二进制映射为较短的固定长度的二进制,这 ...
- perl中shift 和unshift 操作
##################################################################### unshift 和shift 对一个数组的开头进行操作(数组 ...
- WPF的UI布局(Layout)WPF读书笔记(第三天)
WPF的布局元素有一下几个 Grid:网格.可以自定义行和列并且通过行列的数目.行高和列宽来调整控件的布局. StackPanel:格式面板.可将包含的元素在水平方向或者竖直方向排成一条线. ...
- js 前加分号和感叹号是什么意思?
;!function(){}(); ;!有什么用? 从语法上来开,Javascript中分号表示语句结束,在开头加上,可能是为了压缩的时候和别的方法分割一下,表示一个新的语句开始.所以,如果在一个单 ...
- Wireshark - ICMP 报文分析
1. 测试机器,源 IP 地址为 10.21.28.110,目的 IP 地址为 10.6.0.24. 2. 使用 "ip.addr == 10.6.0.24 and icmp" 过 ...