2011-06-17 2 views
3

Je travaille depuis deux semaines sur JamVM, une machine virtuelle Java petite mais puissante.C/Posix Questions

Maintenant, je suis en train de comprendre comment la mémoire est mise en œuvre et je suis coincé sur deux C problèmes stupides:

char *mem = (char*)mmap(0, args->max_heap, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON, -1, 0);

-> Le -1 paramètre signifie un descripteur de fichier, qu'est-ce que signifier? (J'ai déjà lu l'homme mmap, mais je ne l'ai pas trouvé, peut-être ai-je mal compris ...).

heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1&)~(OBJECT_GRAIN-1)) HEADER_SIZE;

-> Qu'est-ce que 1 &? Je ne trouve pas dans la spécification C ...

Merci,

Yann

+0

S'il s'agissait de deux questions distinctes, vous pourriez donner à chacune un titre utile. –

+0

'-1 &) ~ (' n'est même pas légal C (un compilateur devrait se plaindre d'un jeton manquant), êtes-vous sûr que ce n'est pas -1) & ~ ('?, ce qui signifie ET NON, (habituellement utilisé pour transformer un bit off) – Wiz

+0

@Wiz: Dans ce cas, OBJECT_GRAIN est probablement une puissance de 2, donc si le code était '-1) et ~' il arrondissent 'mem + HEADER_SIZE' au multiple suivant de' OBJECT_GRAIN'. –

Répondre

2

Vous utilisez le descripteur de fichier lorsque vous avez un fichier ouvert que vous souhaitez mapper en mémoire. Dans ce cas, vous créez une carte anonyme (celle qui n'est pas sauvegardée par un fichier), de sorte que le descripteur de fichier n'est pas nécessaire. Certaines implémentations ignorent fd pour les cartes anonymes, certains nécessitent pour être -1.

La deuxième question est une erreur de syntaxe (probablement une faute de frappe). Il devrait probablement être quelque chose comme:

heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1) 
    &~(OBJECT_GRAIN-1)) - HEADER_SIZE; 

Dans ce cas, OBJECT_GRAIN aura une puissance de deux et il est un moyen d'obtenir un alignement à ce pouvoir. Par exemple, si elle était 8, puis ~(OBJECT_GRAIN-1) serait ~7 (~00...001112, qui est ~11...110002) qui, lorsqu'il est combiné par une valeur, peut être utilisé pour forcer cette valeur à la multiple-of-8 inférieure ou égale à elle.

En fait, il est certainement une erreur de transcription quelque part (pas nécessairement vous) parce que, quand je télécharger le jamvm de here et regarde dans src/alloc.c, je reçois:

void initialiseAlloc(InitArgs *args) { 
    char *mem = (char*)mmap(0, args->max_heap, PROT_READ|PROT_WRITE, 
               MAP_PRIVATE|MAP_ANON, -1, 0); 
    : 
    << a couple of irrelevant lines >> 
    :  
    /* Align heapbase so that start of heap + HEADER_SIZE is object aligned */ 
    heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1)& 
       ~(OBJECT_GRAIN-1))-HEADER_SIZE; 

(notez que votre version est également manquante le - immédiatement avant HEADER_SIZE, quelque chose d'autre qui pointe vers des problèmes de transcription).

+0

Merci, c'est ça! Mais c'est étrange parce que j'ai la dernière version et ça marche bien ... – scoobyclown

+0

Après avoir téléchargé une copie propre de JamVM et appliqué un diff, la seule différence semble être la ligne avec hachabase ... J'ai peut-être fait de mauvaises éditions en lisant ... Merci pour votre réponse et désolé! – scoobyclown

+0

@scooby, pas besoin de vous excuser, aider les gens est pourquoi nous sommes ici. À votre santé. – paxdiablo

4

En réponse à votre première question. Depuis le man page.

fd doit être un descripteur de fichier valide, sauf si MAP_ANONYMOUS est défini. Si MAP_ANONYMOUS est défini, alors fd est ignoré sous Linux. Cependant, certaines implémentations nécessitent que fd soit -1 si MAP_ANONYMOUS (ou MAP_ANON) est spécifié, et les applications portables doivent le faire.

Donc c'est -1 parce que MAP_ANONYMOUS est utilisé.

+1

Merci! C'est pourquoi j'ai dit que c'était une question stupide en premier lieu, je n'avais pas lu le bon manuel en premier lieu (j'ai lu le 3p) – scoobyclown