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