Delphi-PRAXiS

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.

EarthQuaker 15. Aug 2007 07:42

Re: CPUID
 
Ok Danke

EarthQuaker 15. Aug 2007 09:06

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:
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;
Also gilt ja für L2Cache

für L1Data ist es ja dann nur:
Delphi-Quellcode:
  mov eax,$80000005
  cpuid
  shr ecx,24
und für L1 Instr sollte es ja dann meiner meinung nach:
Delphi-Quellcode:
  mov eax,$80000005
  cpuid
  shr edx,24
sein... aber da gibt er mir einen fwert von 320KB aus der rest stimmt!!

Muetze1 15. Aug 2007 10:39

Re: CPUID
 
Zitat:

Zitat von EarthQuaker
und für L1 Instr sollte es ja dann meiner meinung nach:
Delphi-Quellcode:
  mov eax,$80000005
  cpuid
  shr edx,24
sein... aber da gibt er mir einen fwert von 320KB aus der rest stimmt!!

Soweit alles richtig. Hast du auch beachtet der Variablen, welche den Wert nachher aufnimmt, DX und nicht CX zu zu weisen?

EarthQuaker 15. Aug 2007 12:07

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

fLaSh11 15. Aug 2007 13:07

Re: CPUID
 
Zitat:

Zitat von EarthQuaker
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

Wenn du Probleme mit der Installation hast, dann schau dir mal das an!

EarthQuaker 15. Aug 2007 14:27

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

taktaky 24. Aug 2007 22:49

Re: CPUID
 
Hallo,

vielleicht können Sie mir über die Format meiner CPU-ID helfen?
da:
http://www.delphipraxis.net/internal...=767325#767325

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