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
используется.