Wie kann man das Laden eines Kext verzögern?

Die Art und Weise, wie die Frage im Titel formuliert ist, könnte von allgemeinem Interesse sein.

Das konkrete Problem oder Beispiel, auf das diese Frage angewendet werden sollte, lautet: Die optimale Lösung finden, um ein ansonsten totes MacBook Pro (ausgebrannter diskreter AMD-Grafikchip) wieder in einen brauchbaren Zustand zu hacken.

Hintergrund:

Aktuelle Situation: Gebratene dGPU, Booten muss immer in iGPU erzwungen werden. Mit den Standard-Hardwareeinstellungen und der Standard-Systeminstallation startet die Maschine einfach nicht.

Unerwünschter Nebeneffekt für das Deaktivieren der dGPU in Software: AMDRadeonX3000.kext darf nicht sofort geladen werden, wenn doch – Boot hängt auf Yosemite, friert in Sierra ein und führt zu schnellen erzwungenen Neustarts aufgrund von Überhitzung in High Sierra, bevor die GUI hochgefahren ist. In Sierra beobachtbare Symptome, letzte Zeile im ausführlichen Boot ist:IOConsoleUsers IOScreenLockState 3.

Kext wird überhaupt nicht geladen: Das Wärmemanagement für den AMD-Chip gerät außer Kontrolle. Die Temperatur sinkt nie unter 65 °C und steigt leicht an, obwohl der Chip nicht verwendet wird.

Verspätete Beladung: Auf der Temperaturseite ist alles in Ordnung. Die GPU läuft nicht mit voller Leistung im Leerlauf, sondern mit einem viel niedrigeren Leistungszustand. Je nach OS-Version melden die Sensoren Temperaturen im Bereich von 0°C–60°C. Obwohl diese Anzeige nicht wirklich realistisch oder vertrauenswürdig erscheint, fühlt sich die gesamte Einheit auch kühler an.

Aber "alles ist gut" nur meistens. Hin und wieder gibt es sehr seltene Schlafprobleme auf Sierra und leider: jedes Mal auf Yosemite.

Wenn Sie feststellen, dass der kext geladen werden muss, um die Maschine zu betreiben, aber besser nicht (zumindest verzögert) geladen wird, um die Maschine in den Ruhezustand zu versetzen: Ein Versuch, den scheinbar kextunloadverantwortlichen kext zu lesen, führt zu einer sofortigen Panik. Dieser eine Absatz ist hauptsächlich in Yosemite von Bedeutung, aber nicht so sehr in Sierra.

Darüber hinaus ist es möglicherweise nicht die optimale Lösung. Das Wärmemanagement benötigt in der aktuellen Konfiguration 1-2 Minuten nach dem Laden des kext, um sich auf einem akzeptablen Niveau zu stabilisieren. Daher der Wunsch, die Kexte zu drehen und zu sehen, was die besten Ergebnisse liefern könnte.

Bisherige Schritte:

Einer der Grafiktreiber-Kexte in Sierra muss automatisch, aber später beim/um/nach dem Booten geladen werden.

Sie sind natürlich voneinander abhängig und werden alle so geladen, wie es das System unter normalen Umständen als notwendig erachtet.

Aber das System bleibt beim Booten hängen, wenn der betreffende Kext zu früh geladen wird, und das System läuft genau wie gewünscht, wenn es später geladen wird.

In diesem Fall habe ich bestätigt, dass das Laden entweder manuell oder zusammen mit einem GUI-Login über Hooks funktioniert.

Dies bedeutet jedoch, dass das Platzieren des kext in /System/Library/Extensionsoder /Library/Extensionszum Hängenbleiben am Boot führt, da sie zu früh konsultiert werden.

Was auch nicht funktioniert, ist die Verwendung von systemweiten Launchd-Agenten oder Daemons, da diese ebenfalls zu früh konsultiert werden. Dieselben Daemons unter Benutzerhierarchien haben anscheinend nicht die erforderlichen Berechtigungen, um einen Kext zu laden.

Wohin soll dieser eine Kext aus /System/Library/Extensions gehen? Wie kann eine Verzögerung erzwungen werden, dass dieser Kext erst geladen wird, nachdem alle seine Up- oder Down-Abhängigkeiten geladen wurden?

"Welcher Text?" Sie könnten fragen. Bei dieser Frage geht es um alle AMD-Kexte, die jeweils einzeln getestet werden müssen.

Dies ist ein Versuch, diesen Leitfaden weiter zu verbessern .

Fragen

Hauptfrage: Wie kann einer dieser Grafiktexte zu einem verzögerten Laden gezwungen werden? (Andere als die LoginHook-Methode.)

Wenn sich dies für das erklärte Ziel als suboptimal erweist, wäre es auch schön oder sogar besser zu wissen:

Gibt es andere Möglichkeiten in der Software, die deaktivierte dGPU unter den Wärme- und Energieverwaltungsregeln des Systems zu halten? (Je weniger Strom durch diesen unbenutzten Chip geht, desto besser.)

Dieser Fall kann auch andere Kernel-Erweiterungen betreffen.

