С помощью каналов в Linux вы можете использовать функциональность splice
, чтобы получить перемещение данных из одного процесса в другой без копирования. Например, процесс отправки использует vmsplice()
с SPICE_F_GIFT
для передачи данных в канал, затем принимающий процесс использует splice()
с SPLICE_F_MOVE
для перемещения данных прямо из канала в файл диска, не касаясь его. Обратите внимание, что, естественно, существуют некоторые ограничения на выравнивание и длину.
В зависимости от того, как работает драйвер для вашей карты кодировщика, потенциально вы могли бы организовать все, чтобы получить нулевое копирование на всем пути от драйвера к диску - карты DMA кодировщика в память, а дисковые DMA - обратно, без ЦПУ всегда нужно было на это смотреть (в этом случае вы splice()
передавали бы данные с карты кодера в канал, а затем splice()
возвращали их из канала в файл диска).