Отсутствует системный вызов копирования при записи

Несмотря на продолжено Interest, по-прежнему нет возможности создать« коровью копию » области памяти в Linux. С появлением системного вызова memfd_create(2) ситуация несколько улучшилась, поскольку больше не нужно создавать явный файл для разделяемой памяти.

Мне интересно, почему нет такой вещи, как следующее?

void *ptr = mmap((void *)0, size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, (size_t)0);
void *ptr2= mremap(ptr, 0, size, MREMAP_MAYMOVE | MREMAP_COW);

Предполагаемая семантика состоит в том, что ptr2 и ptr совместно используют базовую память, но запись из любого из них вызовет копирование при записи с детализацией по страницам.

Это просто случай, когда «никто еще не позаботился об этом реализовать» или я упускаю что-то техническое?


person Fabian Klötzl    schedule 28.02.2017    source источник
comment
С memfd_create() вы можете в точности достичь того, чего хотите, это очень чистый интерфейс с интуитивно понятной семантикой, на мой взгляд. Что у вас с этим не получается?   -  person Ctx    schedule 28.02.2017
comment
@Ctx В этом сообщении описывается, чего я достиг с memfd_create до сих пор. Но он имеет странную семантику и не позволяет сделать копию копии без создания еще одного файла.   -  person Fabian Klötzl    schedule 28.02.2017
comment
Фабиан, ссылаясь на свою статью в блоге, вы можете просто сделать оба сопоставления частными (а не первое общее) и заполнить память read()/write()-вызовами. Или вы можете создать общее сопоставление для заполнения памяти, отменить сопоставление и сделать два частных сопоставления.   -  person Ctx    schedule 28.02.2017
comment
Это было бы ужасным взломом, но ... как насчет mmap() собственного адресного пространства процесса? int fd = open( "/proc/self/as", O_RDWR ); void *ptr = mmap( 0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, offset ); Я подозреваю, что offset - это адрес области памяти, для которой вы хотите создать копию COW.   -  person Andrew Henle    schedule 28.02.2017
comment
@Ctx Я не думаю, что ваш первый вариант имеет большое преимущество перед memcpy, которого я стараюсь избегать. Второй метод снова имеет проблему, заключающуюся в том, что нельзя просто создать копию копии, не записывая все в другой файл (даже если этот файл может быть создан memfd).   -  person Fabian Klötzl    schedule 28.02.2017
comment
@AndrewHenle Да, это был бы неприятный прием. Должен быть способ попроще. В конце концов, Linux поддерживает эту функцию на fork, но просто нет возможности явно вызвать ее‽   -  person Fabian Klötzl    schedule 28.02.2017
comment
@ FabianKlötzl Итак, ваша основная проблема - сделать COW-копию данных памяти, не помещая ее в файл (будь то виртуальный или дисковый), правильно? Это действительно непросто, интересно, что это за приложение ...   -  person Ctx    schedule 28.02.2017
comment
@Ctx Я думаю, это было бы полезно для любых структур данных COW. В моем случае строки (геномы) длиной MB.   -  person Fabian Klötzl    schedule 28.02.2017
comment
Фабиан, в большинстве случаев я не понимаю, как ядро ​​может сделать это более эффективно, чем само приложение. В вашем случае я бы предложил обрабатывать COW вручную в пользовательском пространстве с соответствующими структурами и функциями доступа, я уверен, что это более эффективно и может быть лучше адаптировано к потребностям конкретных приложений.   -  person Ctx    schedule 28.02.2017