Copy Link
Add to Bookmark
Report

7Sk1: Création d'un système d'exploitation (OS) - première partie

Création d'un système d'exploitation (OS) - première partie (disquette boot) -

eZine's profile picture
Published in 
Seven SYnKoP Mag
 · 23 Apr 2022

Introduction

Bon je prévient tout l'monde la construction d'un système d'exploitation est extrêmement ardue donc va falloir vous accrocher, je ne compte pas construire un Windows NT version An-Mojeg ou bien un nouveau linux je veux juste faire un petit truc tout simple.

Le noyau que j'ai décidé de construire s'appellera HykOS, il ne tiendra seulement sur une seule disquette et s'executera a partir de celle-ci.

Je tien a préciser que des connaissances en ASM sont IMPERATIVES, huh vous avez aussi besoin d'un bon stock de disquettes :).


Théorie

Alors déjà que se passe-t-il lorsque nous mettons une disquette quelconque dans le lecteur puis que nous démarrons la becane ... si c'est une disquette banale il nous envera chier avec un message style "DISK ERROR REPLACE SYSTEM DISK ..." bref ça lui va pas par contre quand il lance une disquette boot là ya pas de problem ... ?

Sachant que c'est le bios qui réagit a tout ça analysons sont comportement lors de la présence d'une disquette dans le lecteur :

  • Il charge le secteur boot de la disquette (secteur 1, piste 0, tête 0) à l'adresse 07C00 jusqu'à 07DFF, 512 bytes (un secteur, le secteur boot d'ailleur ;) ).
  • Ensuite il vérifie si à l'adresse 07DFE il trouve la combinaison 'magique' (celle qui définit une disquette comme étant une disquette boot ou pas) : AA55. Donc pour qu'une disquette soit considérée comme disquette boot il faut que sur son secteur boot il y figure AA55 à son offset 001FE.
    • 07C00 + 001FE = 07DFE !!!

  • Finalement le bios laisse la place au programme contenu dans le secteur boot en effectuant un jump sur l'adresse :
    • 0000:7C00

Pour info voilà l'état des registres après cette opération :

  • Le registre DL contient 00 car il s'agit de la disquette (80h si il s'agisait du disque dur, hé oui c le même principe que pour le disque dur).
  • Le registre CS contient 00.
  • Le registre IP contient 0x7C00 (l'adresse en mémoire du secteur).

Notre but

Faire en sorte que lorsque nous introduisons une disquette au démarrage il figure un texte a l'écran.


Pratique

Let's go, comme vous vous en doutez on va pas coder notre ptit secteur boot en VB donc laisson la place à l'ASM. On va quand même d'abord commencer a se faciliter la vie en créeant un ptit outils qui va me servir a écrire notre secteur sur le secteur 1, piste 0, tête 0 d'une disquette puissque si on copie-colle simplement les données sous explorer il nous fait n'importe quoi donc faisont tout nous même :).

Voici le code source du programme d'ecriture (en Borland C++):

//------------------------------------------------------------------------------ 
//
// Rawthat v0.1 - Permet d'écrire le contenu d'un fichier sur le secteur
// boot d'une disquette.
// Veillez bien a entrer une disquette avant de lancer le prog.
//------------------------------------------------------------------------------
#include <bios.h>
#include <stdio.h>

#define secteur_size 512

#define CMD_W 3
#define CMD_V 4
#define DRIVE 0
#define HEAD 0
#define TRACK 0
#define SECT 1
#define NSECT 1

void main (int argc, char *argv[])
{
FILE *fin;
char secteur[secteur_size] = "";

if(argc!=2){
printf("USAGE : rawthat [FICHIER A INSCRIRE]");
return;
}

if((fin = fopen(argv[1],"r")) == NULL){
printf("Veuillez fournir un nom de fichier existant.");
return;
}

if(fread(&secteur,secteur_size - 1,NSECT,fin) != 1){
printf("Impossible de lire a partir du fichier.");
return;
}

printf("Ecriture du secteur ... ");

if(biosdisk(CMD_W,DRIVE,HEAD,TRACK,SECT,NSECT,secteur) != 0x00){
printf("Erreur lors de l'accès au disque.");
return;
}

printf("OK.");

fclose(fin);

return;
}
//------------------------------------------------------------------------------


Bon ben maintenant faut qu'on s'attaque a notre secteur boot, il va rappelons juste écrire une chaîne de caractères a l'écran, il vous faut quand même savoir qu'aux moment de l'execution rien n'est chargé en mémoire a part notre prog donc tchao les intéruptions dos qui facilite la vie de tout l'monde :) mais bonjour les belles interuptions BIOS !! Ici j'ai utilisé l'assembleur qui convenait mieu a la situation NASM qui est disponible a peu près partout en free. Je vous explique pas à pas ce que va faire le programme :

  • tout d'abord il va initialiser les segments en 07C00 (data et stack(début de la pile et fin de la pile))
  • il va ensuite nous afficher notre chaîne de caractères grace a l'interuption 0x10 fonction 0x0E :
    • Entrée :
      • AH = 0Eh
      • AL = Code ASCII du caractère
      • BL = Couleur de premier plan du caractère (en mode graphique uniquement)

  • puis il va nous faire une boucle sans fin pour faire patienter le système et voilà voilà :)

