Перемещение данных из буфера ядра Linux на жесткий диск без копирования - PullRequest
3 голосов
/ 20 сентября 2010

пытаюсь переместить данные из буфера в пространстве ядра в жесткий диск без необходимости каких-либо дополнительных копий из буфера ядра в пользовательские буферы или любые другие буферы ядра. Любые идеи / предложения будут самый полезный.

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

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

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

Кстати - я пытался использовать O_DIRECT при открытии необработанного раздела, но последующий вызов записи завершается неудачно, если передаваемый буфер является mmapped buffer.

Thanx!

1 Ответ

2 голосов
/ 21 сентября 2010

Вам нужно представить свой демультибуцирующий буфер как дескриптор файла (предположительно, если вы используете mmap(), то вы уже делаете это - отлично!).

На стороне ядра вам необходимо реализовать splice_read член struct file_operations.

На стороне пользователя создайте pipe(), затем дважды используйте splice() - один раз, чтобы переместить данные из дескриптора файла demux в канал, и второй раз, чтобы переместить данные из канала в файл диска. , Используйте флаг SPLICE_F_MOVE.

Как указано в справочной странице splice(), он будет избегать реальных копий, где это возможно, путем копирования ссылок на страницы памяти ядра, а не на сами страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...