Вопрос

Я уже две недели работаю над 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top