Распределение виртуальной памяти без выделения физической памяти - PullRequest
2 голосов
/ 30 июня 2011

Я работаю над проектом ядра Linux, и мне нужно найти способ выделить виртуальную память без выделения физической памяти.Например, если я использую это:

char* buffer = my_virtual_mem_malloc(sizeof(char) * 512);

my_virtual_mem_malloc - это новый SYSCALL, реализованный моим модулем ядра.Все данные, записанные в этом буфере, хранятся в файле или на другом сервере с использованием сокета (не в физической памяти).Поэтому для выполнения этой работы мне нужно запросить виртуальную память и получить доступ к структуре vm_area_struct, чтобы переопределить структуру vm_ops.

У вас есть идеи по этому поводу?

thx

Ответы [ 2 ]

3 голосов
/ 01 июля 2011

Это архитектурно невозможно. Вы можете создать области vm с подпрограммой обратной записи, которая копирует данные куда-то, но на каком-то уровне вы должны выделить физические страницы для записи.

Если вы согласны с этим, вы можете просто написать FUSE драйвер , смонтировать его куда-нибудь и отобразить файл из него. Если это не так, то вам придется просто write(), потому что перенаправление записей без выделения физической страницы вообще не поддерживается x86, по крайней мере.

0 голосов
/ 10 мая 2017

Существует несколько подходов к этой проблеме, но большинство из них требует сначала выполнить запись в промежуточную память.

Сетевая файловая система (NFS)

Самый простой подход - это простопусть сервер откроет какую-то общую файловую систему, такую ​​как NFS и использует mmap() для сопоставления удаленного файла с адресом памяти.Затем запись по этому адресу фактически запишет кэш страницы операционной системы, который в конечном итоге будет записан в удаленный файл, когда кэш страницы заполнен или после предопределенного времени ожидания системы.

Распределенная общая память (DSM)

Альтернативный подход - использование DSM с очень маленьким размером кэша.

В информатике распределенная разделяемая память (DSM) - это форма архитектуры памяти, в которой физически разделеныПамять может быть адресована как одно логически совместно используемое адресное пространство.

[...] Программные системы DSM могут быть реализованы в операционной системе или в виде библиотеки программ и могут рассматриваться как расширения базовой виртуальной памяти.архитектура.При реализации в операционной системе такие системы прозрачны для разработчика;это означает, что основная распределенная память полностью скрыта от пользователей.

Это означает, что каждый виртуальный адрес логически сопоставляется с виртуальным адресом на удаленной машине и записывается на негосделает следующее: (а) получит страницу с удаленного компьютера и получит эксклюзивный доступ.(б) обновить данные страницы.(c) отпустите страницу и отправьте ее обратно на удаленный компьютер при повторном ее чтении.

В типичной реализации DSM (c) произойдет, только когда удаленный компьютер снова прочитает данные, но вы можетеначните с существующей реализации DSM и измените поведение так, чтобы данные отправлялись после заполнения кэша страниц локального компьютера.

MMU ввода-вывода

[...] IOMMUотображает видимые устройством виртуальные адреса (также называемые в данном контексте адресами устройств или адресами ввода-вывода) в физические адреса.

Это в основном означает запись непосредственно в буфер сетевого устройства, который фактически реализуетальтернативный драйвер для этого устройства.Такой подход кажется наиболее сложным, и я не вижу никакой выгоды от этого подхода.

Этот подход на самом деле не использует промежуточную память, но определенно не рекомендуется, если система не требует больших требований в реальном времени.

...