Obwohl es wunderbar komplette Boot-Loader zur Verfügung stehen, habe ich in meiner Freizeit ein und aus als eine pädagogische Übung geschrieben. Ich bin auf ein Problem gestoßen.Vorbereiten, einen Kernel zu laden
Ich bin in der Lage, eine erste Boot-und Kettenladung andere Sektoren ohne Problem durchzuführen. Wenn ich mein eigenes Betriebssystem schreiben würde, wäre ich gut zu gehen. :) Stattdessen versuche ich Linux zu bootstrappen. Die Herausforderung, die ich habe, ist zweifach.
- Ich verstehe, dass I need to load the kernel (Linux) into memory at 0x100000. Ich weiß, dass ich die "HdrS" Signatur bei Offset 0x202 des Kernels finden sollte. Ich weiß auch, dass die Startadresse in 0x214 sein sollte. Wenn ich jedoch zu der Adresse an diesem Ort springe, hält es an. Offensichtlich ist es ziemlich schwierig, einen Debugger darum herum zu wickeln. :) Fehle ich etwas in dieser Kette von Fakten, um die richtige Startadresse des Kernels zu bestimmen?
- Ich vermute, dass die Antwort auf (1) etwas damit zu tun haben könnte, etwas Speicherbereich mit Hardware-Discovery-Informationen zu füllen. Ich habe mehrere passierende Verweise auf diese auf gesehen, aber ich scheine zu fehlen, wo dies ist und genau welche Daten da sein müssen. Ist der Bootloader für die Hardwareerkennung verantwortlich? Wenn ja, welche Daten müssen wo hingelegt werden?
Ein weiterer Punkt zur Kenntnis zu nehmen ist, dass ich bereits in 32-Bit-Protected-Mode, weil ich mit der Erstellung eines EFI-Boot-System zu tun habe, so 16-Bit-Real-Modus ist hier nicht wirklich eine Option, die Beseitigung der Real-Mode-Startort im Kernel.
Es ist trivial einen Debugger um this_ zu _wrap ... nur eine virtuelle Maschine. Hell, Linux kommt sogar mit Quellcode;) – Jester
Willst du auf Bare-Metal debuggen? Versuchen Sie es mit einem anderen Maschinensimulator. Das hat den Vorteil, dass das Pausieren zu Einzelschritten völlig transparent sein kann, weil die Uhr (und Timer-Interrupts usw.) stoppt. –
@PeterCordes Ja. Ich erinnere mich, dass Bochs auch eine Debug-Verbindungsschnittstelle hat, oder? Ich werde sehen, ob das hilft, aber alle es mir wirklich zeigen würde, ist, dass ich erfolgreich an die Stelle von 0x214 angezeigt Springen bin ... Ich vermute, dass ich entweder immer meine Adresse aus der falschen Stelle oder # 2 oben ist mein Problem. –