Ядро Linux: ioremap и copy_from_user ужасно медленные - PullRequest
0 голосов
/ 29 января 2019

Запись драйвера, который получает физический адрес памяти и размер буфера из BIOS.Размер этой области составляет, например, 32 МБ.

Задача драйверов теперь заполнить этот буфер данными, которые поступают из буфера пользовательского пространства.

Итак, текущий подход:

virt_addr=ioremap(physical_addr, buffersize);
copy_from_user(virt_addr, userspace_addr, buffersize);

Этот подход работает, но он очень медленный.Есть другой подход, в котором я использую память, выделенную с помощью kmalloc, и если я делаю

copy_from_user(kmalloc_allocated_buffer, userspace_addr, buffersize);

, кажется, что копирование буфера, по крайней мере, в 10 раз быстрее, чем подход с ioremap.Итак, я предполагаю, что я делаю это неправильно, но как я могу сделать это правильно?

Даже попытался ioremeap_wt, чтобы иметь кешированную область записи, но это совсем не ускоряет копирование.

...