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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top