Forum: PC-Programmierung [Kernel] early init debuggen


von b-bub (Gast)


Lesenswert?

Hallo,

ich versuche gerade einen Mini-Kernel auf eine neue Plattform zu ziehen.

Leider scheint der Code schon sehr früh rauszufliegen, weshalb ich nicht 
soweit komme irgend welche Debug-Infos über UART zu beziehen.

Ich starte den Kernel mit U-Boot; doch die einzige Info, die ich bekomme 
ist folgende:
1
uboot> go 0x01000000
2
## Starting application at 0x01000000 ...
3
## Application terminated, rc = 0x1

Weiß jmd, wie ich Infos kriege, wo die App rausfliegt?
Bzw. terminiert die App eigentlich sauber (return 1), oder fetzt es 
U-Boot schon beim Versuch die App zu starten?

Gibt es sonst eine Möglichkeit "Early Init"-Code, der hauptsächlich aus 
Assembler-Code besteht zu debuggen?
Qemu vielleicht?

von b-bub (Gast)


Lesenswert?

Ahoi nochmal,


am Ende der meisten Assembler-Funktionen steht nach einem Branch "b .".
Bsp:
1
  cmp  r0, r1
2
  beq  _config
3
  b . /* TODO: reset? log? */

Was bedeutet "b ." und was passiert dabei?
Ich vermute, das Programm wird dadurch ziemlich ruppig beendet.

Kann es sein, das ich in diesem Fall die Ausgabe "## Application 
terminated, rc = 0x1## " in U-Boot sehe?

Wenn dem so ist, könnte ich doch die Zeile "b ." ändern, um einen 
sauberen Exit herbeizuführen, oder?
Wenn ich in U-Boot also nicht mehr "## Application terminated, rc = 
0x1## " sehe, dann wüsste ich doch wo das Programm stirbt.


FRAGE: wie kann ich mit einem Cortex A9 einen sauberen Exit (in 
Assembler) erreichen?



Danke

von Rico W. (bitkipper)


Lesenswert?

b-bub schrieb:
> Was bedeutet "b ." und was passiert dabei?
> Ich vermute, das Programm wird dadurch ziemlich ruppig beendet.
In der Befehlsreferenz ist der Befehl nur als 'branch' generell 
aufgeführt. So wie ich das interpretiere verzweigt dieser Befehl 
fortwährend auf sich selbst (der Punkt am Ende), also eine 
Endlosschleife.

Die Ausgaben, die du siehst, kommen entweder aus der Funktion do_go() in 
der Datei common/cmd_boot.c oder aus der Funktion do_bootelf() in der 
Datei common/cmd_elf.c von U-Boot.

Den Befehl 'BEQ' finde ich im Thumb2 Instruction Set nicht. Scheint so, 
als wenn es diesen nur im älteren Thumb gibt (ARM7TDMI). Kann also sein 
daß deine Applikation nicht für diesen Prozessor compiliert ist. Das 
würde dann einen unsauberen Abbruch wegen unerlaubtem Befehls erklären.

> FRAGE: wie kann ich mit einem Cortex A9 einen sauberen Exit (in
> Assembler) erreichen?
Vielleicht hast du den falschen Compiler oder die falsche Plattform 
eingestellt. Versuch es estmal an dieser Stelle zu überprüfen.

von Rico W. (bitkipper)


Lesenswert?


Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.