PowerMonkey
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
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“ ?
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
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
- 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
@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
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
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
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