IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 :

Souci avec un tuto


Sujet :

Programmation d'OS Assembleur

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    août 2006
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 1 091
    Points : 1 727
    Points
    1 727
    Par défaut Souci avec un tuto
    Bonjour,

    Je lis actuellement l'excellent tuto de Michelizza, mais je rencontre des problèmes chez moi. Notamment cette partie : https://michelizza.developpez.com/re...e-systeme/#LVI

    J'ai simplement la ligne "kernel : loading new gdt..." qui défile à l'infini et de temps en temps le bootloader qui se relance... Manifestement, il y a un soucis. Est-ce que cela fonctionne chez vous ? Comment faire fonctionner cet exemple ?

    J'utilise QEmu. (Je ne suis pas à l'aise avec Bochs, trop relou à paramétrer)

    J'ai légèrement modifié les Makefile afin de supprimer quelques erreurs. (Je ne sais pas si c'est la cause)

    Une piste ?

    Merci par avance.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    août 2006
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 1 091
    Points : 1 727
    Points
    1 727
    Par défaut
    Bon, je me réponds à moi-même. J'ai ENFIN trouvé la source du problème, complètement par hasard.

    Y avait un problème dans un Makefile. J'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ld -melf_i386 -Ttext 1000 $^ -o $@
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ld -melf_i386 -Ttext 2000 $^ -o $@
    . Et maintenant ça roule impec !

    Maintenant, reste à savoir pourquoi ça coinçait...

  3. #3
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    3 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 3 011
    Points : 9 389
    Points
    9 389
    Par défaut
    Ttext est une option du compilo pour indiquer où se trouve le code en memory map (en gros pour que les call/label n'ont pas une adresse faussé)
    La bonne adresse doit être 0x1000 si j'ai bien compris :


    Mais d’après OS Dev on peut mettre du code à 0x500 :
    https://wiki.osdev.org/Memory_Map_(x86)

    Et si ça marchais pas à 1000 , c'est que 1000 en hexa fait 0x3E8 , qui correspond aux table d’interruption et aux BIOS
    A 2000 tu es à 0x7D0 donc un espace libre .

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    août 2006
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 1 091
    Points : 1 727
    Points
    1 727
    Par défaut
    C'est bizarre, cette histoire ! Quelle pourrait donc être l'origine du problème ?

    D'après la doc de l'outil ld, Ttext est toujours en hexa. Donc le "0x" est facultatif.

    Avec 500 ou 1000 ça marche pas chez moi.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    août 2006
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : août 2006
    Messages : 1 091
    Points : 1 727
    Points
    1 727
    Par défaut
    J'ai sorti le fichier lié en assembleur, et effectivement il y avait un gros problème. En fait, le fichier sorti était en format ELF. Ca pouvait pas marcher puisqu'il fallait du binaire.

    Voici le makefile, que j'ai modifié et qui fonctionne maintenant :

    Code Makefile : 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
    OBJ=kernel
    CC=gcc -Wall -m32
     
    all: $(OBJ) 
     
    kernel.elf: kernel.o screen.o lib.o gdt.o idt.o interrupt.o int.o pic.o
    	ld -melf_i386 -o $@ -Ttext 1000 $^
     
    kernel: kernel.elf
    	objcopy -O binary kernel.elf kernel.bin
     
    int.o: int.asm
    	nasm -f elf32 -o $@ $^ 
     
    .o: .c 
    	$(CC) -c $^
     
    clean:
    	rm -f $(OBJ) *.o *.elf

    A l'origine, le "ld" avait bien l'option "--oformat binary", mais cela me générait plein d'erreurs ! (liées à la __GLOBAL_OFFSET_TABLE__ ) D'où la modif que j'avais effectuée et qui ne marchait pas bien du coup. C'est peut-être pour ça qu'avec l'adresse 0x2000 ça fonctionnait, mais ce n'était que pur hasard je suppose

    Est-ce qu'il y a moyen de générer du binaire depuis "ld" directement, sans passer par "objcopy", sans que cela me génère un paquet d'erreurs ? Bon après, c'est peut-être pas super indispensable... Si ça marche comme ça...

  6. #6
    Expert éminent
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    mai 2010
    Messages
    3 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : mai 2010
    Messages : 3 011
    Points : 9 389
    Points
    9 389
    Par défaut
    GCC fournit du .elf par défaut , du coup , étonnant que cela marche...
    (mais il y'a des chances qu'il exécute du code "aléatoire" , vu que l'entete du .elf est exécuter...)
    Sinon tu peux remettre "-oformat binary" sur ld , et donc il fournit le binaire , objcopy doit sûrement faire une simple copy.

    Je n'utilise jamais objcopy pour la sortie des binaire seulement ld.

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    14 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 14 233
    Points : 32 723
    Points
    32 723
    Par défaut
    Est-ce qu'il y a moyen de générer du binaire depuis "ld" directement, sans passer par "objcopy", sans que cela me génère un paquet d'erreurs ?
    Regarder du coté de l’option gcc :
    -wl permet de passer directement des options au linker.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Soucis avec base MySQL sur tuto
    Par Shirraz dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 13/07/2009, 18h36
  2. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 18h13
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 17h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 16h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo