Les framebuffer

Le framebuffer est fourni par le bootloader, le bootloader doit fournir aussi la taille de ce frambuffer, en largeur et en hauteur, il fournit aussi le nombre de bit par pixel. Ces framebuffers utilisent le VGA (ou le vbe).

Il y a deux type de framebuffers:

  • Les framebuffers de textes: l'écran est une grille de caractère, on peut seulement faire du texte, on le nomme aussi le vga en mode texte.
  • Les framebuffers de pixels: l'écran est une grille de pixels, on peut éditer pixels par pixels.

C'est un moyen basique de dessiner l'écran dans un kernel, cependant pour faire certaines choses plus compliqués nous sommes obligé d'utiliser, soit un driver gpu, soit un driver de gpu virtuel (seulement utile dans une machine virtuelle, comme qemu). C'est donc au CPU de faire le rendu.

Les framebuffers textes

Les framebuffers de textes utilisent 16bit pour chaque caractères: 8 pour la couleur, et 8 pour le caractère:

bitssignifications
0-7caractère ASCII
8-11couleur du texte
12-15couleur de fond

Les couleurs sont formées comme ceci:

valeurcouleur
0
noir
1
bleu
2
vert
3
cyan
4
rouge
5
magenta
6
marron
7
gris clair
8
gris
9
bleu clair
10
vert clair
11
cyan clair
12
rouge clair/rose
13
magenta clair
14
jaune
15
blanc

Les framebuffers de pixels

Les framebuffers de pixels sont généralement plus simple, cependant ici nous prenons en compte que si le nombre de bit par pixels sont à 24 ou a 32, car les autres valeurs ne sont plus utilisés. Il est plus facile d'utiliser un framebuffer de 32 bit de pixels car l'alignement est automatique, mais il utilise 33% plus de mémoire, contre celui à 24 bit par pixels qui économise de la mémoire mais l'accès aux pixels est plus compliquée.

bytecouleur
0valeur du bleu (0-255)
1valeur du vert (0-255)
2valeur du rouge (0-255)
3byte utilisé pour l'alignement (seulement quand bpp = 32)

L'utilisation d'un framebuffer 32bpp est plus rapide car nous pouvons utiliser le framebuffer comme une table de uint32_t, contre le 24bpp ou nous sommes obligé de le convertir en table de uint8_t pour ensuite accéder aux couleurs.