2013-08-17 2 views
2

Linux의 C++ 응용 프로그램에서 "버스 마스터 링"을 통해 네트워크 패킷에 액세스하는 데 관심이 있습니다.Linux의 C++에서 사용자 공간 네트워크 카드 "버스 마스터 링"구현

1) "버스 마스터 링"가능 네트워크 카드가 데이터를 쓰고있는 메모리 주소 범위를 알 수 있습니까? 이것이 커널 또는 사용자 공간입니까?

2) # 2가 "Kernel space"인 경우 어떻게 사용자 공간의 메모리에 쓸 수 있도록 카드를 바꿀 수 있습니까?

3a) C++에서이 특정 사용자 공간 메모리 영역에 어떻게 액세스합니까?

3b) 한 응용 프로그램에서 다른 프로세스의 메모리 영역에 액세스 할 수는 있지만 명시 적으로 "공유"된 것만을 시작할 수는 없습니다. 네트워크 카드로 직접 작성된 메모리 영역을 명시 적으로 공유하도록 보장하려면 어떻게해야합니까?

4) 네트워크 카드가 "버스 마스터 링"을 구현하는지 여부를 어떻게 알 수 있습니까?

나는이 용어를 발견했습니다. PACKET_MMAP - 이것이 내가 원하는 것일까요?

+0

기술적으로 isnt해도 대부분의 사람들이이 개념을 "DMA"라고 이해하는 것이 합리적입니까? – user997112

+0

귀하의 조언을 반영하여 수정했습니다 - 감사합니다. – user997112

+0

http://en.wikipedia.org/wiki/Zero-copy – didierc

답변

0

메모리 영역을 mmap하고 OS의 주소를 지정하면 OS는 해당 영역을 잠글 수 있으므로 (그렇게 바뀌지 않도록) 메모리의 실제 주소를 가져올 수 있습니다.

이 코드는 mmap_mfn_rangeprivcmd_ioctl_mmap (간접적으로는 traverse_map)에서 호출되는 drivers/xen/privcmd.c의 코드에 사용되지 않았습니다. 그러면 xen_remap_domain_mfn_range에서 remap_area_mfn_pte_fn이 호출됩니다.

따라서 드라이버의 해당 줄을 따라 페이지가 메모리에 잠겨서 응용 프로그램에 속하는 경우, mmap 영역의 실제 주소를 다음의 하드웨어에 프로그래밍 할 수 있습니다. 네트워크 드라이버를 사용하고 사용자 코드에 의해 mmap 된 사용자 모드 메모리에 직접 데이터를 가져옵니다.

+0

그래서 기본적으로 사용자 영역에 하드 코딩 된 주소 범위를 만든 다음 드라이버로 가서 데이터가 전송되는 위치를 변경합니다.이를 userland로 보내고 C++ 응용 프로그램에서 데이터를 가져 옵니까? 다른 프로세스가 userland의 해당 메모리 영역에 쓰지 못하게하는 이유는 무엇입니까? 이 접근법은 PACKET_MMAP (http://wiki.ipxwarzone.com/index.php5?title=Linux_packet_mmap)과 어떻게 비교됩니까? – user997112

+0

'mmap'은 물리적 메모리의 영역을 프로세스의 공간에 가상 주소로 매핑합니다.이 주소는 다른 프로세스에서 사용할 수 없으며 하드 코딩 할 필요가 없습니다. 난수 또는 더 나은 방법은 OS가 하나의 주소를 선택하도록하는 것입니다 (주소는 NULL로 지정하십시오). 나는 리눅스 2.4와 2.6을 언급하고있는 것 같아서 단지 당신의 링크를 읽었을 뿐이다 ... –

+0

'packet_mmap'과 비슷한 방법을 사용하고있다. –