Question

Je travaille depuis deux semaines sur Jamvm, une petite mais puissante machine virtuelle Java.

Maintenant, j'essaie de comprendre comment la mémoire est implémentée et je suis coincé sur deux problèmes stupides:

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

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

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

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

Merci,

Yann

Était-ce utile?

La solution

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 (une non soutenue par un fichier) afin que le descripteur de fichier ne soit pas nécessaire. Certaines implémentations ignorent fd Pour les cartes anonymes, certains exiger il s'agit de -1.

La deuxième question est une erreur de syntaxe (probablement une faute de frappe). Ce 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 sera un pouvoir de deux et c'est un moyen de s'aligner sur ce pouvoir. Par exemple, si c'était 8, alors ~(OBJECT_GRAIN-1) serait ~7 (~00...001112, lequel est ~11...110002) qui, lorsqu'ils sont avec une valeur, pourraient être utilisés pour forcer cette valeur au multiple de 8 inférieur ou égal à celui-ci.

En fait, c'est définitivement une erreur de transcription quelque part (pas nécessairement vous) parce que, lorsque je télécharge le JAMVM à partir de ici Et regardez 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 manque également - immédiatement avant HEADER_SIZE, quelque chose d'autre qui pointe vers des problèmes de transcription).

Autres conseils

En réponse à votre première question. Du page.

FD doit être un descripteur de fichiers valide, à moins que MAP_anonymous ne soit défini. Si Map_anonymous est défini, FD est ignoré sur Linux. Cependant, certaines implémentations nécessitent que FD soit -1 si MAP_Anonymous (ou MAP_ANON) est spécifié, et les applications portables devraient l'assurer.

C'est donc -1 parce que MAP_ANONYMOUS est en train d'être utilisé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top