Domanda

Ho lavorato per due settimane su JAMVM, una piccola ma potente macchina virtuale Java.

Ora sto cercando di capire come è implementato la memoria e sono bloccato su due problemi stupidi C:

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

-> Il parametro -1 si attesta per un descrittore di file, cosa significa?(Ho letto subito l'uomo dell'Mmap, ma non l'ho trovato, forse ho frainteso ...).

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

-> Cos'è 1 e?Non lo trovo nella specifica C ...

Grazie,

yann

È stato utile?

Soluzione

Si utilizza il descrittore di file quando si dispone di un file aperto che si desidera mappare in memoria. In questo caso, stai creando una mappa anonima (uno non supportato da un file) in modo che il descrittore del file non sia necessario. Alcune implementazioni ignorano fd per mappe anonime, alcuni richiedono a -1.

La seconda domanda è un errore di sintassi (probabilmente un errore di battitura). Probabilmente dovrebbe essere qualcosa come:

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

In tal caso, OBJECT_GRAIN sarà una potenza di due ed è un modo per ottenere l'allineamento a quel potere. Ad esempio, se fossero 8, allora ~(OBJECT_GRAIN-1) sarebbe ~7 (~00...001112, che è ~11...110002) che, quando eDED con un valore, potrebbe essere usato per forzare tale valore al multiplo di 8 meno o uguale ad esso.

.

In effetti, è sicuramente un errore di trascrizione da qualche parte (non necessariamente tu) perché, quando scarico il jamvm da qui e guarda in src/alloc.c, ottengo:

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;
.

(Si noti che la versione manca anche il - immediatamente prima di HEADER_SIZE, qualcos'altro che punta ai problemi di trascrizione).

Altri suggerimenti

In risposta alla tua prima domanda.Dal Man Pagina .

.

FD dovrebbe essere un descrittore di file valido, a meno che Map_anonymous sia impostato.Se Map_anonymous è impostato, quindi FD viene ignorato su Linux.Tuttavia, alcune implementazioni richiedono fd a essere -1 se è specificata map_anonymous (o map_anon), e le applicazioni portatili dovrebbero garantire questo.

Quindi è -1 perché viene utilizzato MAP_ANONYMOUS.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top