Wir schreiben ein Betriebssystem. Teil 1. Bootloader

Hallo alle zusammen! Heute werden wir einen Bootloader schreiben, der "Hello World" ausgibt und auf VirtualBox ausführt. Wir werden in Assembler FASM schreiben. Sie können es hier herunterladen . Wir werden auch VirtualBox und UltraISO benötigen . Bevor wir Code schreiben, werden wir verstehen, wie Betriebssysteme geladen werden.

Wenn wir also den großen Netzschalter auf unserem Computer drücken, startet das System, das sich auf einem beliebigen Computer befindet - dem BIOS (Basic Input / Output System oder Basic Input / Output System). Die BIOS-Aufgabe lautet:


  1. Erkennen Sie alle angeschlossenen Geräte und überprüfen Sie deren Funktionsfähigkeit. Das POST-Programm (Power On Self Test, Power-On Self-Test) ist dafür verantwortlich. Wenn lebenswichtiges Eisen nicht erkannt wird, quietscht der Systemlautsprecher (falls vorhanden) etwas Unverständliches und der Download geht nicht weiter.
  2. Stellen Sie dem Betriebssystem Funktionen für die Arbeit mit Hardware zur Verfügung.
  3. Lesen Sie den allerersten Sektor des Startgeräts mit dem Offset 0x7C00h in das Nullsegment des RAM und übertragen Sie dort die Steuerung. 1 Sektor auf der Festplatte ist 512 Bytes. Daher sollte unser Bootloader 512 Byte nicht überschreiten. Das BIOS bestimmt, dass der Sektor durch das Vorhandensein von 0x55 und 0xAA in seinen letzten zwei Bytes bootfähig ist.

Jetzt können Sie mit dem Schreiben von Code beginnen. Führen Sie die Datei FASMW.EXE aus, die sich mit FASM im Archiv befindet, und fügen Sie dort den folgenden Code ein:

org 7C00h

 start:
    cli              ;  (   )
    xor ax, ax       ;  ax
    mov ds, ax       ; dataSegment   
    mov es, ax       ;  es   
    mov ss, ax       ; StackSegment   
    mov sp, 07C00h   ;    
    sti              ; 

  ; 
  mov ax, 3
  int 10h

  mov ah, 2h
  mov dh, 0
  mov dl, 0
  xor bh, bh
  int 10h

  ; 
  mov ax, 1301h
  mov bp, message
  mov cx, 12
  mov bl, 02h
  int 10h

  jmp $

message db 'Hello World!',0

times 510 - ($ - $$) db 0 ;     510- 
db 0x55, 0xAA ;   

Dieser Code bedarf einer kleinen Erklärung. Die Mannschaft

org 7C00h

Wir sagen, dass der Code bei 0x7C00 in den RAM geladen werden muss. In Linien

  mov ax, 3
  int 10h

Wir stellen den Videomodus auf 80x25 (80 Zeichen pro Zeile und 25 Zeilen) ein und löschen damit den Bildschirm.

  mov ah, 2h
  mov dh, 0
  mov dl, 0
  xor bh, bh
  int 10h

Hier setzen wir den Cursor. Verantwortlich dafür ist die 2h Interrupt 10h Funktion. Im Register dh setzen wir die Koordinate des Cursors in Y und im Register dl in X.

  mov ax, 1301h
  mov bp, message
  mov cx, 12
  mov bl, 02h
  int 10h

Wir drucken eine Zeile. Verantwortlich dafür ist die 13h Interrupt 10h Funktion. Im bp-Register setzen wir die Zeichenfolge selbst, im cx-Register die Anzahl der Zeichen in der Zeichenfolge, im bl-Register das Attribut, in unserem Fall die Farbe grün. Die ersten 4 Bits beeinflussen die Hintergrundfarbe, die zweiten 4 Bits beeinflussen die Textfarbe. Unten ist die Farbkarte

0 - , 1 - , 2 - , 3 - , 4 - , 5 - , 6 - , 7 - -, 8 - -, 9 - -, A - -, B - -, C - -, D- -, E - -, F – .

In der Reihe

jmp $

Das Programm friert ein.

Wir kompilieren den Code durch Drücken von Strg + F9 und speichern die resultierende Datei als boot.bin.

Starten


Starten Sie UltraISO und ziehen Sie unsere Binärdatei in einen speziellen Bereich (markiert mit einem roten Pfeil).



Klicken Sie anschließend mit der rechten Maustaste auf den Binarink und drücken Sie die Schaltfläche mit der folgenden Aufschrift: "Als Startdatei installieren". Speichern Sie anschließend unsere Datei im ISO-Format.
Öffnen Sie VIrtualBox und erstellen Sie eine neue virtuelle Maschine (wenn Sie nicht wissen, wie das geht, klicken Sie hier ). Nachdem Sie die virtuelle Maschine erstellt haben, klicken Sie auf "Konfigurieren", wählen Sie das Element "Medien" aus und klicken Sie auf "Leer", wobei "Laufwerk" das Symbol für die optische Festplatte ist. Wir klicken darauf und wählen "Optisches Datenträger-Image auswählen", suchen nach unserer ISO-Datei und klicken auf "Öffnen". Wir speichern alle Einstellungen und starten die virtuelle Maschine. Unsere "Hallo Welt!" Erscheint auf dem Bildschirm.



Damit endet die erste Ausgabe. Im nächsten Teil werden wir unserem Bootloader beibringen, Festplattensektoren zu lesen und seinen ersten Kernel hochzufahren!


All Articles