Simple Operating System - Chargement du noyau

Driver de la carte graphique

La carte graphique est mappée en mémoire à l'adresse 0xb8000 (qui correspond au début de la zone mémoire reroutée vers la carte graphique). Elle est vue comme un tableau à 2 dimensions de LIGNES x COLONNES éléments. Chaque élément correspond à une structure contenant un caractère et un attribut (souligné, couleur, couleur de fond...).

    
      /* The text video memory starts at address 0xB8000. Odd bytes are the
      ASCII value of the character, even bytes are attribute for the preceding character. */
      #define VIDEO   0xb8000

      /* Console screen size */
      #define LINES   25
      #define COLUMNS 80
      
      /** The structure of a character element in the video memory. @see
      http://webster.cs.ucr.edu/AoA DOS edition chapter 23 */
      typedef struct {
        unsigned char character;
        unsigned char attribute;
      } __attribute__ ((packed)) x86_video_mem[LINES*COLUMNS];
    
  

Effacer l'écran

Pour éffacer l'écran il suffit d'itérer sur tous les éléments de la zone mémoire graphique et de positionner le caractère à 0, l'attribut peut être utilisé pour modifier la couleur de fond par exemple.

    
      sos_ret_t sos_x86_videomem_cls(unsigned char attribute)
      {
        /* Clears the screen */
        int i;
        for(i = 0 ; i < LINES*COLUMNS ; i++)
        {
          (*video)[i].character = 0;
          (*video)[i].attribute = attribute;
        }

        return SOS_OK;
      }
    
  

Ecriture d'un caractère à l'écran

Pour réaliser cette opération il suffit de positionner l'offset vidéo sur la ligne (nb lignes x nb colonnes) et la colonne (ligne + nb colonnes) souhaitées. Il ne reste plus qu'à positionner le caractère ainsi que son attribut.

    
      sos_ret_t sos_x86_videomem_putchar(unsigned char row, unsigned char col,unsigned char attribute,unsigned char c)
      {
        unsigned video_offs = row*COLUMNS + col;

        if (video_offs >= LINES*COLUMNS)
        return -SOS_EINVAL;

        (*video)[video_offs].character = c;
        (*video)[video_offs].attribute = attribute;

        return SOS_OK;
      }
    
  

Valid XHTML 1.0!