Bon, je me lance, pour commencer un OS va falloir déjà nourrir le BIOS avec un secteur de boot, càd, un programma assemblé directement dans le jeu d'instruction de votre processeur, voici un article qui explique comment programmer et debugger un programme en raw (oui,oui c'est le nom qu'on donne au programme assemblé directement dans le jeu d'instruction de votre proco)
http://www.nondot.org/sabre/os/files/Boo...mpiler.pdf (il le fait en C, mais nous c'est la méthode qui nous intéresse).
Voici comment votre ordinateur fonctionne de votre pression sur le bouton jusqu'à l'interface de votre système d'exploitation.
Pression sur le bouton reset-> le BIOS prends la main et effectue le POST, puis cherche le bootsector, il lit les 512 premiers octets ni plus ni moins, pour y trouver notre bootloader (qui sera notre programme assemblé/compilé en raw), le BIOS valide un bootloader si ses derniers octets sont 0x55,0xAA , dès lors que ces octects y sont, il copie en mémoire à l'adresse 0x7C00, puis il lui donne la main (en asm ça donnerait "JMP 7c00h")->le bootloader est loadé
et donc, il effectue son boulot puis charge le système d'exploitation.
Voici un exemple de bootloader pris sur le net que je vais vous détailler.:
Code ASM :
;******************* START ************************
; Boot sector authoring example by Gareth Owen (gaz@athene.co.uk)
; This should be accompanied with an article explaining bootsectors
[BITS 16] ; On indique qu'on bosse en 16 bits (mode réel oblige)
[ORG 0] ; Data offset = 0 pas besoin de traduire
jmp start ; on passe notre "section" data, car la section data ne s'éxecute pas :-),
; well, you can, but i am not held responsible for the results
; -------------------------------------
; Data used in the boot-loading process
; ------------------------------------------------------------------------
bootdrv db 0
bootmsg db 'Gareth Owen',39,'s Boot Sector Example',13,10,0
rebootmsg db 'Press any key to reboot',13,10,0
; these are used in the processor identification
processormsg db 'Checking for 386+ processor: ',0
need386 db 'Sorry... 386+ required!',13,10,0
found386 db 'Found!',13,10,0
whatever db 'Insert your code to do something here',13,10,0
;*******************************************
; Functions we are going to use ...
;*******************************************
detect_cpu: ;C'est une méthode spéciale, donc ça sert à rien que je vous explique le pourquoi du comment.
mov si, processormsg ; tell the user what we're doing
call message
; test if 8088/8086 is present (flag bits 12-15 will be set)
pushf ; save the flags original value
xor ah,ah ; ah = 0
push ax ; copy ax into the flags
popf ; with bits 12-15 clear
pushf ; Read flags back into ax
pop ax
and ah,0f0h ; check if bits 12-15 are set
cmp ah,0f0h
je no386 ; no 386 detected (8088/8086 present)
; check for a 286 (bits 12-15 are clear)
mov ah,0f0h ; set bits 12-15
push ax ; copy ax onto the flags
popf
pushf ; copy the flags into ax
pop ax
and ah,0f0h ; check if bits 12-15 are clear
jz no386 ; no 386 detected (80286 present)
popf ; pop the original flags back
mov si, found386
call message
ret ; no 8088/8086 or 286, so ateast 386
no386:
mov si,need386 ; tell the user the problem
call message
jmp reboot ; and reboot when key pressed
; ********************************************************************
message: ; Dump dsi to screen.
lodsb ; load byte at dsi into al
or al,al ; on est à la fin de la chaine ?
jz done
mov ah,0eh ; on met le caractère
mov bx,0007 ; puis on attribue, n'hésitez pas à googler l'interruption 10/AH=0EH
int 0x10 ; call BIOS
jmp message
done:
ret
; ********************************************************************
getkey:
mov ah, 0 ; wait for key
int 016h
ret
; ********************************************************************
reboot:
mov si, rebootmsg ; be polite, and say we're rebooting
call message
call getkey ; and even wait for a key
db 0EAh ; là, c'est un peu spécial, on écrit directement du langage machine pour rebooter, quand on jump à FFFF:0000 ça veut dire qu'on reboot, quand vous appuyez sur le bouton reset de votre ordinateur, bah enfait c'est comme si votre système jumper à cette adresse.
dw 0000h ; c'est un dword, on le met à l'envers, j'ai expliqué pourquoi à la fin du code
dw 0FFFFh
; no ret required; we're rebooting! (Hey, I just saved a byte
; *******************************************
; The actual code of our boot loading process
; *******************************************
start:
mov ax,0x7c0 ;On met le registre de segment ds équivalent à 7c0h comme ça tout nos adresses seront relative à 07C00h
mov ds,ax ; On aurait pu mettre ORG [7c0h] aussi.
data
mov [bootdrv], dl ; on garde le secteur de boot à portée de main, on sait jamais !
cli ; on met IF à 0, donc les interruptions de type IRQ ne seront pas traités
mov ax,0x9000 ; On installe la pile
mov ss,ax ; Oui, on ne peut pas directement assigner ss à une valeur précise, donc on met ax comme intermédiaire
mov sp,0xffff ;
sti ; On remet IF à 1 pour re-traiter les prochaines interruptions
mov si,bootmsg ; display our startup message
call message
call detect_cpu ; on vérifie qu'on a un processeur x86
.386 ; on peut désormais utiliser le jeu d'instructions x86
mov si,whatever ; tell the user we're not doing anything interesting here
call message
call getkey
call reboot
times 510-($-$$) db 0 ; notre fichier ne fait pas 512 octects comme prévu donc on rempli le fichier de 00 jusqu au dernier bit
dw 0xAA55 ; Quand on installe un dword, il sera toujours lu dans le sens contraire dont vous l'avez mis, donc mettez le à l'envers. C'est le 0x55 0xAA qui valide notre bootloader .