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 :

Probléme d'execution de mon Kernel perso


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut Probléme d'execution de mon Kernel perso
    Bonjour à tous ,

    j'essaie de faire mon OS perso , j'ai fait un MBR qui marche avec succés , et le kernel en ASM fonctionne lui parfaitement , puis , pour passer d'un kernel en ASM à un kernel en C , j'ai du activer le mode protégé , ceci a pour conséquence que toutes les interruptions seront inutilisables , donc pour écrire à l'écran , j'adresse les différents caractéres à l'adresse 0xB8000 , pour me simplifier la tache , j'ai déclaré mes propres routines en C pour écrire à l'écran , voilà le code du noyau :
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    #define VIDEORAM 0xB8000
    #define ATTR 0x07 // Attribut par défaut
     
    int x=0;
    int y=0;
     
    void effacer_ecran (){
    	int i;
    	int j;
    	unsigned char* screen;
    	for (i=0;i<25;i++){
    		for (j=0;j<80;j++){
    			*screen=0x0;
    			*(screen+1)=ATTR;
    		}
    	}
    }
     
    void ecrire ( char* chaine ){
    	char* ptr_chaine;
    	ptr_chaine=chaine;
    	unsigned char* screen;
    	screen=(unsigned char*) VIDEORAM;
    	while (*ptr_chaine!=0){
    		if(*ptr_chaine!=10){
    			*screen=*ptr_chaine;
    			*(screen+1)=ATTR;
    			if(x+1>79){
    				x=0;
    				if(y+1>24){
    					y=0;
    					effacer_ecran();
    				} else y++;
    			} else x+=2;
    			screen+=x+(y*79);
    		}
    		ptr_chaine++;
    	}
    }
     
    int kernel_main(void);
     
    void _start(void) {
    	kernel_main();
    }
     
    int kernel_main(void) {
    	effacer_ecran();
    	ecrire("Le kernel parle !");
    	while(1);
    }
    Pour le compiler , on peut le faire soit sous Linux , ou soit sous Windows ( Cygwin nécessaire ! ) .
    On fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gcc -c -ffreestanding -nostdinc -mno-stack-arg-probe kernel.c
    ld -i -e _kernel_main -Ttext 1000 -o tmp.o kernel.o
    objcopy -R .note -R .comment -S -O binary tmp.o kernel.bin
    Tout se compile bien , mais lors de l'execution avec BOCHS ( émulateur PC , pour que je ne risque rien ) , ça redémarre sans fin ,!
    Et en débugant avec BOCHS , j'obtiens ces deux erreurs :
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BxError: instruction with opcode=0xff
    mod was c0, nnn was 7, rm was 7
    WARNING: Encountered an unknown instruction (signalling ille
    gal instruction)
    C'est bizarre , puisque je n'ai rien manipulé à l'adresse 0xff !!!

    Peut quelqu'un m'aider ?
    Y a-t-il une erreur dans mon code peut-être ? erreur lors de l'ajout de 2 à 0xB8000 peut être ?

    Merci beaucoup beaucoup d'avance .

    PS : pour tester vous même le code , vous devez faire votre propre secteur de boot pouvant passer en mode protégé , le kernel doit être placé dans le deuxiéme secteur , vous ouvrez ce secteur , vous faites un jmp dword 0x8:ADRESSE_SUR_LAQUELLE_LE_SECTEUR_EST_CHARGEE et le tour est joué , biensûr , ce jmp doit être aprés , et seulement aprés , avoir passé en mode protégé .
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  2. #2
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Tu n'as pas initialisé screen dans effacer_ecran.
    L'itération est humaine; la récursion, divine.

  3. #3
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Ils sortent d'où tes 79 et tes 24 dans ecrire ?
    Je ne répondrai à aucune question technique en privé

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Sans doute de 80 colonnes et 25 lignes.

    Mais des #define ou des constantes seraient mieux...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Mayti4
    Tu n'as pas initialisé screen dans effacer_ecran.
    Si , lis bien la déclaration de ma fonction , il y a ceci
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  6. #6
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Perso, j'aurais plutôt vu : *ptr_chaine!='\0'
    Je ne répondrai à aucune question technique en privé

  7. #7
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Citation Envoyé par bouazza92
    Si , lis bien la déclaration de ma fonction , il y a ceci
    J'ai dis initialisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *screen = (unsigned char *) VIDEORAM;
    Citation Envoyé par millie
    Perso, j'aurais plutôt vu : *ptr_chaine!='\0'
    C'est pareil.
    L'itération est humaine; la récursion, divine.

  8. #8
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par millie
    Ils sortent d'où tes 79 et tes 24 dans ecrire ?
    79 est le numéro de la dérniére cellule dans une ligne en mode 80*25 .
    et 24 est le numéro de la dérniére ligne !
    En effet , le PC compte depuis 0 , donc si on compte de 0 à 79 , c'est exactement 80 cellules , même chose pour les lignes .

    Merci quand même pour votre interet sur mon probléme et pour votre participation , mais peut quelqu'un m'aider ?

    Est-ce un probléme avec les pointeurs ? et pourtant , dans mon kernel en asm , j'accéde sans probléme à l'adresse 0xB8000 ( adresse de la mémoire vidéo ) avec un simple mov ( et une boucle ) alors que j'ai du mal à y accéder avec un pointeur en C ...

    Merci beaucoup pour toute réponse .
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  9. #9
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par bouazza92
    Si , lis bien la déclaration de ma fonction , il y a ceci
    Ce n'est pas une initialisation. screen vaut n'importe quoi... Une initialisation, ce serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char *screen = VIDEORAM;
    par exemple...

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    millie, Mayti4 : C'est pareil, mais pour des caractères, la version de millie est plus explicite.
    (c'est comme mettre un pointeur à NULL au lieu de zéro (du moins pour la plupart des implémentations)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Ah c'est vrai !
    Je confonds toujours déclaration avec initialisation
    Donc ma fonction assignait des emplacements divers dans la mémoire à 0 , donc une raison pour produire une erreur pendant le démarrage dans BOCHS , je vais essayer de corriger .

    Merci beaucoup pour vos réponses !
    C'est vrai , vous êtes la communauté la plus active du développement ( pas de réponse sur les autres forums ) , longue vie à ce site !
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  12. #12
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par Médinoc
    millie, Mayti4 : C'est pareil, mais pour des caractères, la version de millie est plus explicite.
    (c'est comme mettre un pointeur à NULL au lieu de zéro (du moins pour la plupart des implémentations)
    Ah beh vu que je suis habitué sur l'asm , je fais 0x0 , donc 0 .
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  13. #13
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Points : 9 818
    Points
    9 818
    Par défaut
    Ah beh vu que je suis habitué sur l'asm , je fais 0x0 , donc 0 .
    Oui, cela ne fait pas du code très propre, il y a une confusion entre les types char et int.
    Je ne répondrai à aucune question technique en privé

  14. #14
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    ça ne marche toujours pas , mais l'erreur a changé dans le débugage de BOCHS , voilà ce que j'ai :
    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
    00097613953i[CPU0 ] protected mode
    00097613953i[CPU0 ] CS.d_b = 32 bit
    00097613953i[CPU0 ] SS.d_b = 32 bit
    00097613953i[CPU0 ] | EAX=0009eff8  EBX=000000f2  ECX=00007cf2  EDX=00000000
    00097613953i[CPU0 ] | ESP=0009f000  EBP=00000000  ESI=000000f2  EDI=0000ffde
    00097613953i[CPU0 ] | IOPL=0 id vip vif ac vm RF nt of df if tf sf zf af pf cf
    00097613953i[CPU0 ] | SEG selector     base    limit G D
    00097613953i[CPU0 ] | SEG sltr(index|ti|rpl)     base    limit G D
    00097613953i[CPU0 ] |  CS:0008( 0001| 0|  0) 00000000 000fffff 1 1
    00097613953i[CPU0 ] |  DS:0010( 0002| 0|  0) 00000000 000fffff 1 1
    00097613953i[CPU0 ] |  SS:0010( 0002| 0|  0) 00000000 000fffff 1 1
    00097613953i[CPU0 ] |  ES:0010( 0002| 0|  0) 00000000 000fffff 1 1
    00097613953i[CPU0 ] |  FS:0010( 0002| 0|  0) 00000000 000fffff 1 1
    00097613953i[CPU0 ] |  GS:0010( 0002| 0|  0) 00000000 000fffff 1 1
    00097613953i[CPU0 ] | EIP=000000f7 (000000f7)
    00097613953i[CPU0 ] | CR0=0x00000011 CR1=0 CR2=0x00000000
    00097613953i[CPU0 ] | CR3=0x00000000 CR4=0x00000000
    00097613953i[CPU0 ] >> lock push ebx : F053
    Dans les trois premiéres lignes , pas de probléme , vu que mon secteur de boot est passé en mode protégé .
    Mais la dérniére ligne est anormale , puisque je ne sais pas comment le mot lock y est
    Et puis , voilà un autre message de BOCHS ( dans le même sujet que le dernier , LOCK ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LOCK prefix unallowed (op1=0x53, attr=0x0, mod=0x0, nnn=0)
    Peut quelqu'un m'aider à résoudre ce probléme ?

    Merci d'avance .
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  15. #15
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Je précise qu'il n'y a aucune erreur avec mon secteur de boot ou le jmp vers mon kernel , car quand je vide kernel_main , c'est à dire sans ecrire() ni effacer_ecran() , ça marche sous BOCHS .
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  16. #16
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Citation Envoyé par millie
    Oui, cela ne fait pas du code très propre, il y a une confusion entre les types char et int.
    Bon merci pour ta réponse , mais même avec '\0' ça ne marche toujours pas ...
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  17. #17
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Tu n'incrémente pas screen dans effacer_ecran.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void effacer_ecran()
    {
    	unsigned char *screen = (unsigned char *) VIDEORAM;
    	int i;
     
    	for( i = 0; i < (80*25); i++ )
    	{
    		*screen++ = 0x0;
    		*screen++ = ATTR;
    	}
    }
    Essaies plus simple pour ta fonction ecrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void ecrire( char* chaine )
    {
    	unsigned char* screen= (unsigned char*) VIDEORAM;
    	int i = 0;
     
    	while ( chaine[i] != '\0' )
    	{
    		*screen = chaine[i++];
    		 screen += 2;
    	}
    }
    L'itération est humaine; la récursion, divine.

  18. #18
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Bonjour à tous ,

    L'erreur persiste encore , bien , ça écrit un S ( d'où vient-il ? ) à l'écran de bochs , mais aprés , ça redémarre ...
    Est-ce une mauvaise compilation ? comment faites-vous pour compiler un kernel sous Windows ( bon sous Linux c'est très simple en effet ) ?

    Voilà le code final et "simple" que j'utilise , merci à Mayti4 ( j'ai fait quelques modifications ... ) :
    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
    void ecrire( char* chaine )
    {
    	unsigned char *screen;
     
    	screen = (unsigned char *)0xB8000 ;
    	int pos=0;
    	int i = 0;
     
    	while ( chaine[i] != '\0' )
    	{
    		screen[pos++] = chaine[i++];
    		screen[pos++] = ATTR;
    	}
    }
     
    int kernel_main(void) {
    	ecrire("Le kernel parle !");
    	while(1);
    }
    vous verrez qu'il n'y a pas de main , mais c'est faux , il y a kernel_main , en effet , il est impossible d'utiliser main sous windows sans aucune librairie ou header externe , je spécifie bien à l'éditeur de liens d'utiliser kernel_main ( sinon , d'où viendrai le S dans l'écran de BOCHS ? ) .

    Merci d'avance pour toute réponse .
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  19. #19
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Serait-ce une mauvaise manipulation de chars ou pointeurs ?
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

  20. #20
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    Points : 113
    Points
    113
    Par défaut
    Bon je crois bien que ça vient d'une mauvaise manipulation de chars , car ce code de test ( écrivant HELLO à l'écran ) marche très bien :
    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
    int kernel_main(void){
      	unsigned char *fb;
     
    	fb = (unsigned char *)0xB8000 ;
    	fb[0] = 'H';
    	fb[1] = 0x07;
    	fb[2] = 'E';
    	fb[3] = 0x07;
    	fb[4] = 'L';
    	fb[5] = 0x07;
    	fb[6] = 'L';
    	fb[7] = 0x07;
    	fb[8] = 'O';
    	fb[9] = 0x07;
    	while(1);
    }
    Mais où est ma mauvaise manipulation de chars ( ou de pointeurs ) dans mes premiers codes ?

    Merci d'avance .
    Forum Programmation d'OS - Tutoriel pour créer un petit noyau 32 bits .

    ( le développement de littlefoot86 est abandonné ... )

Discussions similaires

  1. Problèmes de calage sur mon site perso avec les nouveaux navigateurs
    Par safeerbandali dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 23/07/2011, 23h28
  2. [Débutant] Problème d'execution de mon programme
    Par id_rima dans le forum C++Builder
    Réponses: 1
    Dernier message: 03/06/2010, 18h13
  3. [XL-2003] problème pour executer mon code sur un autre pc
    Par jess59 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 04/06/2009, 09h24
  4. Problème d'execution avec mon application
    Par jfdmagic dans le forum Installation, Déploiement et Sécurité
    Réponses: 9
    Dernier message: 29/05/2009, 13h23
  5. [VB6]problèmes pour executer mon projet en VB
    Par Walowalo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 29/04/2006, 19h27

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