Pergunta
Estou trabalhando há duas semanas no JamVM, uma pequena mas poderosa Java Virtual Machine.
Agora estou tentando descobrir como a memória é implementada e estou preso em dois problemas estúpidos de C:
char *mem = (char*)mmap(0, args->max_heap, PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON, -1, 0);
-> O parâmetro -1 significa um descritor de arquivo, o que isso significa?(Já li o mmap man, mas não encontrei, talvez tenha entendido mal...).
heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1&)~(OBJECT_GRAIN-1)) HEADER_SIZE;
-> O que é 1&?Não encontro isso na especificação C ...
Obrigado,
Yann
Solução
Você usa o descritor de arquivo quando tem um arquivo aberto que deseja mapear na memória.Nesse caso, você está criando um mapa anônimo (que não é apoiado por um arquivo), portanto o descritor de arquivo não é necessário.Algumas implementações ignoram fd
para mapas anônimos, alguns exigir seja -1.
A segunda pergunta é um erro de sintaxe (provavelmente um erro de digitação).Provavelmente deveria ser algo como:
heapbase = (char*)(((uintptr_t)mem+HEADER_SIZE+OBJECT_GRAIN-1)
&~(OBJECT_GRAIN-1)) - HEADER_SIZE;
Nesse caso, OBJECT_GRAIN
será uma potência de dois e é uma forma de alinhar-se com essa potência.Por exemplo, se fosse 8, então ~(OBJECT_GRAIN-1)
seria ~7
(~00...001112
, qual é ~11...110002
) que, quando AND com um valor, pode ser usado para forçar esse valor para um múltiplo de 8 menor ou igual a ele.
Na verdade, é definitivamente um erro de transcrição em algum lugar (não necessariamente em você) porque, quando eu baixo o JamVM de aqui e olhe para dentro src/alloc.c
, Eu recebo:
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;
(observe que sua versão também está faltando o -
imediatamente antes HEADER_SIZE
, outra coisa que aponta para problemas de transcrição).
Outras dicas
Em resposta à sua primeira pergunta.Do paper .
.fd deve ser um descritor de arquivo válido, a menos que o Map_anonymous esteja definido.Se map_anonymous estiver definido, o FD é ignorado no Linux.No entanto, algumas implementações requerem FD para ser -1 se map_anonymous (ou map_anon) for especificado e os aplicativos portáteis devem garantir isso.
Então é -1 porque a
MAP_ANONYMOUS
está sendo usada.