Bon ben je crache tout de suite le code :

;----------------------------------------------------------------------------------------------------- 
; HykOS v0.1b - Secteur boot par An-Mojeg
;
; Mails : an-mojeg@mail-developpeur.com
;-----------------------------------------------------------------------------------------------------
[BITS 16]
[ORG 0x0]
;--------------------------------------------------> Initialisation des segments
mov ax,0x07C0 ; \
mov ds,ax ; > ces trois opérations indiques la zone de mémoire ou se situe le seg de données
mov es,ax ; /
mov ax,0x8000 ; \
mov ss,ax ; > initialisation du stack (de la pile) segment de pile : 0x80000 et pointeur de pile 0xF000
mov sp, 0xf000 ; / la pile commence donc en 0x8F000 et finit en 0x80000
;<------------------------------------------------------------------------------
jmp start ; on saute directement au code
;----------------------------------------------------> Notre chaîne de caractère
welcome db "Welcome to HykOS v0.1b by An-Mojeg",0
;<------------------------------------------------------------------------------

start:

;################################### AFFICHE LE MESSAGE
mov si,welcome

afficher:
lodsb
mov ah, 0Eh
push ax
int 10h
pop ax
cmp al, 0
jne afficher
;######################################################

;####################################### BOUCLE INFINIE
boucle:
jmp boucle
;######################################################

;rempli le reste du fichier (secteur) par des nops et finit par le Magic Offset
times 510-($-$$) db 144
dw 0xAA55
;-----------------------------------------------------------------------------------------------------


A mon avis le code est assez explicite et n'as donc pas besoin de plus amples explications (sinon mail).

Conclusion

Ben voilà on à finit notre premier secteur c'est pas mal :) Reste plus qu'a faire le reste ... le plus dur koi :). Si vous n'avez pas compris cet article relisez le plein de fois, cherchez de la docs sur les points que vous ne comprenez pas et si le brouillard persiste mailez moi mais accrochez vous bien pour bien attaquer la seconde partie de cette article.


An-Mojeg [ an-mojeg@mail-developpeur.com ]


sources de mon OS

boot.asm

;------------------------------------------------------------------------------ 
; Voici le secteur boot de mon OS.
;
; pour compiler : nasmw -o boot.bin boot.asm
; An-Mojeg
;------------------------------------------------------------------------------
[BITS 16]
[ORG 0x0]
;--------------------------------------------------> Initialisation des segments
mov ax,0x07C0
mov ds,ax
mov es,ax
mov ax,0x8000 ; stack en 0xFFFF
mov ss,ax
mov sp, 0xf000
;<--------------------------------------------------------------------
jmp start

welcome db "Welcome to HykOS v0.1b by An-Mojeg",0

start:
mov si,welcome

afficher:
lodsb
mov ah, 0Eh
mov bl, 07h
push ax
int 10h
pop ax
cmp al, 0
jne afficher

boucle:
jmp boucle

times 510-($-$$) db 144
dw 0xAA55
;------------------------------------------------------------------------------


RAWTHAT.CPP

#include <bios.h> 
#include <stdio.h>

#define secteur_size 512

#define CMD_W 3
#define CMD_V 4
#define DRIVE 0
#define HEAD 0
#define TRACK 0
#define SECT 1
#define NSECT 1

void main (int argc, char *argv[])
{
FILE *fin;
char secteur[secteur_size] = "";

if(argc!=2){
printf("USAGE : rawthat [FICHIER A INSCRIRE]");
return;
}

if((fin = fopen(argv[1],"r")) == NULL){
printf("Veuillez fournir un nom de fichier existant.");
return;
}

if(fread(&secteur,secteur_size - 1,NSECT,fin) != 1){
printf("Impossible de lire a partir du fichier.");
return;
}

printf("Ecriture du secteur ... ");

if(biosdisk(CMD_W,DRIVE,HEAD,TRACK,SECT,NSECT,secteur) != 0x00){
printf("Erreur lors de l'accËs au disque.");
return;
}

printf("OK.");

fclose(fin);

return;
}

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT