![]() |
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:26 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