全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4590
推到 Plurk!
推到 Facebook!

為何取 CPUID EBX 值會亂跳!?

答題得分者是:aftcast
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-08 15:54:53 IP:61.222.xxx.xxx 訂閱

[code delphi]
type
TCPUIDARRAY = array[1..4] of Longint;

Function GetCPUIDA: TCPUIDARRAY; 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;

var
C :TCPUIDARRAY;
begin
C := GetCPUID;
Caption := InttoHex(C[1],8)
InttoHex(C[2],8) InttoHex(C[3],8) InttoHex(C[4],8);
end;

[/code]

EBX 值大約每間隔幾秒就不一樣。Why?
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-19 18:21:14 IP:60.248.xxx.xxx 訂閱
當你使用 mov eax,1 時,ebx並沒有回傳值。
僅回傳eax (version info) 和edx (features info)

這隻網路上流傳的程式主要是用在eax=0的時候。

因此,ebx當然不同時間進去時就會是不同的,沒回傳嘛!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-19 22:32:52 IP:122.126.xxx.xxx 訂閱
不是沒有回傳的原因。有回傳值的
網路上流傳的就是這個。至於 EAX ,0 是取 CPUVendor

我有下載 CPUID 詳細,但沒空看。我主要是想將 硬碟編號、CPUID,BIOS ID 由MD5 產生一組唯一機械碼。做註冊用
但經過二週研究(也花了許多功夫及銀子)發現目前所有付費取上述系統資訊的程式。
均 CPUID 的 EBX 都有問題 ,許多大牌付費元件乾脆遮蔽 EBX 只取 EAX,ECX,EDX。

不清楚原因,我後來也就不求甚解,將 EBX 遮蔽。
我記得很早年 P3 吧,記得並無此問題也是 Intel 的。
不過發現同一批貨,序號居然都一致。
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-09-20 09:43:45 IP:59.115.xxx.xxx 訂閱
我想應該不是那樣吧?  官方的 intel文件有寫

Table 3-4. Information Returned by CPUID Instruction

Initial EAX Value Information Provided about the Processor
0 EAX
EBX
ECX
EDX
Maximum CPUID Input Value (2 for the Pentium® Pro processor and 1 for
the Pentium processor and the later versions of Intel486™ processor that
support the CPUID instruction).
“Genu”
“ntel”
“ineI”
1 EAX
EBX
ECX
EDX
Version Information (Type, Family, Model, and Stepping ID)
Reserved
Reserved
Feature Information
2 EAX
EBX
ECX
EDX
Cache and TLB Information
Cache and TLB Information
Cache and TLB Information
Cache and TLB Information
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-20 09:45:53 IP:59.115.xxx.xxx 訂閱
請下載官方文件

http://download.intel.com/design/pentium/MANUALS/24319101.PDF

裡面Table 3-4有寫

免費可下載的。寫的非常的詳細!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-20 11:14:34 IP:59.115.xxx.xxx 訂閱
剛又看了最新版的文件,發現原來那二個reserve register 目前已經有許多cpu有support。應該是intel p4以後大多就有用到。但正確的使用方法還在看文件中…

所以為何會一直跳? 原因應該是ebx中的某些bit你的cpu沒有support?!

參照二個重要文件:

http://www.intel.com/assets/pdf/appnote/241618.pdf

http://softwarecommunity.intel.com/isn/Downloads/Intel SSE4 Programming Reference.pdf

研究中…有新發現再post。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-20 13:30:00 IP:59.115.xxx.xxx 訂閱
看了一上午的原文資料後,答案出來了!

1/ ebx內含有關於mutithread和multicore的資料,所以如果你的cpu是沒有HT(hyper threading)或是多核(Muti Core)能力,那這裡就不會有正確的回傳值

2/ 如果你的cpu有那些能力,那麼這個ebx的確是會傳回一些資料。不過每一次的值也會不同。因為31-21bit裡關於apic的部份會因為不同的 logical processer會有不同的結果。你難以確定你每次執行這程式時都是用到同一個loical processer。

除了上面回應的參考資料外,請 再參考下面的重要資料

http://softwarecommunity.intel.com/articles/eng/2697.htm

http://softwarecommunity.intel.com/Wiki/Processorfeaturedetection/529.htm


此外,ebx中15-8bit是clflush的cache line size,是關於clflush的cpu指令,它是在 sse2以後才有的。k8或是p4以後才有support sse2。 換句話說,若你是在之前的cpu,那這裡的值也就不正確了。

整個cpuid要使用正確,必需要有許多的先前判別才可以取得你想要的資訊。

http://www.intel.com/assets/pdf/appnote/241618.pdf 這本EBOOK的第7章有寫到細節!

希望數小時的研究能對大家有幫助! ^_^
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-21 16:09:48 IP:122.126.xxx.xxx 訂閱
結論:

參考 http://www.intel.com/software/products/documentation/vlin/mergedprojects/analyzer_ec/mergedprojects/reference_olh/mergedProjects/instructions/instruct32_hh/vc46.htm
得知 EBX 結構
Bits 7 - 0 : CPU字串索引 Brand Index
Bits 15 - 8 : CLFLUSH line size
Bits 23 - 16 : number of logical processors ....
Bits 31 - 24 : Local APIC ID 處理器 ID

發生變化 是在 24 - 31 Bits 。

在多核環境下每次執行的 APIC ID 是不同的(可能是第一顆或第二顆執行)。
可以利用 SetProcessAffinityMask API 綁定 Process。
這樣就不會因每次讀取的值發生變化了。


在這裡 aftcast熱心研究此議題,雖然有部分缺乏我想要知道的。
但仍在此表達感謝!
系統時間:2024-04-25 15:03:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!