Italian community of Lazarus and Free Pascal

Programmazione => Componenti Aggiuntivi => Topic aperto da: DragoRosso - Maggio 17, 2023, 03:58:50 pm

Titolo: Accesso diretto alla CPU in HARDWARE
Inserito da: DragoRosso - Maggio 17, 2023, 03:58:50 pm
Vi siete mai chiesti quali sono, dove e come accedere ai registri hardware della CPU ?
Ai miei tempi era semplice, l'accesso all'hardware era diretto, ma con l'avvento dei sistemi virtualizzati o meno basati sul kernel e sui RING (livelli si sicurezza hardware), ciò non è stato più possibile.

Ma molti tool visualizzano dati che non sono disponibili ai normali programmi, molti di questi richiedono un accesso privilegiato per evitare usi abusivi.

Quello che vi propongo oggi invece è uno strumento (purtroppo per i linuxiani è solo per Windows) che consente di accedere direttamente all'hardware di tutta la CPU, senza privilegi durante l'uso.

Io lo uso da una vita per controllare la temperatura del package della CPU ed eventualmente apportare le opportune modifiche / avvisi / .... nei software che sviluppo.

Il tutto si compone di due parti, uno è un driver kernel Windows firmato, l'altro è il wrapper pascal al driver (l'esempio che vi porto è limitato all'uso che ho indicato, ma siete liberi di sbizzarirvi).

Attenzione che si possono fare danni, in particolare il servizio è comunque a tutto il sistema WINDOWS di qualunque utente, e quindi può essere soggetto ad usi abusivi da parte di altri software / persone.

Comunque l'uso è semplicissimo e può portare dei "pro" ad diversi "softweristi".

Andiamo a vedere i dettagli:

N.B.: per lo scompattamento usate un 7-ZIP o altro, non l'explorer di windows in quanto marca i file come "dubbi".

1) Uno zip contenente il driver e la licenza d'uso. Potete scompattarlo in una qualsiasi directory, poi usate i "cmd" inclusi CHE DEVONO ESSERE FATTI GIRARE con i privilegi elevati. In particolare "Install.cmd" installa il drive in partenza auotmatica con il sistema operativo, da qui in poi l'avrete sempre a disposizione senza usare più privilegi elevati. PRIMA DI ESEGUIRE IL FILE INSTALL.CMD DOVETE EDITARE LO STESSO E PORRE il valore di "binPath=" uguale alla directory (disco compreso) dove avete scompattato lo zip.

2) Il wrapper.

3) L'esempio d'uso è indicato il questo post.

Crete un nuovo progetto Lazarus, inserite nelle Uses il wrapper in allegato
Inserite un BUTTON.
Generate gli eventi FormCreate, FormClos, ButtonClick e sovrascrivete il codice postato.

N.B.: DAL WRAPPER ho volontariamente tolto la funzionalità di scrittura dei registri CPU, in quanto può ipoteticamente generare danni hardware in alcune serie di CPU Intel (scrittura di alcuni registri per la gestione energetica).

Codice: [Seleziona]
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  CLoseAction := caFree;
  ChiudiMsr;
end;

procedure TForm1.Button1Click(Sender: TObject);
var p: UInt64;
begin
  //Leggi temperatura del package CPU serie 12 !!!!
  if LeggiMsr($01b1, 0, p) then
    begin
      Button1.Caption := (100 - Word((p and ($7F0000)) shr 16)).ToString+' °'; //Temperatura package per CPU Intel serie 12
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ApriMsr;
end;

Per chi vuole sbizzarirsi con la manualistica Intel, questo è il sito: https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html (https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html)

Consiglio:

(dovrete cercare la manualistica del vs. processore)
12th Generation Intel Core Processor Family - Vol 1.pdf
12th Generation Intel Core Processor Family - Vol 2.pdf
12th Generation Intel Core Processor Family - Updates.pdf

e quello generico e mastodontico

