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

Autres éditeurs Discussion :

Modele de memoire


Sujet :

Autres éditeurs

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Modele de memoire
    Bonjour,

    Sur http://fr.wikipedia.org/wiki/X86 on peut lire, en gros que le modèle de mémoire LARGE permet d'avoir plusieurs segments de code et de data.

    Avec Turbo C, configuré avec le modèle de mémoire large, je compile le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unsigned char toto[65000];
    unsigned char titi[65000];
     
    main()
    {
       return(0);
    }
    Et la j'ai l'erreur:

    Too much global data defined in file

    C'est bizarre, en modèle tiny ou medium cela ne m'aurait pas choqué, mais en large le compilateur devrait trouver les adresses des variables à partir du segment et de l'offset ?

    Sur un autre code, compilé toujours en mémoire large, et en regardant avec Turbo Debugger je constate qu'il accède à la variable uniquement avec son offset, DS étant initialisé au segment de début de donnée, et pas réactualisé si on change de segment. Donc si les données globales dépassent ce segment, il n'arrive pas à y accéder.

    Je suis novice en C, quelqu'un pourrait-il m'expliquer d'où vient mon erreur ?

    Cordialement.

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lovmy Voir le message

    Sur http://fr.wikipedia.org/wiki/X86 on peut lire, en gros que le modele de memoire LARGE permet d'avoir plusieurs segments de code et de data.

    Avec Turbo C, configurer avec le modele de memoire large, je compile le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    unsigned char toto[65000];
    unsigned char titi[65000];
     
    main()
    {
       return(0);
    }
    Et la j'ai l'erreur:

    Too much global data defined in file
    Ce n'est pas un problème de C mais d'architecture. Un x86 en mode réel (16-bit) a une capacité d'adressage de 65536 octets par segment. Or, même en mode large, où le segment de donné n'est pas partagé avec le code, celui-ci ne peut dépasser 65536 octets (et encore, certains sont réservés par le système).

    Ce que tu demandes est donc physiquement impossible en statique. Par contre, tu peux allouer jusqu'à 640k (voire plus avec des astuces plus ou moins complexes) en mémoire dynamique cumulée, tout en sachant qu'un objet ne peut dépasser 64k de mémoire contigüe.

    Si tu as des problèmes de mémoire, je te conseille d'oublier le mode réel (obsolète depuis le 386 et Windows 3.x, années 90/95), et de passer au moins en mode protégé (32-bit) avec un compilateur moderne comme gcc. Quel est ton système ?
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il n'y avait pas un mode huge qui permettait de s'affranchir des contraintes du mode large sur la taille totale des données globales et la taille des objets?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Il n'y avait pas un mode huge qui permettait de s'affranchir des contraintes du mode large sur la taille totale des données globales et la taille des objets?
    A ma connaissance, il est buggé.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    (Ca me rappelle un vieux Borland C pour window 3.1)

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Gruik Voir le message
    (Ca me rappelle un vieux Borland C pour window 3.1)
    Citation Envoyé par P.O.
    Avec Turbo C,
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Autant pour moi...
    Bonjour,

    Je pensait que l'option de sélection de type de mémoire jouait sur le comment le compilateur accède aux données (si il met a jour DS suivant les variables à atteindre). Mais dans mon cas ce n'est pas trés grave, en fait je fait un petit test de programme qui tourne sans OS, donc je connait l'adresse de début de code : 07C0:000 pour le début du code boot (les 512 octets chargés par le bios), 07E0:0000 pour le début de mon code en C (le kernel), et TC me fournit une variable, _DATA, qui contient le segment de mes données. Donc si par exemple _DATA = 0E6D, je sais sur mon segment de donnée commence en 07E0+0E6D=164D (oui TC me donne le segment par rapport à 0, quand je compile il ne sais pas que mon code commencera au segment 07E0). A partir de la, sachant que mon segment de données ne dépassera pas un segment, j'en déduit qu'il est compris entre 164D:0000 et 164D:FFFF.
    Donc je peut faire un pointeur sur 264D:0000, 364D:000 etc... Pour avoir autant de bloc de 64k que je veux, dans la limite des 640k.

    Merci de vos reponses !

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lovmy Voir le message
    Bonjour,

    Je pensait que l'option de sélection de type de mémoire jouait sur le comment le compilateur accède aux données (si il met a jour DS suivant les variables à atteindre). Mais dans mon cas ce n'est pas trés grave, en fait je fait un petit test de programme qui tourne sans OS, donc je connait l'adresse de début de code : 07C0:000 pour le début du code boot (les 512 octets chargés par le bios), 07E0:0000 pour le début de mon code en C (le kernel), et TC me fournit une variable, _DATA, qui contient le segment de mes données. Donc si par exemple _DATA = 0E6D, je sais sur mon segment de donnée commence en 07E0+0E6D=164D (oui TC me donne le segment par rapport à 0, quand je compile il ne sais pas que mon code commencera au segment 07E0). A partir de la, sachant que mon segment de données ne dépassera pas un segment, j'en déduit qu'il est compris entre 164D:0000 et 164D:FFFF.
    Donc je peut faire un pointeur sur 264D:0000, 364D:000 etc... Pour avoir autant de bloc de 64k que je veux, dans la limite des 640k.

    Merci de vos reponses !
    Oui, très joli... Rien de tout ça n'a à voir avec le langage C...
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 272
    Points : 166
    Points
    166
    Par défaut Hein ?
    Bonjour,

    Le choix du modèle de mémoire d'un compilateur C n'a rien à voir avec du C ? Je développe mon kernel en C, et créer des pointeurs sur des zones mémoires fait aussi parti du C.

    Maintenant si on entends par C le fait de développer sous Linux ou Windows en utilisant les librairies fournit par ces OS...

    Cordialement.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Lovmy Voir le message
    Le choix du modèle de mémoire d'un compilateur C n'a rien à voir avec du C ? Je développe mon kernel en C, et créer des pointeurs sur des zones mémoires fait aussi parti du C.
    Ben non. Ca a à voir avec ton architecture, ton compilateur, ton système...

    Les problèmes de modèles de mémoire en x86 mode réel éxistent en assembleur, Pascal, BASIC... Ils ne sont pas spécifiques au C (qui ne sait même pas ce que c'est, seul ton compliateur est au courant...)
    Pas de Wi-Fi à la maison : CPL

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

Discussions similaires

  1. [LG]Mémoire dynamique
    Par FJUILLET dans le forum Langage
    Réponses: 5
    Dernier message: 10/02/2004, 11h15
  2. [swing] probleme de memoire
    Par leBigouden dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 23/05/2003, 14h19
  3. gestionnaire de memoire
    Par elone dans le forum C
    Réponses: 2
    Dernier message: 23/01/2003, 00h31
  4. récupérer la memoire et tableau dynamique
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 06/01/2003, 08h02
  5. programmation reseau - couche 2 du modele osi
    Par sahor dans le forum C++Builder
    Réponses: 3
    Dernier message: 06/11/2002, 18h33

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