Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation d'OS Assembleur Discussion :

Problème variable globales


Sujet :

Programmation d'OS Assembleur

  1. #1
    Membre expérimenté
    Problème variable globales
    Bonjour,

    Je suis en train de faire le tuto Pépin OS, et je bute sur un truc...

    kernel.c :
    Code C :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    extern void scrollup(unsigned int);
    extern void print(char *);
     
    extern char kY;
    extern char kX;
    extern char kattr;
     
    void _start(void)
    {
            kY = 10;
            kX = 10;
     
            kattr = 15;
            print("un message\n");
     
            kattr = 0x4E;
            print("un autre message\n");
     
     
            //scrollup(2);
     
            while (1);
    }


    screen.c :
    Code C :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
     
    #include "types.h"
     
    #define RAMSCREEN 0xB8000       /* début de la mémoire vidéo */
    #define SIZESCREEN 0xFA0        /* 4000, nombres d'octets d'une page texte */
    #define SCREENLIM 0xB8FA0
     
    // extern char kX;
    // extern char kY;
    char kX = 20;                    /* position courante du curseur à l'écran */
    char kY = 17;
    char kattr = 0x0F;              /* attributs vidéo des caractères à afficher */
     
     
    /* 
     * 'scrollup' scrolle l'écran (la console mappée en ram) vers le haut
     * de n lignes (de 0 a 25).
     */
    void scrollup(unsigned int n)
    {
            unsigned char *video, *tmp;
     
            for (video = (unsigned char *) RAMSCREEN;
                 video < (unsigned char *) SCREENLIM; video += 2) {
                    tmp = (unsigned char *) (video + n * 160);
     
                    if (tmp < (unsigned char *) SCREENLIM) {
                            *video = *tmp;
                            *(video + 1) = *(tmp + 1);
                    } else {
                            *video = 0;
                            *(video + 1) = 0x07;
                    }
            }
     
            kY -= n;
            if (kY < 0)
                    kY = 0;
    }
     
    void putcar(uchar c)
    {
            unsigned char *video;
            int i;
     
            if (c == 10) {          /* CR-NL */
                    kX = 0;
                    kY++;
            } else if (c == 9) {    /* TAB */
                    kX = kX + 8 - (kX % 8);
            } else if (c == 13) {   /* CR */
                    kX = 0;
            } else {                /* autres caractères */
     
                    video = (unsigned char *) (RAMSCREEN + 2 * kX + 160 * kY);
                    *video = c;
                    *(video + 1) = kattr;
     
                    kX++;
                    if (kX > 79) {
                            kX = 0;
                            kY++;
                    }
            }
     
            if (kY > 24)
                    scrollup(kY - 24);
    }
     
    /*
     * 'print' affiche à l'écran, à la position courante du curseur, une chaîne
     * de caractères terminée par \0.
     */
    void print(char *string)
    {
        while (*string != 0) {  /* tant que le caractère est différent de 0x0 */
                putcar(*string);
                string++;
        }
    }


    J'ai beau changer les valeurs de kX, kY et kattr dans kernel.c, c'est comme si la fonction putchar (de screen.c) considérait qu'elles sont toujours à zéro...
    C'est peut être ma façon de compiler / linker qui ne vas pas ?

    Je compile comme ça :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    rm *.o  floppyA.img
    gcc -m32 -c screen.c
    gcc -m32 -c kernel.c
    ld -m elf_i386 -Ttext 1000 kernel.o screen.o -o kernel
    cat bootsect kernel /dev/zero | dd of=floppyA.img bs=512 count=2880


    J'ai l'impression que c'est le linkage qui ne va pas...

    Quelqu'un pourrait m'éclairer svp ?

  2. #2
    Membre expérimenté
    j'ajoute que dans la fonction print avant le while je met :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    kX = 10;
    kY = 10;


    Là ca marche...mais bon du coup c'est en dur...

  3. #3
    Membre régulier
    En fait, j'ai eu le même problème.

    Maintenant je compile avec les options :
    Code bash :Sélectionner tout -Visualiser dans une fenêtre à part
    gcc -m32 -L/usr/lib32 -fno-pie -no-pie -fno-stack-protector -lssp


    Et pour lier :

    Code bash :Sélectionner tout -Visualiser dans une fenêtre à part
    ld --oformat binary -m elf_i386 -Ttext 1000


    Essaie voir si cela fonctionne pour toi, je n'ai plus le problème et cela a réglé le problème que tu auras un peu plus loin dans le tutoriel.

  4. #4
    Membre expérimenté
    Cool, merci je vais tester ca ce soir...

  5. #5
    Membre expérimenté
    Bon... ca ne marche pas...

    Je compile comme ca...c'est bien ca ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    gcc -m32 -L/usr/lib32  -fno-pie -no-pie -fno-stack-protector -lssp screen.c
    gcc -m32 -L/usr/lib32  -fno-pie -no-pie -fno-stack-protector -lssp kernel.c
    ld --oformat binary -m elf_i386 -Ttext 1000 kernel.o screen.o -o kernel


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /usr/bin/ld*: ne peut trouver -lssp
    collect2: error: ld returned 1 exit status
    /usr/bin/ld*: ne peut trouver -lssp
    /usr/bin/ld*: /tmp/ccEYGTQJ.o*: dans la fonction «*_start*»*:
    kernel.c<img src="images/smilies/icon_sad.gif" border="0" alt="" title=":(" class="inlineimg" />.text+0x0)*: définitions multiples de «*_start*»; /usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib32/crt1.o<img src="images/smilies/icon_sad.gif" border="0" alt="" title=":(" class="inlineimg" />.text+0x0)*: défini pour la première fois ici
    collect2: error: ld returned 1 exit status
    ld*: ne peut pas trouver kernel.o*: Aucun fichier ou dossier de ce type
    ld*: ne peut pas trouver screen.o*: Aucun fichier ou dossier de ce type


    Tu lie avec une lib qui s'appelle ssp ?

  6. #6
    Membre expérimenté
    Ca marche !

    Il manquait juste l'option -c pour la compilation avec gcc...

    Donc pour récapituler :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    gcc -m32 -L/usr/lib32  -fno-pie -no-pie -fno-stack-protector -lssp screen.c
    gcc -m32 -L/usr/lib32  -fno-pie -no-pie -fno-stack-protector -lssp kernel.c
    ld --oformat binary -m elf_i386 -Ttext 1000 kernel.o screen.o -o kernel


    Par contre quelqu'un peut me dire ce que c'est l'option -lssp ?