Pregunta

He estado trabajando durante dos semanas en JamVM, una pequeña pero poderosa Máquina Virtual de Java.

Ahora estoy tratando de entender cómo la memoria se implementa y yo estoy atrapado en dos C estúpido problemas:

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

--> El -1 parámetro representa un descriptor de archivo, ¿qué significa eso?(He aleady leer el mmap hombre, pero no lo he encontrado, tal vez no he entendido...).

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

-- > ¿Qué es 1& ?Yo no lo encuentra en la C la especificación...

Gracias,

Yann

¿Fue útil?

Solución

Utiliza el descriptor de archivo cuando usted tiene un archivo abierto que desea asignar a la memoria.En este caso, usted está creando un anónimo mapa (no respaldado por un archivo) para el descriptor de archivo no es necesario.Algunas implementaciones de ignorar fd para anónimo mapas, algunos requieren para ser -1.

La segunda pregunta es un error de sintaxis (probablemente un error tipográfico).Probablemente debería ser algo como:

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

En ese caso, OBJECT_GRAIN va a ser una potencia de dos y es una manera de conseguir la alineación a ese poder.Por ejemplo, si se tratara de 8, ~(OBJECT_GRAIN-1) sería ~7 (~00...001112, que es ~11...110002) que, cuando ANDed con un valor, podría ser utilizado para forzar a que el valor de la múltiple-de-8 menos que o igual a él.

De hecho, es definitivamente un error de transcripción en algún lugar (no necesariamente) porque, cuando me descargue el JamVM de aquí y mira en src/alloc.c, Me sale:

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;

(tenga en cuenta que su versión es también falta la - inmediatamente antes de HEADER_SIZE, algo más que puntos para la transcripción de los problemas).

Otros consejos

En respuesta a su primera pregunta.Desde la página de manual .

fd debe ser un descriptor de archivo válido, a menos que MAP_ANONYMOUS esté configurado.Si MAP_ANONYMOUS está configurado, fd se ignora en Linux.Sin embargo, algunas implementaciones requieren que fd sea -1 si se especifica MAP_ANONYMOUS (o MAP_ANON), y las aplicaciones portátiles deberían garantizar esto.

Entonces es -1 porque se está utilizando MAP_ANONYMOUS.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top