Linux Zero-Copy: передача страниц памяти между двумя процессами с помощью vmsplice

В настоящее время я пытаюсь понять значение splice/vmsplice. Что касается варианта использования IPC, я наткнулся на следующий ответ на stackoverflow: https://stackoverflow.com/a/1350550/1305501

Вопрос: Как перенести страницы памяти из одного процесса в другой обрабатывать с использованием vmsplice без копирования данных (т.е. с нулевым копированием)?

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

// data is aligned to page boundaries,
// and length is a multiple of the page size
void transfer_to_pipe(int pipe_out, char* data, size_t length)
{
    size_t offset = 0;
    while (offset < length) {
        struct iovec iov { data + offset, length - offset };
        offset += vmsplice(pipe_out, &iov, 1, SPLICE_F_GIFT);
    }
}

Но как можно получить доступ к страницам памяти из пользовательского пространства без копирования? По-видимому, следующие методы не работают:

  • vmsplice: Эту функцию также можно использовать для обратного направления. Но судя по комментариям в исходниках ядра, данные будут скопированы.
  • read: Я могу представить, что эта функция творит чудеса, если память правильно выровнена, но я в этом сомневаюсь.
  • mmap: Невозможно на канале. Но есть ли какой-то виртуальный файл, который можно использовать вместо этого, т.е.склейкастраниц памяти в виртуальный файл и mmapего?
  • ... ?

Разве это вообще невозможно с vmsplice?

20
задан Community 23 May 2017 в 12:13
поделиться