Intel® 64 and IA-32 Architectures.pdf (cinquemlia pagine circa .... 8) )
Ciao e buon divertimento.
Titolo: Re:Accesso diretto alla CPU in HARDWARE
Inserito da: doc - Maggio 18, 2023, 09:10:29 pm
Interessante.... :o
Mi sta palesando l'idea di usarlo per far sì che un mio programma modifichi, da sè, il moltiplicatore della CPU.

Comunque, ottimo post DragoRosso, si vede che ne sai.
Titolo: Re:Accesso diretto alla CPU in HARDWARE
Inserito da: DragoRosso - Maggio 19, 2023, 12:10:53 am
A proposito, i commenti parlano della serie 12 Intel, ma quella funzione è disponibile in tutte le serie "Intel Core" dalla "Second Generation" chiamata Sandy Bridge (stiamo parlando degli anni 2011).

Interessante.... :o
Mi sta palesando l'idea di usarlo per far sì che un mio programma modifichi, da sè, il moltiplicatore della CPU.

 :o  :o  :o ;D
Titolo: Re:Accesso diretto alla CPU in HARDWARE
Inserito da: bonmario - Maggio 19, 2023, 08:17:57 am
Vi siete mai chiesti quali sono, dove e come accedere ai registri hardware della CPU ?

L'ultima volta che l'ho fatto, avevo ancora il mio primo PC: un 80286 della Olivetti ... potrei avere ancora il sorgente in qualche backup !!!
Naturalmente, all'epoca usavo il Turbo Pascal !

Ciao, Mario
Titolo: Re:Accesso diretto alla CPU in HARDWARE
Inserito da: doc - Maggio 22, 2023, 06:49:09 pm
Mi sorge un dubbio.....DragoRosso.
Tu che ne sai una in più del diavolo: ma funziona anche per accedere ai registri di una CPU AMD Ryzen PRO 6000 Series Processors?
Titolo: Re:Accesso diretto alla CPU in HARDWARE
Inserito da: DragoRosso - Maggio 22, 2023, 07:18:08 pm
Dai sorgenti, vedo che la funzione interna chiamata dal driver è "readmsr" che può essere eseguita solo al ring 0 (modalità protetta livello kernel) ed è chiamata tramite il DDK di Windows che è generico e non dipendente dal processore.

Da quel che ne sò l'istruzione è presente anche nel processori AMD, ma non conosco la mappatura dei registri.

Direi quindi che si, può essere fatta girare anche nei sistemi AMD. Và verificata la mappatura e la funzionalità.

Il registro 0x01b1 dei processori Intel contiene, tra l'altro, il valore di temperatura inversa ossia il delta tra la temperatura massima di "giunzione" ammessa e la temperatura attuale. La temperatura massima dovrebbe essere definita a 100 gradi Celsius per tutti i processori Intel.

Se tutto corrisponde anche in AMD allora è OK.

Riporto lo schema del registro 0x1b1.

Ciao
Titolo: Re:Accesso diretto alla CPU in HARDWARE
Inserito da: doc - Maggio 23, 2023, 11:15:12 pm
@ DragoRosso
Ho provato, sembrerebbe funzionare anche su AMD (la cpu indicata prima). L'unica cosa che trovo strana è che i valori non sono gli stessi che mi riporta, invece, CPUID Hardware Monitor Pro: in linea di massima vi è una differenza di circa 4/5 °C in più sui dati del registro della CPU. Se trovo la documentazione AMD in merito la posto. Grazie mille.
Titolo: Re:Accesso diretto alla CPU in HARDWARE
Inserito da: DragoRosso - Maggio 23, 2023, 11:28:40 pm
Se non vado errato, qualche tempo fa lessi qualcosa sulla temperatura massima delle CPU AMD: mi pare fosse 95 gradi Celsius, quindi al posto di 100 devi inserire 95 nella espressione.

Ciao