Я пытаюсь написать свой собственный драйвер PCIe для Linux. Я хотел бы написать мой mmap
Функция так, чтобы он отображал bar0, я понимаю, что могу сделать это без написания драйвера, но я делаю это в основном для целей обучения.
Мой первый вопрос: зачем вам реализовывать mmap
если ты можешь mmap
bar0 без какой-либо разработки драйвера?
Мой второй вопрос: почему мой mmap
не работает?
Вот мой mmap
код и приложение пользовательского пространства, которое я использую для доступа к нему
static int dma_proxy_mmap(struct file *filp, struct vm_area_struct *vma)
{
if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,vma->vm_end - vma->vm_start,vma->vm_page_prot))
{
return -EAGAIN;
}
printk(KERN_ALERT "mmap done\n");
return 0;
}
и вот мой код пространства пользователя
int main()
{
int proxy_fd;
int *MyMmap;
proxy_fd = open("/dev/scull", O_RDWR);
MyMmap = (int*)mmap(0,32, PROT_READ | PROT_WRITE, MAP_SHARED, proxy_fd, 0);
if (MyMmap == MAP_FAILED) {
printf("mmap failed");
}
MyMmap[0] = 10;
printf ("Decimals: %d\n", MyMmap[0]);
}
Я знаю, что она не работает правильно, потому что моя pcie-карта предназначена для записи другого значения независимо от того, что я отправляю на него для записи, что, как я проверял, работает с помощью mmaping для resource0 этой платы.
Задача ещё не решена.
Других решений пока нет …