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 :

Qu'est-ce que c'est que la mémoire kernel ? (ou virtuelle)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Par défaut Qu'est-ce que c'est que la mémoire kernel ? (ou virtuelle)
    Bonjour,
    ma question concerne une machine sun fire 68000 sous sunOS 5.8; je voudrais savoir comment faire pour convertir une adresse kernel virtuelle qui vaut ADDR en une adresse physique que je note addr.

    Et ensuite, comment faire pour voir, en C, ce que contient cette case mémoire ?

    Selon ce que je sais du contenu de la case mémoire, et éventuellement des suivantes, je compte utiliser un des pointeurs suivants :
    int *pint;
    float *pfloat;
    long *plong;
    long long *pll;

    Mais comment faire pour donner au pointeur que j'utilise la valeur addr précédemment déterminée ?
    Suffit il de faire (par exemple) pfloat=addr;

    Et ensuite pour le déréférencer et voir le contenu de addr, puis je faire ceci :
    printf("addr vaut %d et contient %f.\n", addr, *pfloat);

    Ça fait plein de questions dans un seul post, mais je suis vraiment bloqué à ce niveau de débutant,
    merci de m'aider,
    David

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    ma question concerne une machine sun fire 68000 sous sunOS 5.8; je voudrais savoir comment faire pour convertir une adresse kernel virtuelle qui vaut ADDR en une adresse physique que je note addr.
    Ce n'est absolument pas une question de langage C, mais de programmation système sous ton OS particulier.

    http://www.developpez.net/forums/f55...tres-systemes/

    Et ensuite, comment faire pour voir, en C, ce que contient cette case mémoire ?
    Si il s'agit d'une adresse, elle doit être dans un pointeur. On utilise alors printf() avec "%p" et le cast (void *)

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    int main (void)
    {
       int x;
       int *p = &x;
     
       printf ("p = %p\n", (void *) p);
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    p = 0022FF44
     
    Process returned 0 (0x0)   execution time : 0.033 s
    Press any key to continue.
    Selon ce que je sais du contenu de la case mémoire, et éventuellement des suivantes, je compte utiliser un des pointeurs suivants :
    int *pint;
    float *pfloat;
    long *plong;
    long long *pll;

    Mais comment faire pour donner au pointeur que j'utilise la valeur addr précédemment déterminée ?
    Suffit il de faire (par exemple) pfloat=addr;
    Cette manière d'initialiser un pointeur ne fait pas partie des manières décrites par le langage C. Le comportement est donc indéfini.

    Ce peut être techniquement possible, mais rien ne dit que le résultat sera valide. Je n'ai pas bien compris ce que tu cherches à faire, mais les OS modernes interdisent à un processus d'accéder aux données d'un autre processus.
    Et ensuite pour le déréférencer et voir le contenu de addr, puis je faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      printf("addr vaut %d et contient %f.\n", addr, *pfloat);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      printf("addr vaut %p et contient %f.\n", (void *) pfloat, *pfloat);
    mais sans aucune garantie de fonctionnement, notamment si la valeur de addr appartient à un autre processus...

  3. #3
    Membre éclairé
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Par défaut
    Merci Émmanuel,
    je devine que tu penses à un autre post que j'ai fait, où il est effectivement question de plusieurs processus dont j'aimerais que l'un d'entre eux puisse lire certaines donnés d'un autre, et même si possible les modifier.
    Cependant ici je voudrais juste combler partiellement mes assez profondes lacunes en C, mais ta réponse ne m'éclaire pas sur les choses suivantes :

    "Cette manière d'initialiser un pointeur ne fait pas partie des manières décrites par le langage C. Le comportement est donc indéfini."
    Comment faut-il donc faire pour initialiser un pointeur à une valeur qu'on veut lui imposer ?
    David
    PS: je vais effectivement me tourner vers le forum Solaris pour ma question qui ne concerne pas exactement Solaris.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    je devine que tu penses à un autre post que j'ai fait,<...>
    Je ne sais pas. Je réponds sur plusieurs forums et je ne lis pas les pseudos. je ne lis que la question. De plus je n'ai aucune mémoire, pour ça ...


    Comment faut-il donc faire pour initialiser un pointeur à une valeur qu'on veut lui imposer ?
    Ca dépend de l'implémentation. Lire la doc de ton compilateur.

    Souvent, ceci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    T *p = (T*) 12345;
    Evidemment, il faut que 12345 soit un entier qui représente une adresse valide du processus courant. Si ce n'est pas le cas, le comportement est indéterminé.

    En principe, on a pas à faire ce genre de manip (et tout est fait coté système, pour la rendre caduque...). Je ne comprends toujours pas ce que tu veux faire, et je crois que tu n'as toujours compris qu'on ne pouvait pas accéder aux données d'un autre processus.

  5. #5
    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 : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Citation Envoyé par dva2tlse Voir le message
    Merci Émmanuel,
    je devine que tu penses à un autre post que j'ai fait, où il est effectivement question de plusieurs processus dont j'aimerais que l'un d'entre eux puisse lire certaines donnés d'un autre, et même si possible les modifier.
    Tu cherches à faire quoi exactement ? Si tu veux que des données soient accessibles à deux processus, la bonne solution est de les placer en mémoire partagée.

    Maintenant, si tu veux depuis un processus A accéder à n'importe quelle donnée d'un processus B, c'est une autre histoire, mais en tout cas le coup de passer par une adresse physique n'est clairement pas la bonne solution. Je vois deux solutions :

    1) Utiliser ptrace()

    2) Utiliser /proc. Sous /proc/PID tu as un fichier qui représente l'adress space d'un processus. Si tu as les droits, tu peux lire et même modifier ce fichier. Pour accéder depuis un processus A à une donnée située dans un processus B à l'adress b, il suffit de lire/écrire dans ce fichier à l'offset b.

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    il y a aussi simplement utiliser la partie commune disque (les COMMON en Fortran, Pascal, et autres).

    Il existe physiquement une partie système qui est reservée spécifiquement...

    Le tout est de trouver comment y accéder avec ton OS et/ou ton langage...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Il existe physiquement une partie système qui est reservée spécifiquement...
    C'est pas sûr du tout... Ca dépend complètement du système.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/08/2012, 14h30
  2. Réponses: 6
    Dernier message: 02/01/2009, 13h01
  3. Réponses: 16
    Dernier message: 06/04/2007, 13h36
  4. Qu'est ce que c'est : Le GateA20 ?
    Par le mage tophinus dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 24/02/2003, 15h09
  5. Qu'est-ce que c'est que Nessus, ça fait quoi exactement ?
    Par PeterT dans le forum Développement
    Réponses: 3
    Dernier message: 24/07/2002, 11h23

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