Я пишу драйвер, который требует большой памяти. Допустим, это будет как минимум 1 ГБ. Версия ядра> = 3.10. Драйвер должен работать в X86_64 и на платформе Arm. Аппаратное обеспечение может иметь IOMMU.
- Эта большая память будет отображаться в пространстве пользователя.
- Устройство использует эту память для выполнения DMA. Каждая операция DMA просто записывает максимальный размер данных в 2 КБ в эту память.
Мои вопросы.
vmallo c может дать мне большие нефизические страницы континуума. Могу ли я использовать vmallo c, чтобы получить большую память для DMA? Я думаю, используйте vmalloc_to_page
, чтобы получить указатель страницы, затем используйте page_to_phys
, чтобы получить физический адрес.
Я нашел информацию о производительности "vmallo c ниже, чем kmallo c «. Я не уверен, что это значит. если я сделаю vaddr = vmalloc(2MB)
и kaddr = kmalloc(2MB)
, вызов функции vmallo c будет медленнее, чем kmallo c из-за переназначения памяти. Но доступ к памяти в диапазоне [vaddr, vaddr + 2 МБ) будет медленнее, чем [kaddr, kaddr + 2 МБ)? Большая память будет создана во время инициализации драйвера, поэтому vmallo c память вызывает проблемы с производительностью?
DMA нужно dma_map_single
, чтобы получить dma_addr_t
. Я думаю, используйте dma_map_single
, чтобы получить все адреса dma страницы в драйвере init. Я просто буду использовать эти адреса dma, когда драйверу понадобится сделать DMA. Могу ли я сделать это для улучшения производительности?