использовать Vmallo c памяти, чтобы сделать DMA? - PullRequest
0 голосов
/ 08 апреля 2020

Я пишу драйвер, который требует большой памяти. Допустим, это будет как минимум 1 ГБ. Версия ядра> = 3.10. Драйвер должен работать в X86_64 и на платформе Arm. Аппаратное обеспечение может иметь IOMMU.

  1. Эта большая память будет отображаться в пространстве пользователя.
  2. Устройство использует эту память для выполнения DMA. Каждая операция DMA просто записывает максимальный размер данных в 2 КБ в эту память.

Мои вопросы.

  1. vmallo c может дать мне большие нефизические страницы континуума. Могу ли я использовать vmallo c, чтобы получить большую память для DMA? Я думаю, используйте vmalloc_to_page, чтобы получить указатель страницы, затем используйте page_to_phys, чтобы получить физический адрес.

  2. Я нашел информацию о производительности "vmallo c ниже, чем kmallo c «. Я не уверен, что это значит. если я сделаю vaddr = vmalloc(2MB) и kaddr = kmalloc(2MB), вызов функции vmallo c будет медленнее, чем kmallo c из-за переназначения памяти. Но доступ к памяти в диапазоне [vaddr, vaddr + 2 МБ) будет медленнее, чем [kaddr, kaddr + 2 МБ)? Большая память будет создана во время инициализации драйвера, поэтому vmallo c память вызывает проблемы с производительностью?

  3. DMA нужно dma_map_single, чтобы получить dma_addr_t. Я думаю, используйте dma_map_single, чтобы получить все адреса dma страницы в драйвере init. Я просто буду использовать эти адреса dma, когда драйверу понадобится сделать DMA. Могу ли я сделать это для улучшения производительности?

...