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

C Discussion :

Probleme programmation Kernel


Sujet :

C

  1. #1
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut Probleme programmation Kernel
    Bonsoir à tous ,

    J'essaye de programmer un debut de petit kernel , pour apprendre .

    Cependant mes codes ne fonctionnes pas , alors que lorsque je les essaye avec un programme en C "normal" ( avec #include <stdio.h> etc ) ...

    Pour le premier code , j'utilise les structure , mais seulement lorsque je teste la structure reçu , la valeur de pX = 0 alors qu'elle devrait être égale à 1 ...

    Voici mon code , il affiche 'D' ( pos.pX=0 ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void _start(void)
    {
    		Position p;
    		p.pX=1;
    		p.pY=1;
    		print("un message\n",p);
            //kattr = 0x4E;
            print("un autre message\n",p);
    /*
            scrollup(2);
    */
            while (1);
    }
    Code : 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
    void print(char *string,Position pos)
    {
     
        if(pos.pX==1)
        {
              //printf("putcar k=%d",k);
            unsigned char* p;
            p=(unsigned char*)RAMSCREEN;
            *(p+1)='1';
            *(p+2)=0x57;
        }
        else if(pos.pX==0)
        {
                     //printf("putcar k=%d",k);
            unsigned char* p;
            p=(unsigned char*)RAMSCREEN;
            *(p+1)='D';
            *(p+2)=0x57;
        }
        // putcar('A',kX);
        /*
            while (*string != 0) {  // tant que le caractere est different de 0x0 
                    putcar(*string);
                    string++;
            }
        */
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct
    {
    	unsigned int pX;
    	unsigned int pY;
    }Position;


    Le code ne fonction pas non plus avec des pointeurs sur des variables , là le code affiche 'V' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void _start(void)
    {
    		unsigned int a=1;
    		print("un message\n",&a);
            //kattr = 0x4E;
            print("un autre message\n",&a);
    /*
            scrollup(2);
    */
            while (1);
    }
    Code : 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
    void print(char *string,unsigned int* pos)
    {
     
        if(*pos==1)
        {
              //printf("putcar k=%d",k);
            unsigned char* p;
            p=(unsigned char*)RAMSCREEN;
            *(p+1)='1';
            *(p+2)=0x57;
        }
        else if(*pos==0)
        {
                     //printf("putcar k=%d",k);
            unsigned char* p;
            p=(unsigned char*)RAMSCREEN;
            *(p+1)='D';
            *(p+2)=0x57;
        }
        else
        {
            unsigned char* p;
            p=(unsigned char*)RAMSCREEN;
            *(p+1)='V';
            *(p+2)=0x57;
        }
        // putcar('A',kX);
        /*
            while (*string != 0) {  // tant que le caractere est different de 0x0 
                    putcar(*string);
                    string++;
            }
        */
    }

    Ça ne fonctionne pas non plus avec des variables globales...

    Tout cela fonctionne correctement avec un programme "normal".

    Merci d'avance pour votre aide !

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 055
    Billets dans le blog
    141
    Par défaut
    Bonjour,

    Que cherchez vous à faire ?
    Pourquoi il y a un while(1) ?
    C'est de la programmation noyau Linux ?
    Faire un while(1) dans un module ferait crasher le noyau, non ? (avec un watchdog pour dire que plus rien ne répond). Qu'indique dmesg ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    J'essaye d'apprendre à programmer un petit kernel moi même à partir de rien...
    Je ne comprends pas trop à quoi sert le while(1) mais lorsque je ne le mets pas , mon bootloader et kernel se recherche tout le temps donc dans ma fenetre de qemu ça "clignote" .
    Comment savoir ce qu'indique dmesg étant donné que je l’exécute dans qemu ?

    Merci de votre réponse .

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 055
    Billets dans le blog
    141
    Par défaut
    Oui, ma réponse est complètement inutile et erronée, j'étais parti sur la conception d'un module et non d'un noyau

    Par contre, je ne comprend pas pourquoi le test sur Pos.x ne fonctionne pas
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    Je suis vraiment étonné il y a vraiment rien qui fonctionne comme il faut ...
    Merci de ton intérêt quand même !

    Si quelqu'un à une idée , n'hésitez pas ^^

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 055
    Billets dans le blog
    141
    Par défaut
    Avec QEMU, je crois qu'il y a possibilité de lancer gdb, mais je peux me tromper. Sinon, avec des printf().
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    Oui on peut avec qemu , cependant je n'ai pas réussi .
    Pour les printf je ne peux pas , j'ai une erreur à la programmation
    kernel.c: (.text+0x23): référence indéfinie vers « puts »
    Mais du coup j'ai utilisé bochs qui contient un débogueur mais je n'ai pas réussi à apprendre grand chose avec , les champs de la structure valent 0 ...
    Pour les pointeurs ils pointent vers un nombre quelconque ...

    Merci.

  8. #8
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Neolex Voir le message
    J'essaye de programmer un debut de petit kernel (...) avec un programme en C "normal" ( avec #include <stdio.h> etc )
    tu ne peux pas utiliser les fonctions standard du C pour écrire un noyau vu qu'au moment où il prend la main elle n'est pas chargée, à ce niveau tu ne disposes que des fonctions du bios en gros pour afficher quelque chose, et elles ne sont pas accessibles directement dans le langage, il va falloir les écrire moyennant un peu d'assembleur (inline ou non), définir par exemple une fonction kprint() qui va utiliser la sous-fonction 0x13 de la fonction 0x10 du bios

    on écrit pas un noyau comme on écrit un pendu ou une calculette, il faut savoir où l'on va un minimum

    ps: pour ce qui est du debugging avec gdb c'est "bien, mais pas top", voir ici pour la manip

  9. #9
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    868
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 868
    Par défaut
    Pour faire de l'affichage kernel j'utilise la fonction printk. Normalement tu ne devrais pas avoir de while(1) dans ton code kernel, c'est le programme init qui devrait le contenir.

  10. #10
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    tu ne peux pas utiliser les fonctions standard du C pour écrire un noyau vu qu'au moment où il prend la main elle n'est pas chargée, à ce niveau tu ne disposes que des fonctions du bios en gros pour afficher quelque chose, et elles ne sont pas accessibles directement dans le langage, il va falloir les écrire moyennant un peu d'assembleur (inline ou non), définir par exemple une fonction kprint() qui va utiliser la sous-fonction 0x13 de la fonction 0x10 du bios

    on écrit pas un noyau comme on écrit un pendu ou une calculette, il faut savoir où l'on va un minimum

    ps: pour ce qui est du debugging avec gdb c'est "bien, mais pas top", voir ici pour la manip
    Je sais très bien tout ça. Pour ce qui est des fonctions du bios , j'ai fais un morceau où je les utilisent mais là je suis en mode protégé .

  11. #11
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par Neolex Voir le message
    Je sais très bien tout ça
    ah ok, j'avais lu que tu essayais de faire un kernel "en C normal avec stdio.h" (donc avec la libc), qu'avec printf tu semblais étonné que ça ne fonctionne pas (puisque printf est dans la libc également) et que tu n'avais pas réussi à marier qemu et gdb, du coup naïvement j'ai pensé que ça te serait utile, au temps pour moi

    mais du coup tu as raison en mode protégé on peut pas utiliser les fonctions BIOS, tu peux par contre afficher en écrivant directement dans la mémoire vidéo à partir de 0xb8000

  12. #12
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    Bonsoir , non en fait j'ai du mal m'expliquer , je voulais dire que les codes que j'avais fais fonctionnaient quand je les compilaient normalement ( l'histoire des pointeurs structures etc ) mais ne fonctionne pas en "mode kernel" .
    Oui j'essaye justement d'écrire dans la mémoire vidéo , mais les problèmes de pointeurs structures et variables globales m’empêche de créer des fonctions qui fonctionne ^^

  13. #13
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    ah ok, du coup -un peu au hasard et en vrac- :
    - tu compilerais pas un binaire en 64bits pour du mode protégé par hasard ?
    - t'as rien oublié en passant en mode protégé, au niveau de la gdt ou autre, t'as vérifié que t'as bien accès aux registres 32bits ?
    - le code assembleur généré par ton code C au niveau des structures (les références de pointeurs etc.) a l'air "correct" ?

    enfin difficile de dire comme ça sans plus d'éléments, mais assez logiquement ça doit provenir soit d'une initialisation un peu bancale du mode protégé, soit d'un switch à la compilation en trop/qui manque sur ton code C à mon avis

  14. #14
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    Ah le problème vient peut être au niveau de la compilation en effet !
    Je compilais effectivement en 64bits...
    Voici mon Makefile , je n'arrive pas à le modifier pour compiler en 32bits ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    floppyA: bootsect kernel
    	cat bootsect kernel /dev/zero | dd of=floppyA bs=512 count=2880
     
    kernel: kernel.o screen.o
    	ld --oformat binary -Ttext 1000 kernel.o screen.o -o kernel
     
    kernel.o: kernel.c
    	gcc -c kernel.c -o kernel.o
     
    screen.o: screen.c
    	gcc -c screen.c -o screen.o
     
    bootsect: bootsect.asm
    	nasm -f bin -o bootsect bootsect.asm

  15. #15
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 055
    Billets dans le blog
    141
    Par défaut
    Pour le 32 bits, je rajouterai un -m32 dans les lignes de compilation
    Je serai un peu précautionneux et je rajouterai aussi -fPIC, mais peut être pas nécessaire. Et surtout, les gros classiques : -Wall -Wextra.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  16. #16
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    Merci , j'ai essayé ça mais j'ai donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ld: architecture i386 du fichier d'entrée « screen.o » est incompatible avec la sortie i386:x86-64
    ld: architecture i386 du fichier d'entrée « kernel.o » est incompatible avec la sortie i386:x86-64

  17. #17
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 055
    Billets dans le blog
    141
    Par défaut
    Pour la ligne du ld, il faut peut être utiliser aussi -m32, mais je ne suis pas sur, j'utilise pas les flags de ld, mais de GCC, habituellement.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  18. #18
    Membre éclairé Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Par défaut
    J'ai essayé de mettre -melf_i386 et -mi386linux mais j'ai ces erreurs sur ld :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    kernel.o: dans la fonction « _start »:
    kernel.c:(.text+0xe): référence indéfinie vers « _GLOBAL_OFFSET_TABLE_ »
    screen.o: dans la fonction « putcar »:
    screen.c:(.text+0x66): référence indéfinie vers « _GLOBAL_OFFSET_TABLE_ »
    screen.o: dans la fonction « print »:
    screen.c:(.text+0x175): référence indéfinie vers « _GLOBAL_OFFSET_TABLE_ »
    Makefile:5*: la recette pour la cible «*kernel*» a échouée

Discussions similaires

  1. probleme programme C
    Par space_56 dans le forum C
    Réponses: 24
    Dernier message: 14/11/2007, 00h08
  2. probleme programme structuré.
    Par argon dans le forum C
    Réponses: 10
    Dernier message: 31/01/2007, 10h11
  3. Slider problème programmation
    Par Bizarroide63 dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 27/07/2006, 03h43
  4. Problème philosophique kernel
    Par getupa dans le forum Administration système
    Réponses: 5
    Dernier message: 16/06/2005, 12h07
  5. Probleme GLUT / KERNEL
    Par netah25 dans le forum GLUT
    Réponses: 5
    Dernier message: 05/03/2005, 23h31

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