Frequenzanzeige: Datenzugang gelöst, Umrechnung nicht — bewusst abgebrochen
IOReport liefert je Kern die Verweilzeit in jeder Leistungsstufe, genau wie gebraucht: MCPU00 bis MCPU14, 17 Zustände, saubere Deltas zwischen zwei Messungen. Die Frequenz zu einer Stufe steht dort aber nicht. Sie muss aus den voltage-states-Tabellen im IODeviceTree kommen, und die passen nicht: der Kanal hat 16 Leistungsstufen, keine Tabelle hat 16 Einträge. Dazu sind die Einheiten uneinheitlich — voltage-states8 enthält echte Hertz (732–2472 MHz), voltage-states5 dagegen Paare wie (50103, 635), die in keiner Einheit sinnvolle Taktraten ergeben. Ab hier wäre es Reverse Engineering undokumentierter Firmware-Tabellen, deren Format sich zwischen Chip-Generationen ändert — genau die Sorte Code, die beim nächsten Mac still falsche Zahlen anzeigt statt zu scheitern. Dafür ist eine Zusatzangabe im Popover zu wenig, solange Phase 6 bis 9 offen sind. Die halbfertige Implementierung ist entfernt statt auskommentiert: nicht verdrahteter Code, der nil liefert, verrottet und täuscht später Vollständigkeit vor. Der Stand samt Fortsetzungsweg steht in docs/spikes/F-frequenz.md.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -1,359 +1,360 @@
|
|||||||
{
|
{
|
||||||
"sourceLanguage": "en",
|
"sourceLanguage" : "en",
|
||||||
"strings": {
|
"strings" : {
|
||||||
"network.name": {
|
"network.addresses" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Netzwerk"
|
"value" : "Adressen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Network"
|
"value" : "Addresses"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.wifi.connected": {
|
"network.download" : {
|
||||||
"comment": "Wenn der Netzwerkname mangels Ortungsberechtigung fehlt",
|
"localizations" : {
|
||||||
"localizations": {
|
"de" : {
|
||||||
"de": {
|
"stringUnit" : {
|
||||||
"stringUnit": {
|
"state" : "translated",
|
||||||
"state": "translated",
|
"value" : "Download"
|
||||||
"value": "WLAN verbunden"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Wi-Fi connected"
|
"value" : "Download"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.offline": {
|
"network.field.interface" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Nicht verbunden"
|
"value" : "Schnittstelle"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Not connected"
|
"value" : "Interface"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.field.interface": {
|
"network.field.ipv4" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Schnittstelle"
|
"value" : "IP"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Interface"
|
"value" : "IP"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.field.ipv4": {
|
"network.field.ipv6" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "IP"
|
"value" : "IPv6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "IP"
|
"value" : "IPv6"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.field.router": {
|
"network.field.router" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Router"
|
"value" : "Router"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Router"
|
"value" : "Router"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.download": {
|
"network.name" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Download"
|
"value" : "Netzwerk"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Download"
|
"value" : "Network"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.upload": {
|
"network.offline" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Upload"
|
"value" : "Nicht verbunden"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Upload"
|
"value" : "Not connected"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.peak.download": {
|
"network.peak.download" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Spitze ↓"
|
"value" : "Spitze ↓"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Peak ↓"
|
"value" : "Peak ↓"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.peak.upload": {
|
"network.peak.upload" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Spitze ↑"
|
"value" : "Spitze ↑"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Peak ↑"
|
"value" : "Peak ↑"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.addresses": {
|
"network.perProcess.unavailable" : {
|
||||||
"localizations": {
|
"extractionState" : "stale",
|
||||||
"de": {
|
"localizations" : {
|
||||||
"stringUnit": {
|
"de" : {
|
||||||
"state": "translated",
|
"stringUnit" : {
|
||||||
"value": "Adressen"
|
"state" : "translated",
|
||||||
|
"value" : "Durchsatz je Programm zeigt Onyx nicht: dafür gibt es ohne root keine Schnittstelle."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Addresses"
|
"value" : "Onyx doesn't show per-app throughput: there is no interface for it without root."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.transferred": {
|
"network.processes" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Übertragen"
|
"value" : "Je Programm"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Transferred"
|
"value" : "Per app"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.total.received": {
|
"network.public" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Empfangen"
|
"value" : "Öffentliche Adresse"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Received"
|
"value" : "Public address"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.total.sent": {
|
"network.public.enable" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Gesendet"
|
"value" : "Öffentliche IP anzeigen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Sent"
|
"value" : "Show public IP"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.field.ipv6": {
|
"network.public.failed" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "IPv6"
|
"value" : "Nicht abrufbar"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "IPv6"
|
"value" : "Unavailable"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.vpn.active": {
|
"network.public.hint" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Verkehr läuft durch einen Tunnel"
|
"value" : "Dafür fragt Onyx einen fremden Dienst — standardmäßig aus, weil ein Systemmonitor nicht ungefragt nach draußen telefonieren sollte."
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Traffic goes through a tunnel"
|
"value" : "This asks an external service — off by default, because a system monitor shouldn't phone home unasked."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.perProcess.unavailable": {
|
"network.total.received" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Durchsatz je Programm zeigt Onyx nicht: dafür gibt es ohne root keine Schnittstelle."
|
"value" : "Empfangen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Onyx doesn't show per-app throughput: there is no interface for it without root."
|
"value" : "Received"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.public": {
|
"network.total.sent" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Öffentliche Adresse"
|
"value" : "Gesendet"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Public address"
|
"value" : "Sent"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.public.enable": {
|
"network.transferred" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Öffentliche IP anzeigen"
|
"value" : "Übertragen"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Show public IP"
|
"value" : "Transferred"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.public.hint": {
|
"network.upload" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Dafür fragt Onyx einen fremden Dienst — standardmäßig aus, weil ein Systemmonitor nicht ungefragt nach draußen telefonieren sollte."
|
"value" : "Upload"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "This asks an external service — off by default, because a system monitor shouldn't phone home unasked."
|
"value" : "Upload"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.public.failed": {
|
"network.vpn.active" : {
|
||||||
"localizations": {
|
"localizations" : {
|
||||||
"de": {
|
"de" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Nicht abrufbar"
|
"value" : "Verkehr läuft durch einen Tunnel"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Unavailable"
|
"value" : "Traffic goes through a tunnel"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"network.processes": {
|
"network.wifi.connected" : {
|
||||||
"localizations": {
|
"comment" : "Wenn der Netzwerkname mangels Ortungsberechtigung fehlt",
|
||||||
"de": {
|
"localizations" : {
|
||||||
"stringUnit": {
|
"de" : {
|
||||||
"state": "translated",
|
"stringUnit" : {
|
||||||
"value": "Je Programm"
|
"state" : "translated",
|
||||||
|
"value" : "WLAN verbunden"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"en": {
|
"en" : {
|
||||||
"stringUnit": {
|
"stringUnit" : {
|
||||||
"state": "translated",
|
"state" : "translated",
|
||||||
"value": "Per app"
|
"value" : "Wi-Fi connected"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"version": "1.0"
|
"version" : "1.0"
|
||||||
}
|
}
|
||||||
75
docs/spikes/F-frequenz.md
Normal file
75
docs/spikes/F-frequenz.md
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
# Spike F — Taktfrequenzen über IOReport
|
||||||
|
|
||||||
|
Untersucht am 10.08.2026 auf Mac17,9 (M5 Pro). **Ergebnis: teilweise gelöst,
|
||||||
|
bewusst abgebrochen.** Der Datenzugang steht, die Umrechnung fehlt.
|
||||||
|
|
||||||
|
## Was funktioniert
|
||||||
|
|
||||||
|
`libIOReport` ist ohne Entitlement nutzbar; alle benötigten Symbole sind
|
||||||
|
vorhanden und über `dlsym` auflösbar:
|
||||||
|
|
||||||
|
```
|
||||||
|
IOReportCopyChannelsInGroup IOReportCreateSubscription
|
||||||
|
IOReportCreateSamples IOReportCreateSamplesDelta
|
||||||
|
IOReportStateGetCount IOReportStateGetResidency
|
||||||
|
IOReportStateGetNameForIndex
|
||||||
|
```
|
||||||
|
|
||||||
|
Der Ablauf liefert verwertbare Daten:
|
||||||
|
|
||||||
|
```
|
||||||
|
Kanäle geholt: 127 (Gruppe "CPU Stats")
|
||||||
|
Delta-Kanäle: 127
|
||||||
|
CPU Core Performance States/MCPU00 Zustände=17
|
||||||
|
IDLE:17345943 V0P14:3559973 V1P13:361673 V2P12:561938 V3P11:322658 …
|
||||||
|
```
|
||||||
|
|
||||||
|
Also je Kern (MCPU00 … MCPU14) die Verweilzeit in jeder Leistungsstufe seit der
|
||||||
|
letzten Messung. Genau das, was man für einen gewichteten Mittelwert braucht.
|
||||||
|
|
||||||
|
## Woran es scheitert
|
||||||
|
|
||||||
|
Die Frequenz zu einer Stufe steht nicht im Kanal. Sie muss aus den
|
||||||
|
`voltage-states`-Tabellen im IODeviceTree kommen — und die Zuordnung geht nicht
|
||||||
|
auf:
|
||||||
|
|
||||||
|
| Tabelle | Einträge | Als Hz gelesen |
|
||||||
|
|---|---|---|
|
||||||
|
| `voltage-states8` | 26 | 732–2472 MHz — plausibel |
|
||||||
|
| `voltage-states9`, `14`, `31` | 13 | 338–1620 MHz — plausibel, passt zur GPU |
|
||||||
|
| `voltage-states5` | 20 | 0 MHz — Paare wie (50103, 635) |
|
||||||
|
| `voltage-states22`, `23` | 15 | 0 MHz |
|
||||||
|
|
||||||
|
Zwei Probleme übereinander:
|
||||||
|
|
||||||
|
1. **Die Stufenzahl passt nicht.** Der Kanal hat 17 Zustände, davon einer
|
||||||
|
Leerlauf, also 16 Leistungsstufen. Keine Tabelle hat 16 Einträge.
|
||||||
|
2. **Die Einheiten sind uneinheitlich.** `voltage-states8` enthält echte Hertz.
|
||||||
|
`voltage-states5` enthält Paare, deren erster Wert von 50103 abwärts läuft,
|
||||||
|
während der zweite (635, 685, 710 …) nach Millivolt aussieht. Weder Hertz
|
||||||
|
noch Kilohertz noch Megahertz ergeben daraus sinnvolle Taktraten.
|
||||||
|
|
||||||
|
Die Zustandsnamen (`V0P14`, `V1P13`, `V2P12` …) kodieren offenbar Spannungs-
|
||||||
|
und P-Zustands-Index getrennt. Ein sauberer Weg führte vermutlich über diese
|
||||||
|
Namen statt über die Position im Kanal.
|
||||||
|
|
||||||
|
## Warum hier abgebrochen wurde
|
||||||
|
|
||||||
|
Ab diesem Punkt ist es Reverse Engineering undokumentierter Firmware-Tabellen,
|
||||||
|
deren Format sich zwischen Chip-Generationen ändert — genau die Sorte Code, die
|
||||||
|
beim nächsten Mac still falsche Zahlen anzeigt statt zu scheitern. Der Aufwand
|
||||||
|
steht nicht im Verhältnis zu einer Zusatzangabe im Popover, solange Phase 6 bis
|
||||||
|
9 noch offen sind.
|
||||||
|
|
||||||
|
Die halbfertige Implementierung wurde entfernt statt auskommentiert: nicht
|
||||||
|
verdrahteter Code, der `nil` zurückgibt, verrottet und täuscht später
|
||||||
|
Vollständigkeit vor. Alles Nötige steht hier.
|
||||||
|
|
||||||
|
## Wenn es doch gebaut wird
|
||||||
|
|
||||||
|
1. Zustandsnamen zerlegen (`V<spannung>P<stufe>`) statt die Position zu benutzen.
|
||||||
|
2. Die Tabelle über den P-Index adressieren, nicht über die Einträgezahl.
|
||||||
|
3. Gegen `powermetrics --samplers cpu_power` gegenprüfen — das ist die einzige
|
||||||
|
verlässliche Referenz.
|
||||||
|
4. Bei fehlender Zuordnung **nichts** anzeigen. Eine falsche Frequenz ist
|
||||||
|
schlechter als keine.
|
||||||
Reference in New Issue
Block a user