Вы используете файловый дескриптор, когда у вас есть открытый файл, который вы хотите отобразить в памяти. В этом случае вы создаете анонимную карту (которая не поддерживается файлом), поэтому файловый дескриптор не нужен. Некоторые реализации игнорируют 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...00111<sub>2</sub>
, то есть ~11...11000<sub>2</sub>
), которое, когда 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
, что указывает на проблемы с транскрипцией).