Das klingt nach einem XY-Problem . Was genau ist das Problem, das gelöst werden muss?
Beißen Sie in den sauren Apfel, ersetzen Sie das Motherboard oder kaufen Sie einen neuen Mac!
Ich habe neuere Macs. Das Ersetzen des Motherboards ist wirklich nicht hilfreich, da Apple dies überhaupt nicht mehr tun wird. Selbst wenn sie es taten, hatten sie nur diese defekten und sterbenden. Es ist ein Konstruktionsfehler in HW. Meins hatte 4 neue Logikplatinen von Apple. Nur der Austausch des AMD-Chips allein wird es beheben. Apple wird diese Art von Komponentenarbeit nicht durchführen und sie verbieten AASPs, dies zu tun. Dann gibt es immer noch Tausende, die das Geld wohl oder übel nicht haben. Mit dem 'Hack' können wir sie weiterverfolgen und dazu beitragen, diese ansonsten guten Maschinen vor dem Müllhaufen zu bewahren.

Antworten (2)

Die einfachste Lösung besteht wahrscheinlich darin, die störende Kernel-Erweiterung direkt aus /System/Library/Extensions zu entfernen, in Ihrem Fall AMDRadeonX3000.kext. Du brauchst:

  1. Deaktivieren Sie den Systemintegritätsschutz. Es gibt viele Anleitungen im Internet, wie das geht, aber die Kurzversion lautet: Starten Sie den Wiederherstellungsmodus neu, öffnen Sie das Terminal und geben Sie csrutil disable.

  2. Kopieren Sie /System/Library/Extensions/AMDRadeonX3000.kext an einen anderen sicheren Ort auf Ihrem Computer, falls etwas schief geht und Sie wiederherstellen müssen.

  3. Löschen Sie AMDRadeonX3000.kext aus /System/Library/Extensions.

  4. Löschen Sie Ihren Kext-Cache. Öffnen Sie das Terminal und führen Sie Folgendes aus: sudo touch /System/Library/Extensions && sudo kextcache -u /. Dann neu starten.

Der Kext wird möglicherweise nach dem Aktualisieren von macOS erneut angezeigt. In diesem Fall müssen Sie die Schritte 3 und 4 wiederholen. Aus diesem Grund kann ich SIP zwar wieder aktivieren, sobald der Kext entfernt wurde, aber ich empfehle, ihn einfach auszulassen.

Die Hackintosh-Community verfügt über beständigere Methoden zum Deaktivieren bestimmter Kernel-Erweiterungen. Wenn Sie möchten, können Sie den Clover-Bootloader installieren, der sich an Hackintosh-Benutzer richtet, aber auch auf offizieller Hardware funktionieren sollte. Für Ihre Bedürfnisse denke ich jedoch, dass das einfache Löschen des Kext die beste Lösung ist.

Bearbeiten : Diese Methode führt dazu, dass die dedizierte GPU weiterhin Strom erhält, wodurch die Batterie verschwendet wird. Um zu verhindern, dass die GPU Strom erhält, müssen Sie Clover installieren und dann eine benutzerdefinierte SSDT erstellen , die die GPU ausschaltet.

Ich habe meiner Antwort einen Nachtrag hinzugefügt, der auf der Klarstellung des OP basiert. Sich mit Clover und benutzerdefinierten SSDTs auseinanderzusetzen, kann etwas zeitaufwändig sein, kann sich aber lohnen, je nachdem, wie lange Sie beabsichtigen, diese Maschine zu behalten.

Es gibt keine dokumentierte Möglichkeit für einen Benutzer (oder einen Administrator), das Laden von KEXTs zu verzögern. Systemkernel-Erweiterungen werden laut seiner Seite von geladen kextd, dem „Kernel-Erweiterungsserver“ man. kextdwird über launchdeinen hier sitzenden LaunchDaemon gestartet:

/System/Library/LaunchDaemons/com.apple.kextd.plist

Zusätzlich zu diesem Verzeichnis launchdkonsultiert auch /Library/LaunchDaemons. Es gibt keine definierte Reihenfolge der Ausführung von LaunchDaemon-Plists und es gibt auch keine Verzögerungsoption. Das reicht für Ihre Optionen, fürchte ich.

Jemand, der an demselben Problem arbeitet, gab an, dass es einem /LibraryLaunchDaemon im kanonischen Format unter 10.6 gelingt, den Kext spät genug zu laden. Ist 10.6 allein langsam genug oder haben sie die Verarbeitung / Parallelisierung zwischen 10.6 und 10.12 geändert?
Es ist immer noch nicht deterministisch. Außerdem werden Kexts in einen Cache gelegt, der dann bei nachfolgenden Starts sofort geladen wird. Dadurch werden alle Versuche, das Laden von Kext selektiv zu verzögern, weiter zunichte gemacht.
@TomE - Sie können das Laden mit der <Nice>Definition in der kext .plist "sorta" planen. Z.B. <key>Nice</key><integer>20</integer>Die Werte reichen von -20 bis 20. Niedrigere Werte haben eine günstigere Planung.
@Allan: Die info.plist im kext? & Ist dieser Teil nicht auch mitgestaltet? –– @Tom E.: Der kext ist schon aus den kanonischen Plätzen für Erweiterungen ausgelagert, daher ist der kextcache kein Problem.