Problème et inconsistance avec des variable global en C

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je travaille actuellement à développer un petit noyau en C (github du projet) en me basant sur ce tutoriel : liens github

Mon problème est que toutes les variables globales que je définis ont toute la valeur 0.

Exemple

  • int x = 23; et au moment de l’exécution: x = 0
  • Idem pour les pointeurs : char* video_memory = (char*)0xb8000; qui point tous à 0x0.
  • En revanche les arrays n’ont pas l’aire affecter par ce problème.

Mon environnement

  • OS : linux (Fedora 25)
  • Compiler : GCC (6.3.1), GNU ld (6.3.1), NASM (2.12.2), GNU make (4.1)
  • Vm : qemu 2.7.1

Fichiers

à mon sujet (on ne sait jamais le problème peut venir de moi XD)

  • Je suis étudiant en informatique.
  • J’ai suivi le tutoriel de C sur ce site et sur un autre au design orange en plus de ceux qui sont dispensés par ma faculté.

J’espère que vous pourrez m’aider, car ça fait déjà 2 jours où je fais des recherches et je n’ai pas trouvè comment résoudre sa :/ Merci d’avance :)

Après un petit tours dans la doc C et avec un petit test, il semblerait bien que ce soit un bug et pas un truc obscure du C (on sait jamais :p ).

Est-ce qui tu utilises tes variables globales en dehors des fichiers dans lesquels elles sont déclarés? Si oui, comment?

Peut-être que regarder l’assembleur produit te donnera une meilleur idée du problème. Après avoir compilé ton fichier, utilise cette commande objdump -d -M intel -j .data -j .text -r keyboard.o. Cela te permettra de savoir si le problème vient de la compilation de keyboard.c. Pour savoir si le linkage s’est bien passé, tu peux désassembler ton kernel.bin avec objdump -d -M intel -j .data -j .text kernel.bin.

Si le problème ne vient ni de la compilation, ni du linkage. Ça laisse supposer que ta mémoire est "vidé" à l’exécution. Pour le coup c’est probablement bien plus difficile à débugger.

Salut !

Je ne fais que de l’embarqué baremetal donc je ne sais pas si ça s’applique ici, mais ça ressemble fortement à un oubli de copie du segment .data vers la mémoire.

Comme dit par mon VDD, vérifie que tout est bien chargé dans .data, si oui c’est que ce n’est pas copié, si non c’est certainement un problème de linkage.

Merci, @Berdes et @unidan :)

C’était bien un problème du chargement du noyau en mémoire. C’était enfaîte mon bootloader qui ne chargeait pas tout le .data mais seulement une partie. ;)

Maintenant, il vas juste falloir que je trouve un moyen de déterminer la taille du noyau automatiquement. Pour l’instant la valeur est hard-codé dans le bootloader ^^

https://www.math.utah.edu/docs/info/ld_3.html#SEC8 <= pour obtenir l’adresse courante

https://www.math.utah.edu/docs/info/ld_3.html#SEC11 <= pour exporter des symboles

tu peux ensuite récupérer les symboles en écrivant

1
2
export int _start_data;
export int nom_du_symbole;

et l’adresse de ces symboles correspond à la VMA (si tu utilises le location counter) ou la LMA (si tu précises que tu veux obtenir la LMA).

Si tu n’es pas familier avec ces notions, je te conseille de potasser un peu la documentation autour des linker scripts et de gold.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte