Я заинтересован в доступе к сетевым пакетам через «bus-mastering» в приложении C ++ в Linux. У меня есть несколько вопросов, касающихся этой общей темы:
1) Как я узнаю, в какой диапазон адресов памяти сетевая карта с поддержкой «master-master» записывает данные и будет ли это ядро или пространство пользователя?
2) Если № 2 — «Пространство ядра», как я могу изменить карту так, чтобы она записывала в память в пространстве пользователя?
3a) Как я могу получить доступ к этой конкретной области памяти пользовательского пространства из C ++?
3b) Я понимаю, что вы не можете просто начать получать доступ к областям памяти других процессов из одного приложения, только к тем, которые явно «совместно используются» — так как я могу гарантировать, что область памяти, записанная непосредственно сетевой картой, предназначена для совместного использования?
4) Как узнать, реализует ли сетевая карта «bus-mastering»?
Я сталкивался с термином PACKET_MMAP
— это будет то, что мне нужно?
Если вы отображаете область памяти и присваиваете адрес этой ОС, ОС может заблокировать эту область (чтобы она не была выгружена) и получить физический адрес памяти.
Он вообще не используется для этой цели, но код в drivers / xen / privcmd.c, в функции mmap_mfn_range
звонил из privcmd_ioctl_mmap
(косвенно traverse_map
). Это в свою очередь призывает remap_area_mfn_pte_fn
от xen_remap_domain_mfn_range
,
Таким образом, если вы делаете что-то в том же духе в драйвере, что страницы заблокированы в памяти и принадлежат приложению, вы можете запрограммировать физический адрес (а) mmap
переместиться в аппаратное обеспечение сетевого драйвера и получить данные непосредственно в память пользовательского режима, которая была mmap’d пользовательским кодом.
Других решений пока нет …