Есть малоизвестный системный вызов
vmsplice().Он позволяет отобразить пользовательские страницы памяти прямо в pipe:
struct iovec iov = {
.iov_base = buf,
.iov_len = len
};
vmsplice(pipefd[1], &iov, 1, SPLICE_F_GIFT);
Самая интересная часть —
SPLICE_F_GIFT.Этим флагом userspace фактически говорит ядру: эти страницы памяти можно считать переданными тебе.
Это используется в zero-copy/low-copy сценариях, где хочется минимизировать лишние копирования между userspace и kernel space.
Но есть нюанс: после такой передачи нельзя относиться к этим страницам как к обычной памяти и спокойно менять их содержимое.
Очень низкоуровневая штука, но отличный пример того, насколько далеко Linux позволяет зайти в оптимизации I/O.
