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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    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 chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    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
    Par défaut
    Ils sortent d'où tes 79 et tes 24 dans ecrire ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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
    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
    Par défaut
    Perso, j'aurais plutôt vu : *ptr_chaine!='\0'

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    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.

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    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 .

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    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 !

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    225
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 225
    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

  10. #10
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    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.

  11. #11
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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...

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