PowerMonkey: Skirtumas tarp puslapio versijų

Iš Žinynas.
Jump to navigation Jump to search
(FIVR)
 
(nerodoma 2 tarpinės versijos, sukurtos to paties naudotojo)
1 eilutė: 1 eilutė:
 +
 +
[[Vaizdas:Aborting-powermonkey.png]]
 +
 
'''Sumažinkite procesoriaus energijos eikvojimą ir padidinkite našumą – ekologiškiau ir paprasčiau'''
 
'''Sumažinkite procesoriaus energijos eikvojimą ir padidinkite našumą – ekologiškiau ir paprasčiau'''
  
19 eilutė: 22 eilutė:
 
= Kaip veikia „PowerMonkey“ ? =
 
= Kaip veikia „PowerMonkey“ ? =
  
PowerMonkey naudoja [[UEFI]] programinės įrangos galimybę vykdyti vadinamąsias „programas“ prieš iškviečiant [[OS]] įkrovos programą. Tuo metu (su sąlyga, kad programinė įranga neužsiblokavo) galima (beveik) pilnai reguliuoti procesoriaus dažnį ir įtampą bei maitinimo valdymo konfigūraciją.
+
[[Vaizdas:Powermonkey-efi-boot-process.png]]
 +
 
 +
[https://github.com/psyq321/PowerMonkey PowerMonkey] naudoja [[UEFI]] programinės įrangos galimybę vykdyti vadinamąsias „programas“ prieš iškviečiant [[OS]] įkrovos programą. Tuo metu (su sąlyga, kad programinė įranga neužsiblokavo) galima (beveik) pilnai reguliuoti procesoriaus dažnį ir įtampą bei maitinimo valdymo konfigūraciją.
  
 
'''PASTABA:''' „PowerMonkey“ galima visiškai naudoti tik sistemose, naudojančiose [[S0iX]] („[[Connected Standby]]“ / „[[Modern Standby]]“ / „[[S0 Standby]]“) režimus. Sistemos, naudojančios seną [[S3]] miego režimą, grįš į platformoje užkoduotus nustatymus, kai atnaujins [[S3]] miego režimą. Kadangi [[UEFI]] DXE tvarkyklės / programos nėra įkeliamos iš naujo [[S3]] atnaujinimo eigos metu, prieš atnaujinant „[[Hypervisor]]“ negalima taikyti jokių nepaisymų.
 
'''PASTABA:''' „PowerMonkey“ galima visiškai naudoti tik sistemose, naudojančiose [[S0iX]] („[[Connected Standby]]“ / „[[Modern Standby]]“ / „[[S0 Standby]]“) režimus. Sistemos, naudojančios seną [[S3]] miego režimą, grįš į platformoje užkoduotus nustatymus, kai atnaujins [[S3]] miego režimą. Kadangi [[UEFI]] DXE tvarkyklės / programos nėra įkeliamos iš naujo [[S3]] atnaujinimo eigos metu, prieš atnaujinant „[[Hypervisor]]“ negalima taikyti jokių nepaisymų.
26 eilutė: 31 eilutė:
  
 
== Reikalavimai ==
 
== Reikalavimai ==
 +
 +
* Windows 10/11
 +
* Įdiegta Linux distribucija su Grub2 boot loaderiu (išjungtas arba įjungtas secureboot, nėra svarbu), asmeniškai naudota Fedora 41
 +
* Visual Studio 2022 su Visual C++ paketu
  
 
== Kompiliavimas ==
 
== Kompiliavimas ==
 +
 +
* Užkrovę Windows 10/11 parsisiunčiame ir įdiegiame Visual Studio 2022 su Visual C++ paketu.
 +
* Parsisiunčiame https://github.com/awyl/Build-PowerMonkey į '''C:\Build-PowerMonkey'''
 +
* Pakeičiame '''build.bat''' scriptą į esantį apačioje
 +
* Paleižiame '''X64 Native Tools Command Prompt for VS 2022'''
 +
* Nunaviguojame į '''C:\Build-PowerMonkey''' ''"cd C:\Build-PowerMonkey"''
 +
* Paleidžiame: '''setup.bat'''
 +
* Paredaguojame: '''CONFIGURATION.c''', suvedame visus reikalingus undervolt parametrus (apačioje pateiktas pavyzdys)
 +
* Paleidžiame: '''build.bat'''
 +
* Užmontuojame efi skirsnį per [[cmd]] ('''admin teisėmis''') ''"mountvol X: /s"'', turėtų atsirasti naujas '''X:''' diskas, kurį pasieksite tiktai per ta patį admin teisėmis paleistą cmd
 +
* Sukuriame naują direktoriją ''"mkdir x:\EFI\PowerMonkey"''
 +
* Nukopijuojame sukompiluotą efi failą ''"copy /y C:\Build-PowerMonkey\EFI\Boot\PowerMonkey.efi x:\EFI\PowerMonkey"''
 +
 +
=== build.bat ===
 +
 +
<syntaxhighlight lang="batch">
 +
@echo off
 +
 +
set PYTHON_HOME=%cd%\python
 +
set PYTHONPATH=%cd%\python
 +
set PYTHON_COMMAND=%cd%\python\python.exe
 +
set NASM_PREFIX=%cd%\nasm\
 +
set PATH=%cd%\edk2\BaseTools\bin\win32;%PATH%
 +
 +
copy /y CONFIGURATION.c edk2\MdeModulePkg\Application\PowerMonkeyApp
 +
cd edk2
 +
call edksetup.bat
 +
call build -m MdeModulePkg/Application/PowerMonkeyApp/PowerMonkey.inf
 +
copy /y Build\MdeModule\RELEASE_VS2019\X64\PowerMonkey.efi ..\EFI\Boot
 +
 +
cd ..
 +
</syntaxhighlight>
 +
 +
=== CONFIGURATION.c ===
 +
 +
'''Dėmesio!''' Pavyzdys skirtas tik Core i7-8750H procesoriui.
 +
 +
<syntaxhighlight lang="c">
 +
#include "Platform.h"
 +
#include "CONFIGURATION.h"    // <- enable tracing if PowerMonkey hangs!
 +
UINT8 gPostProgrammingOcLock = 1;
 +
UINT8 gEmergencyExit = 1;
 +
UINT8 gEnableSaferAsm = 1;
 +
UINT8 gDisableFirwmareWDT = 0;
 +
UINT64 gSelfTestMaxRuns = 0; /// DO NOT ENABLE YET (WIP)
 +
UINT8 gPrintPackageConfig = 1;
 +
UINT8 gPrintVFPoints_PostProgram = 1;
 +
VOID ApplyComputerOwnersPolicy(IN PLATFORM* sys)
 +
{
 +
  for (UINTN pidx = 0; pidx < sys->PkgCnt; pidx++) {   
 +
    PACKAGE* pk = sys->packages + pidx;
 +
    pk->Program_VF_Overrides[IACORE] =    1;    // Enable programming of VF
 +
    pk->Program_VF_Overrides[ECORE] = 0;        // Enable programming of VF
 +
    pk->Program_VF_Overrides[RING] =  1;        // Enable programming of VF
 +
    pk->Program_VF_Overrides[UNCORE] =    0;    // Enable programming of VF
 +
    pk->Program_VF_Overrides[GTSLICE] =  0;    // Enable programming of VF
 +
    pk->Program_VF_Overrides[GTUNSLICE] = 0;    // Enable programming of VF
 +
 +
    pk->planes[IACORE].VoltMode =
 +
      pk->planes[RING].VoltMode = V_IPOLATIVE;      // V_IPOLATIVE = Interpolate
 +
                                                    // V_OVERRIDE =  Override
 +
    pk->planes[IACORE].TargetVolts =
 +
      pk->planes[RING].TargetVolts = 0;            // in mV (absolute)
 +
 +
    pk->planes[IACORE].OffsetVolts = -150;          // in mV
 +
    pk->planes[RING].OffsetVolts = -130;            // in mV
 +
                                                    // (negative = undervolt)
 +
 +
    pk->planes[ECORE].VoltMode = V_IPOLATIVE;  // V_IPOLATIVE = Interpolate
 +
                                                // V_OVERRIDE =  Override
 +
 +
    pk->planes[ECORE].TargetVolts = 0;          // in mV (absolute)
 +
    pk->planes[ECORE].OffsetVolts = 0;          // in mV (negative = undervolt)
 +
 +
    pk->planes[UNCORE].VoltMode = V_IPOLATIVE;  // V_IPOLATIVE = Interpolate
 +
                                                // V_OVERRIDE =  Override
 +
 +
    pk->planes[UNCORE].TargetVolts = 0;        // in mV (absolute)
 +
    pk->planes[UNCORE].OffsetVolts = 0;        // in mV (negative = undervolt)
 +
 +
    pk->Program_VF_Points[IACORE] =                // 0 - Do not program
 +
      pk->Program_VF_Points[RING] = 0;              // 1 - Program
 +
                                                    // 2 - Print current values                                                   
 +
                                                    //    (2 does not program)
 +
   
 +
    // Hybrid Architectures (Alder Lake +): E-Cores
 +
 +
                                                    // 1 - Program
 +
    pk->Program_VF_Points[ECORE] = 0;              // 0 - Do not program
 +
                                                    // 2 - Print current values                                                   
 +
                                                    //    (2 does not program)
 +
  }
 +
}
 +
</syntaxhighlight>
 +
 +
Konfigūracijos undervolt:
 +
* CPU Core: -150mV
 +
* CPU Cache: -130mV
 +
  
 
== Pasirašymas ==
 
== Pasirašymas ==
  
 
Jeigu savo kompiuteryje turite išjungę secure boot, šį etapą galite praleisti.
 
Jeigu savo kompiuteryje turite išjungę secure boot, šį etapą galite praleisti.
 +
Šis etapas reikalauja įdiegtos Linux distribucijos su [https://github.com/hakuna-m/wubiuefi/wiki/MOKManager Mok Manager] ir [https://github.com/rhboot/shim shim loader] kuris įdiegtas kartu su [[grub2]].
  
 
Sukuriame failą '''x509-configuration.ini''' į jį irašome:
 
Sukuriame failą '''x509-configuration.ini''' į jį irašome:
75 eilutė: 184 eilutė:
 
         boot
 
         boot
 
   }
 
   }
