Чтобы использовать mmap (), я принял метод операций с файлами debugfs.Сначала я открываю файл debugfs следующим образом:
shared_image_data_file = open("/sys/kernel/debug/shared_image_data_mmap_value", O_RDWR);
shared_image_data_mmap_value - это мой файл debugfs, который создается в моем драйвере ядра, а shared_image_data_file - это простоinteger.
Затем я вызываю mmap () из пространства пользователя следующим образом:
kernel_address = (unsigned int *)mmap(0, (4 * MBYTE), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, shared_image_data_file, 0);
Когда я вызываю функцию mmap () в пространстве пользователя, операция файла mmap моего файла debugfs выполняетследующая функция в драйвере ядра:
dma_mmap_coherent(&dev->dev, vma, shared_image_data_virtual_address, shared_image_data_physical_address, length);
shared_image_data_virtual_address является указателем типа uint_64_t, в то время как shared_image_data_physical_address имеет тип dma_addr_t, и они были созданы ранее, когда яиспользовал следующий код для выделения памяти в пространстве ядра:
shared_image_data_virtual_address = dma_alloc_coherent(&dev->dev, 4 * MBYTE, &shared_image_data_physical_address, GFP_KERNEL);
Адрес, который я передаю в DMA ПЛИС, - shared_image_data_physical_address .
Я надеюсь, чтовышесказанное полезно.
Спасибо!