Реализация сетевой карты пользовательского пространства «bus-mastering» в C ++ на Linux

Я заинтересован в доступе к сетевым пакетам через «bus-mastering» в приложении C ++ в Linux. У меня есть несколько вопросов, касающихся этой общей темы:

1) Как я узнаю, в какой диапазон адресов памяти сетевая карта с поддержкой «master-master» записывает данные и будет ли это ядро ​​или пространство пользователя?

2) Если № 2 — «Пространство ядра», как я могу изменить карту так, чтобы она записывала в память в пространстве пользователя?

3a) Как я могу получить доступ к этой конкретной области памяти пользовательского пространства из C ++?

3b) Я понимаю, что вы не можете просто начать получать доступ к областям памяти других процессов из одного приложения, только к тем, которые явно «совместно используются» — так как я могу гарантировать, что область памяти, записанная непосредственно сетевой картой, предназначена для совместного использования?

4) Как узнать, реализует ли сетевая карта «bus-mastering»?

Я сталкивался с термином PACKET_MMAP — это будет то, что мне нужно?

2

Решение

Если вы отображаете область памяти и присваиваете адрес этой ОС, ОС может заблокировать эту область (чтобы она не была выгружена) и получить физический адрес памяти.

Он вообще не используется для этой цели, но код в 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 пользовательским кодом.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]