Вопрос
Я уже две недели работаю над 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& ?Я не нахожу этого в спецификации языка Си...
Спасибо,
Янн
Решение
Вы используете файловый дескриптор, когда у вас есть открытый файл, который вы хотите отобразить в памяти.В этом случае вы создаете анонимную карту (не подкрепленную файлом), поэтому файловый дескриптор не нужен.Некоторые реализации игнорируют 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
), который, будучи дополнен значением, может быть использован для приведения этого значения к значению, кратному 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, то в Linux fd игнорируется.Однако некоторые реализации требуют, чтобы fd был равен -1, если указан MAP_ANONYMOUS (или MAP_ANON), и переносимые приложения должны гарантировать это.
Значит, это -1, потому что используется MAP_ANONYMOUS
.