Для того, чтобы написать драйвер PCI Ethernet. Как реализовать MMAP в драйвере PCI Ethernet

В драйвере устройства Ethernet PCI, если драйвер позволяет приложениям сопоставлять буфер пользовательского пространства с виртуальной памятью драйвера и разрешать пользователю вызывать MMAP в файле драйвера устройства после его открытия. Тогда как реализовать MMAP в драйвере сетевого устройства PCI ETHERNET?

Я уже посмотрел в структуре dev_pci. Есть некоторые элементы, названные так, как будто они имеют какое-то отношение к MMAP, но я не смог точно указать, как заставить драйвер устройства реализовать MMAP.

В книге «Драйвер устройства Linux» автор специально не связывал сопоставление памяти в драйвере устройства с драйвером устройства PCI или драйвером сетевого устройства.

Любая помощь в том, как включить мой драйвер устройства PCI/Network/Ethernet для обработки вызовов MMAP из пользовательского пространства и сопоставления буфера, предоставленного пользователю, в виртуальную память драйвера. Я особенно ищу, как зарегистрировать функцию реализации XX___mmap(...) в драйвере устройства с PCI и драйвер сетевого устройства. У меня есть драйверы устройств dev_pci и net_dev в драйвере устройства.


person user786    schedule 16.01.2021    source источник
comment
Так что в основном похоже, что мне нужно связать файл с моей некоторой структурой, содержащей pci dev. Моя идея заключалась в том, что я получаю пакеты в обработчике прерываний и связываю их с некоторой виртуальной отображаемой областью или страницей. Итак, это мой вопрос, если у меня есть структура vm_area_struct, и в ней у меня есть vm_start и vm_end & offset, то как записывать пакеты на виртуальный адрес пользовательского буфера, сопоставленного с ядром, который я буду делать в обработчике опроса netdev_ops для получения пакетов   -  person user786    schedule 19.01.2021
comment
Итак, вопрос действительно о том, имеет ли смысл: if I use char driver with file operations for mmap и pci driver for pci device для устройства Ethernet и ОБА объединены в один файл драйвера c с одним __init. Я думаю, это единственный способ сделать это. если нет другого варианта. Пожалуйста, объясни   -  person user786    schedule 19.01.2021
comment
в основном результатом этого будет функциональность mmap, включенная в драйвере устройства Intel e1000e Ethernet pci.   -  person user786    schedule 19.01.2021
comment
Я, вероятно, буду использовать функцию int pci_mmap_page_range, объявленную в pci.h, для создания новой страницы в виртуальной памяти ядра, которую я буду использовать в реализованной функции mmap в драйвере.   -  person user786    schedule 19.01.2021
comment
хорошо, не отвечайте мне, просто кто-нибудь, пожалуйста, скажите: это то, как работают бэкдор-драйверы, только что нашел что-то, что я могу/не могу понять? если это так, значит ли это, что обход стека ядра неправильный [технически это не означает, что это неправильно]   -  person user786    schedule 19.01.2021
comment
Теперь нужно знать, предоставлен ли в функции mmap доступ к глобальной переменной, содержащей базовый адрес устройства pci из /dev/mem, или используется какая-то функция, пожалуйста, объясните   -  person user786    schedule 02.02.2021
comment
Или используйте буфер ДНК для обмена   -  person user786    schedule 02.02.2021
comment
Это дает немного больше контекста для другого вопроса. Если вы не хотите просто хака и случайной записи необработанных регистров, тогда в ядре, вероятно, будет написан правильный драйвер (есть драйверы пользовательского пространства, но dma и irq сложны, также не уверен в производительности; даже не уверен, что это возможно в случай ЧКВ)   -  person domen    schedule 03.02.2021