Используйте MSG_ZEROCOPY в сочетании с mmap и пользовательским модулем ядра.Linux

Ответить
Anonymous
 Используйте MSG_ZEROCOPY в сочетании с mmap и пользовательским модулем ядра.

Сообщение Anonymous »

У меня есть встроенное устройство Linux с 2 ГБ оперативной памяти. В моем дереве устройств и аргументах загрузки ядра я настроил систему на использование только нижнего 1 ГБ ОЗУ.
Поскольку устройство представляет собой SoC IntelFPGA, верхняя область ОЗУ записывается из структуру FPGA.
С помощью специального драйвера устройства Linux я сопоставляю верхнюю область пользовательскому пространству с помощью функции remap_pfn_range. (Моя полная функция драйвера mmap показана ниже).
Это работает так, как ожидалось. Но теперь я пытаюсь использовать инфраструктуру нулевого копирования для отправки данных по TCP на другой компьютер. В текущей реализации я использую функцию записи без нулевого копирования и высокой загрузки ЦП.
Когда я пытался использовать функцию отправки с флаг MSG_ZEROCOPY, приложение пользовательского пространства больше не работает, и send возвращает код ошибки 14, Неверный адрес.
Теперь Я пытаюсь обновить ядро ​​Linux, но не уверен, какой тип функции ядра, которую мне нужно использовать? Я использую ядро ​​6.6.
static int my_mmap(struct file* filp, struct vm_area_struct* vma)
{
struct mem_dev *hm = (struct mem_dev *)filp->private_data;

unsigned long off = vma->vm_pgoff offset + off) >> PAGE_SHIFT;
unsigned long vsize = vma->vm_end - vma->vm_start;
unsigned long psize = hm->size - off;

printk("my_mmap called.\n");

if (vsize > psize) {
printk("my_mmap out of region...\n");
return -EINVAL;
}

printk("my_mmap remap_pfn_range, virt 0x%lx, phys 0x%lx\n",
vma->vm_start, pfn);
if (remap_pfn_range(vma,
vma->vm_start,
pfn,
vsize,
vma->vm_page_prot)) {
printk("my_mmap remap_pfn_range failed.\n");
return -EAGAIN;
}

vma->vm_ops = &simple_remap_vm_ops;
simple_vma_open(vma);
return 0;
}


Подробнее здесь: https://stackoverflow.com/questions/792 ... nel-module
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»