Каков идеальный и самый быстрый способ связаться между ядром и пространством пользователя?

Одно предложение, которое я могу придумать, это:

for i in `seq 1 5`
do  
   cat "data_${i}_box"
done
8
задан Methos 2 June 2009 в 22:37
поделиться

4 ответа

Самый быстрый способ обмена огромным объемом данных - это отображение памяти. Вызов mmap можно использовать в файле устройства, и соответствующий драйвер ядра может затем решить сопоставить память ядра с адресным пространством пользователя. Хорошим примером этого являются драйверы Video For Linux, и я полагаю, что драйвер буфера кадра работает таким же образом. Для хорошего объяснения того, как работает драйвер V4L2, у вас есть:

Вы не можете превзойти отображение памяти для больших объемов данных, поскольку здесь нет операции memcopy, физическая базовая память эффективно распределяется между ядром и пользовательским пространством. Конечно, как и во всех механизмах с общей памятью, вы должны обеспечить некоторую синхронизацию, чтобы ядро ​​и пользовательское пространство не думали, что они владеют правами одновременно.

7
ответ дан 5 December 2019 в 07:36
поделиться

Очевидно, вы можете использовать разделяемую память с помощью copy_from_user и т.д., вы можете легко настроить драйвер символьного устройства, в основном все, что вам нужно сделать, это создать структуры file_operation, но это далеко не самый быстрый способ. У меня нет тестов, но системные вызовы на современных системах должны быть самыми быстрыми. Я считаю, что это то, для чего оптимизировано больше всего. Раньше было так, что для перехода от пользователя к ядру нужно было создать прерывание, которое затем перешло бы в таблицу прерываний (массив), затем определило местонахождение обработчика прерывания (0x80) и затем перешло в режим ядра. Это было очень медленно, а затем появилась инструкция .sysenter, которая в основном делает этот процесс очень быстрым. Не вдаваясь в подробности, .sysenter сразу считывает регистр CS: EIP, и изменение происходит довольно быстро. Совместно используемая память, напротив, требует записи и чтения из памяти, что бесконечно дороже, чем чтение из регистра.

2
ответ дан 5 December 2019 в 07:36
поделиться

Вы также можете рассмотреть relay (ранее relayfs):

«По сути, relayfs - это просто набор per-cpu буферы ядра, которые могут быть эффективно записаны из кода ядра. Эти буферы представлены в виде файлов, которые могут быть отображены в формате mmap и напрямую считаны из пользовательского пространства. Цель такой настройки - предоставить простейший возможный механизм, позволяющий обрабатывать потенциально большие объемы данных. для регистрации в ядре и "ретрансляции" в пользовательское пространство "

http: //relayfs.sourceforge. net /

5
ответ дан 5 December 2019 в 07:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: