Nous écrivons un système d'exploitation. Partie 1. Chargeur

Bonjour à tous! Aujourd'hui, nous allons écrire un chargeur de démarrage qui affichera «Hello World» et l'exécutera sur VirtualBox. Nous écrirons en assembleur FASM. Vous pouvez le télécharger ici . Nous aurons également besoin de VirtualBox et UltraISO . Avant d'écrire du code, nous comprendrons comment les systèmes d'exploitation se chargent.

Ainsi, lorsque nous appuyons sur le gros bouton d'alimentation de notre ordinateur, le système démarre, qui se trouve sur n'importe quel ordinateur - BIOS (système d'entrée / sortie de base ou système d'entrée / sortie de base). La tâche du BIOS est la suivante:


  1. Détectez tous les appareils connectés et vérifiez leur fonctionnement. Le programme POST (Power On Self Test, auto-test à la mise sous tension) en est responsable. Si le fer vital n'est pas détecté, le haut-parleur du système (le cas échéant) grincera quelque chose d'incompréhensible et le téléchargement n'ira pas plus loin.
  2. Fournissez au système d'exploitation des fonctions pour travailler avec le matériel.
  3. Lisez le tout premier secteur du périphérique de démarrage dans le segment zéro de la RAM à l'offset 0x7C00h et transférez-y le contrôle. 1 secteur sur le disque fait 512 octets. Par conséquent, notre chargeur de démarrage ne doit pas dépasser 512 octets. Le BIOS détermine que le secteur est amorçable par la présence de 0x55 et 0xAA dans ses deux derniers octets.

Vous pouvez maintenant commencer à écrire du code. Exécutez le fichier FASMW.EXE, qui se trouve dans l'archive avec FASM, et insérez-y le code suivant:

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 ;   

Ce code nécessite une petite explication. L'équipe

org 7C00h

nous disons que le code doit être chargé dans la RAM à 0x7C00. En lignes

  mov ax, 3
  int 10h

nous réglons le mode vidéo sur 80x25 (80 caractères par ligne et 25 lignes) et effaçons ainsi l'écran.

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

Ici, nous positionnons le curseur. La fonction 2h d'interruption 10h en est responsable. Dans le registre dh nous mettons la coordonnée du curseur en Y, et dans le registre dl en X.

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

Nous imprimons une ligne. La fonction 13h interruption 10h en est responsable. Dans le registre bp nous mettons la chaîne elle-même, dans le registre cx le nombre de caractères de la chaîne, dans le registre bl l'attribut, dans notre cas la couleur, elle sera verte. Les 4 premiers bits affectent la couleur d'arrière-plan, les seconds 4 bits affectent la couleur du texte. Voici le nuancier

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

En ligne

jmp $

Le programme se bloque.

Nous compilons le code en appuyant sur Ctrl + F9 et enregistrons le fichier résultant sous boot.bin.

lancement


Lancez UltraISO et faites glisser notre binaire dans une zone spéciale (marquée d'une flèche rouge).



Ensuite, faites un clic droit sur le binarink et appuyez sur le bouton avec l'inscription suivante: «Installer en tant que fichier de démarrage». Ensuite, enregistrez notre fichier au format ISO.
Ouvrez VIrtualBox et créez une nouvelle machine virtuelle (si vous ne savez pas comment faire, cliquez ici ). Ainsi, après avoir créé la machine virtuelle, cliquez sur «Configurer, sélectionnez l'élément« Média », cliquez sur« Vide », où« Lecteur »est l'icône du disque optique. Nous cliquons dessus et sélectionnons «Select Optical Disk Image», recherchons notre fichier ISO, cliquez sur «Open». Nous enregistrons tous les paramètres et démarrons la machine virtuelle. Notre «Bonjour tout le monde!» Apparaît à l'écran.



Sur ce point, le premier problème prend fin. Dans la partie suivante, nous apprendrons à notre chargeur de démarrage à lire les secteurs du disque et à démarrer son premier noyau!


All Articles