Reikalui esant jeigu norime nustatyti numatytają įkrovos reikšmę redaguojame failą /etc/default/grub ir pakeičiame šią eilute:
+
Reikalui esant jeigu norime nustatyti numatytają įkrovos reikšmę redaguojame failą '''/etc/default/grub''' ir pakeičiame šią eilute:
 
   GRUB_DEFAULT=6
 
   GRUB_DEFAULT=6
 
Įgaliname naujus Grub nustatymus:
 
Įgaliname naujus Grub nustatymus:
 
   grub2-mkconfig -o /boot/grub2/grub.cfg
 
   grub2-mkconfig -o /boot/grub2/grub.cfg
 +
 +
== Patikrinimas kaip veikia ==
 +
 +
Prieš tikrinant ant Windows reikia išjungti "virtualization protected booting" poto patikrinus jį vėl įjungti, nes be jo neveiks [[wsl2]]. Paleidžiame cmd administratoriaus teisėmis ir rašome:
 +
  bcdedit /set hypervisorlaunchtype off
 +
Perkrauname kompiuterį ir įkrovę paleidžiame [https://www.techpowerup.com/download/techpowerup-throttlestop/ ThrottleStop] paspaudžiame '''FIVR''' ir dešiniame naujai atsidariusio lango kampe esančioje lentelėje turėtume matyti pvz:
 +
 +
[[Vaizdas:Powerthrottle fivr example.png]]
 +
 +
Matome jog CPU Core yra -0.1504, tai reiškia jog undervoltas veikia. Dabar galime grąžinti atgal "virtualization protected booting".
 +
bcdedit /set hypervisorlaunchtype auto
  
  

Dabartinė 11:02, 21 vasario 2024 versija

Aborting-powermonkey.png

Sumažinkite procesoriaus energijos eikvojimą ir padidinkite našumą – ekologiškiau ir paprasčiau

Iki 2020-ųjų visi žinojo, kas yra „overclocking“: sistemos priartinimas iki jos ribų didinant jos darbo dažnį, įtampą arba abu. Šis procesas buvo labai kontraversiškas, tačiau jis buvo tobulinamas, net kai kurios sistemos buvo „gamykliškai paspartintos“.

Tačiau daug mažiau žmonių yra girdėję apie analogą: "undervoltage". Įtampos mažinimas yra tam tikra prasme priešingas procesas nei didinimas: sumažinus procesoriaus įtampą, CPU sunaudoja daug mažiau energijos ir generuoja daug mažiau šilumos.

Įdomu tai, kad tai padarius termiškai ribotai sistemai, tokiai kaip nešiojamasis kompiuteris arba SFF (mažos formos) kompiuteris, sumažins šilumą ir pagerins našumą! Magija? Ne, fizika! Nešiojamojo kompiuterio aušinimo sistema gali pašalinti tik dalį šilumos, o kai to neužtenka, nebelieka kitos išeities, kaip tik riboti centrinį procesorių, kad būtų išvengta katastrofiško gedimo. Sumažinus įtampą aukštais dažniais, žymiai sumažėja galia ir šilumos išeiga, todėl sistema tampa vėsesnė ir greitesnė.

Iššūkiai[keisti]

Deja, vis sunkiau optimizuoti įprastą nešiojamąjį kompiuterį. Pirma, originalios įrangos gamintojai dažniausiai užrakina CPU įtampos reguliavimą. Šią problemą galima sušvelninti „atrakinant“ programinės aparatinės įrangos nustatymus, kad puikios programos, tokios kaip ThrottleStop, galėtų atlikti savo darbą (nebent platforma būtų visiškai užrakinta).

Tačiau matomos naujos problemos: hipervizorius kaip „Microsoft Hyper-V“ dabar naudoja net tokios galutinio vartotojo programos kaip WSL2 („Windows“ posistemė, skirta Linux). Kadangi „Hypervisor“ neleidžia virtualiai mašinai modifikuoti daugumos pagrindinio kompiuterio aparatinės įrangos registrų, tokios programos kaip „ThrottleStop“ arba „Intel XTU“ negali reguliuoti įtampos.

Kai programa bando įrašyti į aparatinės įrangos registrą, „Hypervisor“ sulaiko šį bandymą ir neatlieka tikrojo įrašymo. Teoriškai įmanoma, kad „Hypervisor“ pardavėjas įgyvendina rašymą, tačiau mažai tikėtina. Tai sukūrė naujų kliūčių įtampos reguliavimui ir panašiems aparatinės įrangos pakeitimams.

Niekas nesukeltų anksčiau minėtų problemų, jei originalios įrangos gamintojai leistų klientams koreguoti programinės įrangos sąrankos nustatymus. Tačiau daugumoje nešiojamųjų kompiuterių yra minimalios konfigūracijos parinktys, todėl savininkas negali koreguoti savo aparatinės įrangos. „PowerMonkey POC“ ketina išspręsti būtent šią problemą.

Kaip veikia „PowerMonkey“ ?[keisti]

Powermonkey-efi-boot-process.png

PowerMonkey naudoja UEFI programinės įrangos galimybę vykdyti vadinamąsias „programas“ prieš iškviečiant OS įkrovos programą. Tuo metu (su sąlyga, kad programinė įranga neužsiblokavo) galima (beveik) pilnai reguliuoti procesoriaus dažnį ir įtampą bei maitinimo valdymo konfigūraciją.

PASTABA: „PowerMonkey“ galima visiškai naudoti tik sistemose, naudojančiose S0iX („Connected Standby“ / „Modern Standby“ / „S0 Standby“) režimus. Sistemos, naudojančios seną S3 miego režimą, grįš į platformoje užkoduotus nustatymus, kai atnaujins S3 miego režimą. Kadangi UEFI DXE tvarkyklės / programos nėra įkeliamos iš naujo S3 atnaujinimo eigos metu, prieš atnaujinant „Hypervisor“ negalima taikyti jokių nepaisymų.

Dieginas[keisti]

Reikalavimai[keisti]

  • Windows 10/11
  • Įdiegta Linux distribucija su Grub2 boot loaderiu (išjungtas arba įjungtas secureboot, nėra svarbu), asmeniškai naudota Fedora 41
  • Visual Studio 2022 su Visual C++ paketu

Kompiliavimas[keisti]

  • Užkrovę Windows 10/11 parsisiunčiame ir įdiegiame Visual Studio 2022 su Visual C++ paketu.
  • Parsisiunčiame https://github.com/awyl/Build-PowerMonkey į C:\Build-PowerMonkey
  • Pakeičiame build.bat scriptą į esantį apačioje
  • Paleižiame X64 Native Tools Command Prompt for VS 2022
  • Nunaviguojame į C:\Build-PowerMonkey "cd C:\Build-PowerMonkey"
  • Paleidžiame: setup.bat
  • Paredaguojame: CONFIGURATION.c, suvedame visus reikalingus undervolt parametrus (apačioje pateiktas pavyzdys)
  • Paleidžiame: build.bat
  • Užmontuojame efi skirsnį per cmd (admin teisėmis) "mountvol X: /s", turėtų atsirasti naujas X: diskas, kurį pasieksite tiktai per ta patį admin teisėmis paleistą cmd
  • Sukuriame naują direktoriją "mkdir x:\EFI\PowerMonkey"
  • Nukopijuojame sukompiluotą efi failą "copy /y C:\Build-PowerMonkey\EFI\Boot\PowerMonkey.efi x:\EFI\PowerMonkey"

build.bat[keisti]

@echo off

set PYTHON_HOME=%cd%\python
set PYTHONPATH=%cd%\python
set PYTHON_COMMAND=%cd%\python\python.exe
set NASM_PREFIX=%cd%\nasm\
set PATH=%cd%\edk2\BaseTools\bin\win32;%PATH%

copy /y CONFIGURATION.c edk2\MdeModulePkg\Application\PowerMonkeyApp
cd edk2
call edksetup.bat
call build -m MdeModulePkg/Application/PowerMonkeyApp/PowerMonkey.inf
copy /y Build\MdeModule\RELEASE_VS2019\X64\PowerMonkey.efi ..\EFI\Boot

cd ..

CONFIGURATION.c[keisti]

Dėmesio! Pavyzdys skirtas tik Core i7-8750H procesoriui.

#include "Platform.h"
#include "CONFIGURATION.h"    // <- enable tracing if PowerMonkey hangs!
UINT8 gPostProgrammingOcLock = 1;
UINT8 gEmergencyExit = 1;
UINT8 gEnableSaferAsm = 1;
UINT8 gDisableFirwmareWDT = 0;
UINT64 gSelfTestMaxRuns = 0; /// DO NOT ENABLE YET (WIP)
UINT8 gPrintPackageConfig = 1;
UINT8 gPrintVFPoints_PostProgram = 1;
VOID ApplyComputerOwnersPolicy(IN PLATFORM* sys)
{
  for (UINTN pidx = 0; pidx < sys->PkgCnt; pidx++) {    
    PACKAGE* pk = sys->packages + pidx;
    pk->Program_VF_Overrides[IACORE] =    1;    // Enable programming of VF
    pk->Program_VF_Overrides[ECORE] = 0;        // Enable programming of VF
    pk->Program_VF_Overrides[RING] =  1;        // Enable programming of VF
    pk->Program_VF_Overrides[UNCORE] =    0;    // Enable programming of VF
    pk->Program_VF_Overrides[GTSLICE] =   0;    // Enable programming of VF
    pk->Program_VF_Overrides[GTUNSLICE] = 0;    // Enable programming of VF

    pk->planes[IACORE].VoltMode =
      pk->planes[RING].VoltMode = V_IPOLATIVE;      // V_IPOLATIVE = Interpolate
                                                    // V_OVERRIDE =  Override
    pk->planes[IACORE].TargetVolts =
      pk->planes[RING].TargetVolts = 0;             // in mV (absolute)

    pk->planes[IACORE].OffsetVolts = -150;          // in mV
    pk->planes[RING].OffsetVolts = -130;            // in mV 
                                                    // (negative = undervolt)

    pk->planes[ECORE].VoltMode = V_IPOLATIVE;   // V_IPOLATIVE = Interpolate
                                                // V_OVERRIDE =  Override

    pk->planes[ECORE].TargetVolts = 0;          // in mV (absolute)
    pk->planes[ECORE].OffsetVolts = 0;          // in mV (negative = undervolt)

    pk->planes[UNCORE].VoltMode = V_IPOLATIVE;  // V_IPOLATIVE = Interpolate
                                                // V_OVERRIDE =  Override

    pk->planes[UNCORE].TargetVolts = 0;         // in mV (absolute)
    pk->planes[UNCORE].OffsetVolts = 0;         // in mV (negative = undervolt)

    pk->Program_VF_Points[IACORE] =                 // 0 - Do not program
      pk->Program_VF_Points[RING] = 0;              // 1 - Program
                                                    // 2 - Print current values                                                    
                                                    //     (2 does not program)
    
    // Hybrid Architectures (Alder Lake +): E-Cores

                                                    // 1 - Program
    pk->Program_VF_Points[ECORE] = 0;               // 0 - Do not program
                                                    // 2 - Print current values                                                    
                                                    //     (2 does not program)
  }
}

Konfigūracijos undervolt:

  • CPU Core: -150mV
  • CPU Cache: -130mV


Pasirašymas[keisti]

Jeigu savo kompiuteryje turite išjungę secure boot, šį etapą galite praleisti. Šis etapas reikalauja įdiegtos Linux distribucijos su Mok Manager ir shim loader kuris įdiegtas kartu su grub2.

Sukuriame failą x509-configuration.ini į jį irašome:

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
O = ojoj
CN = COMPANY ojojoj
emailAddress = ojoj@ojojoj.lt

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid

Generuojame sertifikatus:

 openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config x509-configuration.ini -outform DER -out public_key.der -keyout private_key.priv
 openssl x509 -in public_key.der -inform DER -outform PEM -out MOK.pem

Uždedame parašą ant PowerMonkey.efi

 sbsign --key private_key.priv --cert MOK.pem /boot/efi/EFI/PowerMonkey/PowerMonkey.efi --output /boot/efi/EFI/PowerMonkey/PowerMonkey.efi-signed
 mv /boot/efi/EFI/PowerMonkey/PowerMonkey.efi-signed /boot/efi/EFI/PowerMonkey/PowerMonkey.efi

Importuojame į Mok manager (suvedame slaptažodį kurį prisiminsime vėliau)

 mokutil --import public_key.der

Perkrovę kompiuterį spauskite enroll MOK ir suveskite slaptažodį kurį įvedėte prieš tai

Krovimas su Grub2[keisti]

Redaguojame /etc/grub.d/40_custom įdedame įrašą:

 menuentry "Windows + Power Monkey" {
       insmod part_gpt
       insmod fat
       search --no-floppy --fs-uuid --set=root A4A3-6EB2
       chainloader /EFI/PowerMonkey/PowerMonkey.efi
       boot
       chainloader /EFI/Microsoft/Boot/bootmgfw.efi
       boot
 }

Reikalui esant jeigu norime nustatyti numatytają įkrovos reikšmę redaguojame failą /etc/default/grub ir pakeičiame šią eilute:

 GRUB_DEFAULT=6

Įgaliname naujus Grub nustatymus:

 grub2-mkconfig -o /boot/grub2/grub.cfg

Patikrinimas kaip veikia[keisti]

Prieš tikrinant ant Windows reikia išjungti "virtualization protected booting" poto patikrinus jį vėl įjungti, nes be jo neveiks wsl2. Paleidžiame cmd administratoriaus teisėmis ir rašome:

 bcdedit /set hypervisorlaunchtype off

Perkrauname kompiuterį ir įkrovę paleidžiame ThrottleStop paspaudžiame FIVR ir dešiniame naujai atsidariusio lango kampe esančioje lentelėje turėtume matyti pvz:

Powerthrottle fivr example.png

Matome jog CPU Core yra -0.1504, tai reiškia jog undervoltas veikia. Dabar galime grąžinti atgal "virtualization protected booting".

bcdedit /set hypervisorlaunchtype auto