Одно предложение, которое я могу придумать, это:
for i in `seq 1 5`
do
cat "data_${i}_box"
done
Самый быстрый способ обмена огромным объемом данных - это отображение памяти. Вызов mmap можно использовать в файле устройства, и соответствующий драйвер ядра может затем решить сопоставить память ядра с адресным пространством пользователя. Хорошим примером этого являются драйверы Video For Linux, и я полагаю, что драйвер буфера кадра работает таким же образом. Для хорошего объяснения того, как работает драйвер V4L2, у вас есть:
Вы не можете превзойти отображение памяти для больших объемов данных, поскольку здесь нет операции memcopy, физическая базовая память эффективно распределяется между ядром и пользовательским пространством. Конечно, как и во всех механизмах с общей памятью, вы должны обеспечить некоторую синхронизацию, чтобы ядро и пользовательское пространство не думали, что они владеют правами одновременно.
Совместное использование памяти между ядром и пространством использования возможно.
Вы также можете использовать именованный канал , который работает довольно быстро.
Все это действительно зависит от того, какие данные вы разделяются, осуществляется ли к нему одновременный доступ и какова структура данных. Вызовов может быть достаточно для простых данных.
Linux kernel / proc FIFO / pipe
Может также помочь
удачи
Очевидно, вы можете использовать разделяемую память с помощью copy_from_user и т.д., вы можете легко настроить драйвер символьного устройства, в основном все, что вам нужно сделать, это создать структуры file_operation, но это далеко не самый быстрый способ. У меня нет тестов, но системные вызовы на современных системах должны быть самыми быстрыми. Я считаю, что это то, для чего оптимизировано больше всего. Раньше было так, что для перехода от пользователя к ядру нужно было создать прерывание, которое затем перешло бы в таблицу прерываний (массив), затем определило местонахождение обработчика прерывания (0x80) и затем перешло в режим ядра. Это было очень медленно, а затем появилась инструкция .sysenter, которая в основном делает этот процесс очень быстрым. Не вдаваясь в подробности, .sysenter сразу считывает регистр CS: EIP, и изменение происходит довольно быстро. Совместно используемая память, напротив, требует записи и чтения из памяти, что бесконечно дороже, чем чтение из регистра.
Вы также можете рассмотреть relay (ранее relayfs):
«По сути, relayfs - это просто набор per-cpu буферы ядра, которые могут быть эффективно записаны из кода ядра. Эти буферы представлены в виде файлов, которые могут быть отображены в формате mmap и напрямую считаны из пользовательского пространства. Цель такой настройки - предоставить простейший возможный механизм, позволяющий обрабатывать потенциально большие объемы данных. для регистрации в ядре и "ретрансляции" в пользовательское пространство "