Der Linux-Kernel hängt an "Kernel starten ..."

7

Ich habe Secure Boot auf einem eingebetteten Gerät erfolgreich aktiviert. Das Problem ist, dass beim Booten in diesem Modus der Prozess direkt nach der Zeile hängen zu bleiben scheint:

Starting kernel ...

Sobald U-Boot den Kernel in den Speicher kopiert und einen bootmBefehl ausgegeben hat .

In einem Debugger kann ich erfassen, dass der PC an einer yieldAnweisung festhält, gefolgt von einer Zuweisung an pc = pc-4- also im Wesentlichen eine Schleife.

Ich habe noch nie zuvor Linux auf diesem niedrigen Niveau gestartet, daher bin ich mir nicht sicher, wo ich anfangen soll zu suchen. Ich habe jedoch festgestellt, dass ich das Kernel-Image erfolgreich starten konnte, wenn ich mich nicht im sicheren Modus befand. Dies ist möglicherweise eine geeignetere Frage für den Anbieter.

1) Wo finde ich im Allgemeinen U-Boot-Diagnoseinformationen zur Ausführungsphase der Ausführung?

2) Ab wann wird der Kernel vollständig ausgeführt? dh wann ist U-Boot nicht mehr vorhanden?

sherrellbc
quelle
Die Meldung "Kernel starten ..." stammt nicht von U-Boot, sondern vom vom Linux-Kernel bereitgestellten "zImage" -Wrapper, wenn der Kernel nach der Dekomprimierung gestartet wird. Wenn Sie einen Debugger haben, lassen Sie ihn suchen, sobald dieser Code ausgeführt wird (dh Sie beginnen an der Stelle, an der Sie den Einstiegspunkt angegeben haben).
Tom Rini
Gilt das auf allen Plattformen? Das Gerät ist ein ziemlich obskures eingebettetes System, das ein FIT-Image startet. Der Kernel, die Gerätebaumbrücke und die Dächer sind alle in dieser einen "itb" -Binärdatei gebündelt, die von U-Boot geladen / ausgeführt wird.
Sherlellbc
Ich habe falsch geschrieben, sorry. Dies ist der letzte Druck von U-Boot. Meine Empfehlung ist jedoch, zunächst Ihren Debugger am Einstiegspunkt anzuhalten und von dort aus zu arbeiten.
Tom Rini
Wenn das zImage dekomprimiert wird, befinden sich sowohl der komprimierte als auch der dekomprimierte Kernel für einen bestimmten Zeitraum im Speicher. Früher hatte ich das gleiche Problem, als mein Kernel zu groß war, um in den Speicher zu passen.
jc__

Antworten:

2

Möglicherweise können Sie den Speicher der frühen Linux-Drucke wie folgt sichern. Die Ursache kann sein, dass der Kernel startet, aber vor der Konsoleninitialisierung hängen bleibt. Legen Sie auch Drucke in den Kernel-Einstiegspunkt von uboot und bestätigen Sie, dass die Kontrolle an den Kernel übergeben wird.

Suchen Sie die System.mapDatei. Verwenden Sie den folgenden Befehl, um die log_bufAdresse zu identifizieren :

grep __log_buf System.map

Dies wird so etwas wie ausgeben

c0352d88 B __log_buf

Warmstart der Karte (Inhalt im RAM sollte nicht gelöscht werden).

In Uboot __log_bufsichern Sie den Speicher von (c0352d88). Die Kernel-Konsolendrucke werden ausgegeben. So können Sie feststellen, wo das Extact Hung passiert.

Rajeshkumar
quelle
1

Ich hatte das gleiche Problem und habe eine Lösung gefunden. Die Frage ist , in einen des , u-boot structure fielddass speichert die sizevon der uncompressed linux kernel.The u-bootwird dieses Feld nicht mit der unkomprimierten Größe bevölkert , dass die linux kernelAnwendungen später seine Größe ändern stack, so dass das System in einen undefinierten Zustand versetzt.

Sobald u-bootdie Starting kernel...Nachricht gedruckt wurde , sollte die nächste Nachricht sein, Uncompressing Linux... done, booting the kernelnachdem u-boot a übertragen hat, SMM Handlerdamit der Kernel die Ausführung übernimmt, und möglicherweise kernelsucht der nach diesem Feld. Wenn Sie auf einem x86basierten System arbeiten, befindet sich die Dekomprimierung in den folgenden Dateiverzeichnissen:

arch/x86/boot/uncompressed/head_32.S
arch/x86/boot/uncompressed/piggy.S

Die Lösung besteht darin, das neueste U-Boot-Fundament hier zu verwenden: https://github.com/andy-shev/u-boot

Wenn Sie jedoch einen benutzerdefinierten U-Boot verwenden, müssen Sie nach diesem Feld suchen.

Sachin Mokashi
quelle