[Développement] - Chargement d'un kernel et mémoire vidéo

Ecrit par tchess, le 10 Aug 2005 dans la catégorie Systèmes d'Exploitations

1. Charger un kernel en mémoire et le lancer

On commence par ce point qui est quand même fondamentale je pense, d'abord parce que 512 octets (boot sector) pour tout mettre et puis aussi parce que ca peut aussi servir a lancer vos programmes qui tourneront sur votre OS.

Voici un code chargeant un kernel en mémoire et le lançant

%define BASE 0x100
%define KSIZE 2 ; Nombre de secteurs de 512 octets a charger

[BITS 16]
[ORG 0x0]

mov [bootdrv], dl ; Recuperation de l'unite de boot

; Initialisation des segments en 0x07C0
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov ax, 0x8000 ; Stack en 0xFFFF
mov ss, ax
mov sp, 0xf000

; Charger le noyau
xor ax, ax
int 0x13

push es
mov ax, BASE ; L'int 13h charge le(s) secteur(s) en es:bx
mov es, ax
mov bx, 0

mov ah, 2 ; Fonction de lecture
mov al, KSIZE
mov ch, 0 ; Numéro de piste
mov cl, 2 ; Numéro du secteur de départ pour la lecture
mov dh, 0 ; Numéro de face
mov dl, [bootdrv] ; Numéro du lecteur
int 13h
pop es

; Saut vers le kernel
jmp dword BASE:0

times 510-($-$$) db 0
dw 0xAA55
On fait un jmp dword parce que l'on renseigne le segment et l'offset puisque que le kernel n'est pas dans le même segment que le boot sector => 32bits.

2. La mémoire vidéo

Numéro Mode Résolution Addr départ
00h texte 40*25*2 B8000h
01h texte 40*25*16 B8000h
02h texte 80*25*2 B8000h
03h texte 80*25*16 B8000h
04h graph 320*200*4 B8000h
05h graph 320*200*4 B8000h
06h graph 640*200*2 B8000h
07h graph ? ?
08h graph (pcjunior) 160*200*16 ?
09h graph (pcjunior) 320*200*16 ?
0Ah graph (pcjunior) 640*200*4 B8000h
0Dh graph (EGA) 320*200*16 B8000h ?
0Eh graph (EGA) 640*200*16 A0000h
0Fh graph (EGA) 640*250*2 A0000h
10h graph (EGA) 640*350*16 A0000h
11h graph (MCGA) 640*480*2 A0000h
12h graph (VGA) 640*480*16 A0000h
13h graph (MCGA) 320*200*256 A0000h


Nous verrons ici les modes 03h et 13h

3. Le mode 03h (mode texte)

Les données sont stockées en 0xB800:0x0 comme suit mov ax, 0003h
int 10h
call screeclean
; Fonction qui rempli l'écran en bleu
screenclean:
push bx
mov bx, 0B800h ; Emplacement mémoire
mov es, bx
mov ah, 20h ; Couleur de fond 2(bleu) et couleur caractere 0(noir)
xor bx, bx ; On commence en 0xB800:0x00
.scdebut:
cmp bx, 4000 ; 80 (horizontal) *25 (vertical) *2 (caractere + couleurs) = 4000 octets
jz .scfin
mov al, ' ' ; Le caractere
mov [es:bx], ax ; Ecriture de ah (caractere) et al (couleurs)
add bx,2 ; On recule de deux octets
jmp .scdebut ; Et c'est reparti
.scfin:
pop bx
ret

4. Le mode 13h (mode graphique)

Les données sont stockées en 0xA000:0x0. L'équation pour l'adresse d'un point est :
A000h:((320*Y)+X) : bien que les parenthèses sont inutiles autour de la multiplication elle peuvent vous aidez à compredre, elle symbolise le nombre de pixels des lignes precedentes et le +X est le nb de pixels restant sur la ligne du point.

mov ax, 0013h
int 10h
call writepoint
; Ecrit un point sur l'écran en (10;10)
writepoint:
mov ax, 0A000h
mov es, ax
mov bx, 3210
mov [es:bx], 2C ; Le point est de couleur 2C
ret

Pour toutes questions le forum est à votre disposition !
Vous pouvez retrouver cet article sur Informatips.

Si vous avez un commentaire à faire à l'auteur de cet article, cliquez ici !