![]() |
CPUID
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo euch zusammen... wollte mal fragen ob mir jemand mal bei einem problem helfen kann... und zwar geht es darum bestimmte bereiche auszulesen.. kleines bsp. ist als anhang... also geht darum de L1 - L2 Cache größe auszulesen. adressen kenne ich alle bzw. sieht man ja auch auf dem bild. aber die frage ist wie kann ich den text abfragen!? danke schonmal an euch allen dir mir da helfen können!!!
|
Re: CPUID
Was für einen Text meinst du? Das ist doch nur die Dekodierung des EDX Wertes anhand des Inhalts und unter Beachtung der Dokumentation. Was meinst du in so fern genau?
Anscheinend kennst du es noch nicht, von daher: ![]() |
Re: CPUID
das weis ich ja aber es geht dies zu dekodieren.. also z.b.
auf dem bild die 1024 L2 Cache... würde gerne nur die werte auslesen also jeweils die Level Cache größe
Delphi-Quellcode:
also das gilt als beispiel ob es richtig ist keine ahnung aber vielleicht weis du jetzt was ich damit meine!!!!
const
ID_BIT = $200000; // EFLAGS ID bit type TL2CacheSize = array[1..4] of Longint; function L2CacheSize : TL2CacheSize; assembler; register; asm PUSH EBX {Save affected register} PUSH EDI MOV EDI,EAX {@Resukt} MOV EAX,$80000006 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; procedure TDemoForm.GetButtonClick(Sender: TObject); var CPUID : TL2CacheSize; begin Label1.Caption := IntToStr(CPUID[3] shr 16 and $FFFF); end; end. |
Re: CPUID
Ich weiss nicht, wo das Problem liegt. Du holst dir die ganzen Werte in dein Array. Nun kannst du doch die Bits wie in der verlinkten Anleitung ausmaskieren und die jeweils erhaltenen Werte nach der Anleitung als richtige Cache Grössen ausgeben. Ich kapier wirklich nicht wo das Problem liegt.
Ein Beispiel hatte ich schonmal hier gepostet: ![]() Beachte, das jeder Hersteller bei den CPUID Angaben zum Cache sein eigenes Süppchen kocht. Mit dem Beispiel wirst du den L1 Cache ergänzen können. |
Re: CPUID
Und die mache ich des genau? dein bsp zeigt zwar schon was aber was z.b. mit dem rest dann? dumm gefragt.... könntest nen kleinen source hochladen.. wo z.b. L1-L2 Size, associativity, lines/tag, linesize dabei ist`? kenne mich da nämlcih ne wirklich so guddi aus mit dem array!
Bin ja auch kein Super progger... ander sind ne so guddi und andere sind halt besser und haben mehr erfahrung :) |
Re: CPUID
Zitat:
Ansonsten nutze fertiges: ![]() |
Re: CPUID
Danke dir... leider lassen sich die JEDI Komponenten nicht installieren. also wenn ich die install.bat ausführe komt ein fehler das er eine datei namens jediinstaller.exe nicht finden kann
|
Re: CPUID
Ok, dann mache es doch selber. Du hast in dem Array nach dem Aufruf von CPUID die Inhalte der Register EAX, EBX, ECX und EDX. In der oben verlinkten Dokumentation findest du zu jedem CPUID Aufruf die entsprechende Dokumentation der Bits.
Ok, nun zu dem auslösen der Bitinformationen. Beispiel: Im Register EAX steht eine Information in den Bits 14 bis 17 - also 4 Bits (ein Nibble). Diesen Wert willst du nun erhalten, dazu gehst du wie folgt vor: Du schiebst (english: shift) die Bits runter zu Bit 0, also 14x schieben. Dies kannst du mit dem SHR (shift right) Befehl erledigen. Wenn du also den Wert mit shr 14 um 14 Bits geschoben hast, dann stehen die ehemals Bit 14 bis Bit 17 an Stelle von Bit 0 bis 3 (da wir die ja runtergeschoben haben). Danach sind die Bits 18 bis 32 auch noch vorhanden und mit runtergerutscht und liegen nun auf Bit 4 bis 18. Diese wollen wir aber nicht haben und von daher maskieren wir diese aus. Dazu dient uns eine logische UND Operation. Dabei wird der Wert mit AND und der Maske verarbeitet, wobei die Maske an den Bits eine 1 enthalten muss, wo das vorhandene Bit unverändert bleiben soll und eine 0 an den Bits, welche ausgeblendet (auf 0 gesetzt) werden sollen. Für unser Beispiel würde sich somit eine Maske ergeben, welche Bit 0 bis 3 auf 1 gesetzt hat und alle restlichen Bits auf 0. Diese binäre Schreibweise in Hexadezimalschreibweise ergibt $f. Also mit AND $f arbeiten und du hast im Endeffekt direkt Bit 14 bis 17 nun in deiner Variable:
Delphi-Quellcode:
oder einzeilig:
var
lDWORD: LongWord; begin lDWORD := Random(MaxInt); lDWORD := lDWORD shr 14; // runterschieben um 14 Bits lDWORD := lDWORD and $f; // auskommentieren der anderen Bits ab Bit 4 ShowMessage(Format('bit 14 bis 17 enthielten: %d', [lDWORD])); end;
Delphi-Quellcode:
Ich denke mal, damit kannst du es probieren (und höchstwahrscheinlich auch schaffen) die Daten zu ermitteln. Probiere es und bei Problemen melde dich hier.
lDWORD := ( lDWORD shr 14 ) and $f;
|
Re: CPUID
Also irgendwie Stelle ich mich grade zu dumm an keien ahnung wieso aber grade ist es so.. kannst eventuell etwas für den L2 fertig machen? geht des? währe dir damit sehr verbunden... danke schonmal
|
Re: CPUID
Zitat:
|
Re: CPUID
Ok Danke
|
Re: CPUID
Hallo... so habe es jetzt geschaft bis auf deinen fehler... also L2 und L1 Data Cache Geht ohne probleme aber bei L1 Instr Cache zeigt er mir 320 KB an und das ist irgendwie falsch habe auch von ecx nach edx gemacht zum anfragen von L1 Instr Cache aber wie gesagt zeigt er mir dann 320 KB an :-D
Delphi-Quellcode:
Also gilt ja für L2Cache
Function GetL2CacheSize : String;
var Size: Word; Begin Asm push eax push ebx push ecx push edx mov eax,$80000006 cpuid shr ecx,16 mov Size,cx pop edx pop ecx pop ebx pop eax End; Result := IntToStr(Size) + ' KB' End; procedure TForm1.Button1Click(Sender: TObject); begin Label1.Caption := GetL2CacheSize; end; für L1Data ist es ja dann nur:
Delphi-Quellcode:
und für L1 Instr sollte es ja dann meiner meinung nach:
mov eax,$80000005
cpuid shr ecx,24
Delphi-Quellcode:
sein... aber da gibt er mir einen fwert von 320KB aus der rest stimmt!!
mov eax,$80000005
cpuid shr edx,24 |
Re: CPUID
Zitat:
|
Re: CPUID
aggro... hehe... nein siehste das habe ich ganz übersehen... ich teste es glich mal mal schauen was passiert :-)
Suppi es lag daran danke dir :-) da binsch jetzt bissel erleichtert... und des mit den anderen werden sollte ja dan denke ich auhc so einfach sein :-D d.h. werde des auch gleich noch mit machen damit ich dann alles hintermir habe :-D ^^ |
Re: CPUID
Zitat:
![]() |
Re: CPUID
Hallo ich nochmal ^^ mal noch eine frage.. habe jetzt des JCL und JVCL installiert bekommen... wie rufe ich jetzt das alles auf.. also JclYsyInfo habe ich in de Uses mit drinne und zum test also
Label1.Caption := JclSysInfo.VendorIDAMD; zeigt er mit an AuthenticAMD das stimmt alles soweit aber wie mache ich des das der von anfang an anzeigt das ich eine AMD CPU habe Besser gesagt wie ermittle ich welche VendorID ich habe? weil z.b. mit If JclSysInfo.AMD2_SSE3 <> 1 Then Label1.Caption := 'SSE3'; ist soweit alles klaro. aber ich habe was endekt zwecks isWinVista oder so ähnlich wie kann ich das aufrufen? PS. vielen dank an fLaSh11!!! komponenten sind perfekt :) und klappte wunderbar zu installieren |
Re: CPUID
Hallo,
vielleicht können Sie mir über die Format meiner CPU-ID helfen? da: ![]() Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz