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

Linux Discussion :

VirtualAlloc sous linux


Sujet :

Linux

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 13
    Points
    13
    Par défaut VirtualAlloc sous linux
    Bonjour,
    Je débute la programmation sous linux et je voudrai savoir quel est l'équivalent sous linux de la fonction VirtualAlloc de Windows.

    Merci d'avance pour votre aide.

  2. #2
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par brutor
    Bonjour,
    Je débute la programmation sous linux et je voudrai savoir quel est l'équivalent sous linux de la fonction VirtualAlloc de Windows.

    Merci d'avance pour votre aide.

    A ma connaissance, c'est la fonction mmap()
    http://pwet.fr/man/linux/appels_systemes/mmap

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    En faite je dois porter un programme windows sous linux et le programmeur utilise la fonction VirtualAlloc pour allouer de la mémoire virtuel.
    J'ai regarder le lien que tu m'as donné, d'après ce que je comprend mmap permet de faire la projection de fichiers en mémoire et je ne sais pas vraiment ce que cela signifie, mais je pense que ce n'est pas ce que je veux faire.
    Pouvez vous éclairer ma lanterne?

  4. #4
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par brutor
    En faite je dois porter un programme windows sous linux et le programmeur utilise la fonction VirtualAlloc pour allouer de la mémoire virtuel.
    J'ai regarder le lien que tu m'as donné, d'après ce que je comprend mmap permet de faire la projection de fichiers en mémoire et je ne sais pas vraiment ce que cela signifie, mais je pense que ce n'est pas ce que je veux faire.
    Pouvez vous éclairer ma lanterne?


    Plus précisement, il est écrit « un fichier (ou un autre objet) »


    http://actes.sstic.org/SSTIC05/Vulne...es_memoire.pdf

    Extrait de la page 4 du fichier PDF :

    .../....
    L’application pourra également faire elle-même appel à mmap() – ou à VirtualAlloc() sur les systèmes Windows – pour allouer de la mémoire ou mapper le contenu d’un fichier en mémoire.
    .../...

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Merci donc pour allouer de la mémoire virtuelle avec mmap je n'ai pas compris tous les argument.
    Par exemple sous windows:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* mot;
    mot = VirtualAlloc(NULL, 15 , MEM_COMMIT, PAGE_READWRITE);
    sous linux :
    void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
    Je ne vois pas quoi mettre comme argument pour le descripteur fd , et pour l'argument offset.
    Merci de m'aider.

  6. #6
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par brutor
    Merci donc pour allouer de la mémoire virtuelle avec mmap je n'ai pas compris tous les argument.
    Par exemple sous windows:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char* mot;
    mot = VirtualAlloc(NULL, 15 , MEM_COMMIT, PAGE_READWRITE);
    sous linux :
    void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);
    Je ne vois pas quoi mettre comme argument pour le descripteur fd , et pour l'argument offset.
    Merci de m'aider.

    Exemple de code (mmap-share.tgz) que tu pourras consulter sur le site : http://david.decotigny.free.fr/snippets/


    README
    - simple.c : partage de memoire entre 1 parent et ses fils (ie mmap
    de /dev/zero avant fork)
    - multi.c : mmap de la meme partie du meme /dev/zero = 2 zones de
    donnees differentes
    - reader.c/writer.c : partage de memoire entre 2 processus
    independants (ie mmap d'un meme fichier)


    simple.c
    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
     
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <sys/mman.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <unistd.h>
     
    int main () {
      void* zone_partagee;
      int fd;
     
      fd = open ("/dev/zero", O_RDWR);
      if (fd < 0) {
        perror("open");
        return -1;
      }
     
      zone_partagee = mmap((void*)0,
                           4096,
                           PROT_READ|PROT_WRITE,
                           MAP_SHARED,
                           fd, 0);
      if (zone_partagee == NULL) {
        perror("mmap");
        return -1;
      }
     
      close(fd);

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    Mais pourquoi dois - je ouvrir un fichier? je veux juste allouer de la mémoire virtuelle.

  8. #8
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par brutor
    Mais pourquoi dois - je ouvrir un fichier? je veux juste allouer de la mémoire virtuelle.

    Extrait de la page web : http://man.developpez.com/man2/mmap.2.php

    (...)
    MAP_ANONYMOUS
    La projection n'est supportée par aucun fichier. Les arguments fd et offset sont ignorés. Cet attributs, utilisé en conjonction de MAP_SHARE est implémenté depuis Linux 2.4.
    (...)


    Sinon tu peux voir ci-après :
    http://man.developpez.com/man2/shmget.2.php
    http://rperrot.developpez.com/articles/c/allocationC/

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 13
    Points : 13
    Points
    13
    Par défaut
    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
     
    #include <stdlib.h>
    #include <sys/mman.h>
     
    typedef struct
    {
    	char name[20];
    	int age;
    } personne;
     
    int main (void)
    {
    	personne* pers = NULL;
    	pers  = (personne*) mmap(NULL, sizeof(personne),  PROT_WRITE | PROT_READ , MAP_ANONYMOUS | MAP_SHARED , 0, 0);
    	pers->age = 15;
    	printf("%d",pers->age);
    	return 0;
    }
    n'affiche pas 15 mais le dernier caractère de :
    23:56:50 [bruno@PCBruno:~/Programmation/ts2mpg/test_mmap]$
    mais lorsque je fais ./main > toto && gtkedit toto sa m'affiche 15.
    Pourquoi?
    Problème de codage de caractère?

  10. #10
    Membre éclairé Avatar de BlaireauOne
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    492
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2007
    Messages : 492
    Points : 652
    Points
    652
    Par défaut
    Citation Envoyé par brutor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (...)
    	personne* pers = NULL;
    	pers  = (personne*) mmap(NULL, sizeof(personne),  PROT_WRITE | PROT_READ , MAP_ANONYMOUS | MAP_SHARED , 0, 0);
    	pers->age = 15;
    	printf("%d",pers->age);
    	return 0;
    }
    n'affiche pas 15 mais le dernier caractère de :
    23:56:50 [bruno@PCBruno:~/Programmation/ts2mpg/test_mmap]$
    mais lorsque je fais ./main > toto && gtkedit toto sa m'affiche 15.
    Pourquoi?
    Problème de codage de caractère?


    Petite précision. Si la mémoire que tu alloues est uniquement destinée à ton programme, tu n'as pas besoin de mmap() mais de malloc().
    A ma connaissance, mmap() n'est intéressant que pour des accès par d'autres process .

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/mman.h>
     
    typedef struct
    {
    	char name[20];
    	int age;
    } personne;
     
    int main (void)
    {
    	personne *pers;
    	pers=malloc(sizeof(personne));
    	if ( pers == NULL )
    	{
    	     fprintf(stderr,"Allocation Impossible");
    	     exit(EXIT_FAILURE);
    	}
    	pers->age = 15;
    	strcpy(pers->name,"toto");
    	printf("%s : %d",pers->name,pers->age);
    	return 0;
    }
    Résultat :
    $ malloc_struc.exe
    toto : 15

Discussions similaires

  1. [Série] Accès au port série sous linux
    Par ghost dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 10/10/2007, 10h43
  2. Comment désinstaller MySQL sous linux
    Par nahmsath dans le forum Installation
    Réponses: 5
    Dernier message: 18/09/2007, 10h46
  3. installer jbuilder7 sous linux
    Par rtlinfo34 dans le forum JBuilder
    Réponses: 5
    Dernier message: 30/10/2002, 19h16
  4. Réponses: 2
    Dernier message: 25/10/2002, 22h19
  5. Je ne peux établir une connexion cliente sous Linux.
    Par Anonymous dans le forum CORBA
    Réponses: 5
    Dernier message: 16/04/2002, 15h57

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