為何取 CPUID EBX 值會亂跳!? |
答題得分者是:aftcast
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
[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 發送簡訊給我 |
|
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
不是沒有回傳的原因。有回傳值的
網路上流傳的就是這個。至於 EAX ,0 是取 CPUVendor 我有下載 CPUID 詳細,但沒空看。我主要是想將 硬碟編號、CPUID,BIOS ID 由MD5 產生一組唯一機械碼。做註冊用 但經過二週研究(也花了許多功夫及銀子)發現目前所有付費取上述系統資訊的程式。 均 CPUID 的 EBX 都有問題 ,許多大牌付費元件乾脆遮蔽 EBX 只取 EAX,ECX,EDX。 不清楚原因,我後來也就不求甚解,將 EBX 遮蔽。 我記得很早年 P3 吧,記得並無此問題也是 Intel 的。 不過發現同一批貨,序號居然都一致。 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
我想應該不是那樣吧? 官方的 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 發送簡訊給我 |
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
剛又看了最新版的文件,發現原來那二個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 發送簡訊給我 |
看了一上午的原文資料後,答案出來了!
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 發送簡訊給我 |
結論:
參考 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 兄熱心研究此議題,雖然有部分缺乏我想要知道的。 但仍在此表達感謝! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |