Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CPUID (https://www.delphipraxis.net/97629-cpuid.html)

EarthQuaker 13. Aug 2007 22:20


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!!!

Muetze1 13. Aug 2007 22:32

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: AMD CPUID Specification

EarthQuaker 14. Aug 2007 00:31

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:
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.
also das gilt als beispiel ob es richtig ist keine ahnung aber vielleicht weis du jetzt was ich damit meine!!!!

Muetze1 14. Aug 2007 06:45

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: L2 Cache Grösse ermitteln bei AMD & Intel

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.

EarthQuaker 14. Aug 2007 12:04

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 :)

Muetze1 14. Aug 2007 12:19

Re: CPUID
 
Zitat:

Zitat von EarthQuaker
Und die mache ich des genau?

Befasse dich mit den logischen Operatoren AND, OR, SHR, SHL. Damit bekommst du alles raus, was du brauchst.

Ansonsten nutze fertiges: JEDI TCPUID Klasse

EarthQuaker 14. Aug 2007 17:11

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

Muetze1 14. Aug 2007 18:44

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:
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;
oder einzeilig:
Delphi-Quellcode:
 lDWORD := ( lDWORD shr 14 ) and $f;
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.

EarthQuaker 14. Aug 2007 19:14

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

Muetze1 14. Aug 2007 19:50

Re: CPUID
 
Zitat:

Zitat von EarthQuaker
Also irgendwie Stelle ich mich grade zu dumm an keien ahnung wieso aber grade ist es so..

Ich stell mich auch gerade an - von daher nein. Grundlegend die Berechnung der L2 Grösse ist in dem o.g. Link schon zu finden. Das anpassen bzw. ermitteln der anderen Informationen habe ich beschrieben. Und falls der Groschen heute noch nicht fällt, morgen nochmal lesen und probieren. Probier es einfach schrittweise. Wenn du dabei dann auf Probleme stösst, helfen wir dir gerne hier weiter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:26 Uhr.
Seite 1 von 2  1 2      

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