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é .

  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.

  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 ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Sans doute de 80 colonnes et 25 lignes.

    Mais des #define ou des constantes seraient mieux...

  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

  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'

  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.

  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 .

  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 379
    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 379
    Points : 41 573
    Points
    41 573
    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)

  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 !

  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 .

  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.

  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 .

  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 .

  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 ...

  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;
    	}
    }

  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 .

  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 ?

  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 .

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