C/Posix Вопросы

Я работаю в течение двух недель на JamVM, небольшой, но мощной виртуальной машине Java.

Теперь я пытаюсь понять, как реализована память, и я застрял на двух глупых проблемах C:

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

-> Параметр -1 обозначает дескриптор файла, что это значит? (Я недавно прочитал Mmap Man, но не нашел его, может быть, я неправильно понял...).

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

-> Что такое 1&? Я не нахожу это в спецификации C...

Спасибо,

Yann

2 ответа

Решение

Вы используете файловый дескриптор, когда у вас есть открытый файл, который вы хотите отобразить в памяти. В этом случае вы создаете анонимную карту (которая не поддерживается файлом), поэтому дескриптор файла не нужен. Некоторые реализации игнорируют fd для анонимных карт некоторые требуют, чтобы это было -1.

Второй вопрос - синтаксическая ошибка (возможно, опечатка). Это, вероятно, должно быть что-то вроде:

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

В таком случае, OBJECT_GRAIN будет степень двойки, и это способ добиться согласованности с этой силой. Например, если бы это было 8, то ~(OBJECT_GRAIN-1) было бы ~7 (~00...001112, который ~11...110002), который, когда AND со значением, может быть использован для принудительной установки значения, кратного 8, меньшего или равного ему.

На самом деле, это определенно ошибка транскрипции где-то (не обязательно вы), потому что, когда я скачиваю JamVM отсюда и смотрю в src/alloc.c, Я получил:

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;

(обратите внимание, что в вашей версии также отсутствует - непосредственно перед HEADER_SIZE что-то еще, что указывает на проблемы транскрипции).

В ответ на ваш первый вопрос. Со страницы руководства.

fd должен быть допустимым файловым дескриптором, если не установлен MAP_ANONYMOUS. Если MAP_ANONYMOUS установлен, то fd игнорируется в Linux. Однако некоторые реализации требуют, чтобы fd было равно -1, если указано MAP_ANONYMOUS (или MAP_ANON), и переносимые приложения должны это обеспечить.

Так что -1, потому что MAP_ANONYMOUS используется.

Другие вопросы по тегам