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 :

Lire le contenu de la mémoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut Lire le contenu de la mémoire
    Bonjour,

    J'aimerais savoir s'il serait possible de faire un programme ayant la capacité de parcourir la mémoire et d'imprimer sous forme de caractères les données contenues dans celle-ci

    Le code suivant ne fonctionne pas, il crée une erreur lorsqu'il est exécuté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    #define MEM_MBSIZE 2048
    #define MEM_BYTESIZE (MEM_MBSIZE * 1024 * 1024)
     
    int main(void) {
            char *ptr;
     
            for (ptr = (char *) 1; ptr < (char *)MEM_BYTESIZE; ptr++)
                    putchar(*ptr);
     
            return 0;
    }
    Est-ce à cause du compilateur?
    Est-ce parce que le système d'exploitation limite la mémoire utilisable par le programme?
    Pourrait-on réaliser cela en ayant recours à des méthodes non standard?
    Y a-t-il un langage quelconque qui pourrait parvenir au résultat désiré?

    Merci!

    Array

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    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 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Ce qu'il me semble que tu essaie de faire , c'est lire de la mémoire, mais qui n'est pas à toi.
    Par défaut, le système d'exploitation va t'en en empecher.
    Plus précisément, lorsque tu vas essayer de acceder ( lire ou ecrire ) à une partie de la mémoire qui ne t'ai pas réservé, il va t'envoyer boulet... ( Erreur de segmentation ).
    Pour chaque programme le système réserve de la mémoire, et normalement tu ne peux pas voir celle des autres ( mode protégé ).

    Ce n'est pas à cause du compilateur, car ton code compile ( soit on peut en faire un exécutable ). Une fois que l'exécutable est fait , le compilateur n'a plus rien à voir la dedans.

    De base le système limite la mémoire utilisable par le programme , mais tu peux lui en demander plus grace aux allocations dynamique.

    Pour faire ce que tu veux , ( au moins pour windows ) , il faudrai passer dans un mode non protégé.

    L'assembleur , je crois peu permettre plus "facilement" cela , mais je n'en suis pas sur. Et puis en C cela doit être faisable , mais il faudrai trouver de la doc. Pense à chercher quelque chose comme debuguage , lecture mémoire, mode non protégé ...
    Je sais pas trop ...
    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
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Bonjour,

    Est-ce parce que le système d'exploitation limite la mémoire utilisable par le programme?
    oui,

    Pourrait-on réaliser cela en ayant recours à des méthodes non standard?
    aussi.

    Y a-t-il un langage quelconque qui pourrait parvenir au résultat désiré?
    Le C fonctionne bien dans l'absolu. Si tu fonctionnes sur PC, sache que tous les systèmes d'exploitation fonctionnent désormais en mode protégé. Cela consiste d'une part à définir des segments virtuels dotés de la même adresse du point de vue du programme mais qui se retrouvent électroniquement mappés à différents endroits de la mémoire physique, et d'autre part à utiliser une circuiterie spéciale du microprocesseur permettant de déclencher une interruption si le programme essaie de lire ou d'écrire en dehors de la zone impartie. Ainsi, on est en principe sûrs qu'un programme qui devient fou n'ira pas compromettre le reste du système.

    Dès lors, pour accéder à la mémoire physique dans son entier, il faut lancer un processus privilégié, généralement en mode noyau. Le langage dans lequel tu as écrit ton programme importe peu à partir du moment où il te permet d'exprimer une adresse mémoire.

    Certains systèmes d'exploitation proposent toutefois une interface pour y accéder. Sous Linux, par exemple, tu peux lire le début de ta RAM au travers de /dev/mem et le noyau via /proc/kcore.

  4. #4
    Membre confirmé Avatar de Array
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    210
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 210
    Par défaut
    Hum, et... Une autre question.

    Est que la mémoire disponible pour un "child process" peut-être modifiée par le processus père?

    Je m'intéresse ici surtout à windows et linux . . .

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Il n'y a pas de mémoire disponible pour un processus. il y a de mémoire actuellement utilisée par un processus et de mémoire disponible dans le système mais pas de mémoire disponible pour un processus. L'allocation dynamique ça sert à quoi ? Sous Windows tu peux contrôler la mémoire de n'importe quel processus pour peu que tu as les droits nécessaires mais pour quelle raison veux-tu faire cela ? Sous Linux, c'est sûrement aussi possible mais je ne peux pas t'en dire plus.

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Si tu veux modifier des données du process fils depuis le process père, il faut placer ces données en mémoire partagée.

    Note que sur la plupart des systèmes de type unix (linux, solaris, aix...), il est possible de lire et de modifier les données d'un process à partir d'un autre process (en supposant que les deux processes appartiennent au même utilisateur). Par exemple sous linux ça peut se faire via le fichier /proc/<PID>/mem, qui représente l'address space du process <PID>.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par Array Voir le message
    Est que la mémoire disponible pour un "child process" peut-être modifiée par le processus père?

    Je m'intéresse ici surtout à windows et linux . . .
    D'un point de vue système, et si c'est ce que tu cherches à faire, tu peux demander l'allocation d'un segment de mémoire partagée. Celui-ci est alors repéré par un identifiant unique et les processus qui ont besoin d'y lire ou écrire peuvent demander à y être rattachés. Regarde les IPC Sys V sous Linux et shmget(), par exemple.

    D'un pointeur de vue matériel, un processus ne peut pas directement aller modifier l'espace mémoire d'un autre processus sans y avoir été expressément autorisé par le système. C'est le principe du mode protégé.

Discussions similaires

  1. Problème en essayant de lire le contenu d'un .lnk
    Par ybruant dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 22/11/2018, 09h16
  2. lire le contenu d'une adresse mémoire avec VB Script
    Par pierre.zelb dans le forum VBScript
    Réponses: 2
    Dernier message: 13/12/2006, 13h32
  3. [Mail] Lire le contenu d'un mail
    Par hdd dans le forum Langage
    Réponses: 5
    Dernier message: 31/10/2004, 13h30
  4. [Fichier] Lire le contenu d'un fichier
    Par bart64 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 19/09/2004, 18h18
  5. [VB.NET] Impossible de lire le contenu du datagrid
    Par jagdjg dans le forum ASP.NET
    Réponses: 2
    Dernier message: 05/05/2004, 21h51

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