커널 내 복사본은 Linux 제로 복사본 네트워크에 항상 존재합니까?

커널 내 복사본은 Linux 제로 복사본 네트워크에 항상 존재합니까?

인터넷에서 다음과 같은 Linux 제로 카피 네트워크 예제 다이어그램을 보았습니다.

일반적인 IO 예:

1

제로 복사 IO 예:

2

나는 이것이 CPU 복사본을 제거한다는 것을 발견했습니다. 또한 일반적인 커널 버퍼 복사본도 제거합니다.

내가 관심 있는 것은 네트워크 데이터를 수신하여 이를 사용자 공간에 매핑할 때 커널 내 복사본이 포함되는지입니다. "NIC 버퍼"에서 "소켓 버퍼"로의 복사, 아니면 둘이 동일할 수 있습니까?

내가 이해한 바로는 고급 NIC에서 "NIC 버퍼"가 NIC 자체 메모리에 있을 수 있으므로 가상의 시도가 NIC의 메모리를 mmap하려고 시도합니까? (가능한가요?)

기본적으로 내가 관심 있는 것은 NIC에 대한 "DMA 복사"가 의미하는 것입니다. 이는 "와이어"에서 mmapped(또는 그 반대로)할 수 있는 커널 버퍼로 복사하는 것을 의미합니까, 아니면 반드시 복사본이 있다는 것을 의미합니까? NIC 버퍼("와이어"에서 채워짐)와 사용자 공간에서 사용할 수 있는 커널 버퍼 사이의 일부 중간입니다.

어쨌든 "소켓 버퍼"를 우회하여 사용자 공간으로 직접 데이터를 가져올 수 있습니까? 디스크 IO를 사용하는 O_DIRECT와 같은 것 같습니다. (완전한 커널 우회에 대해 말하는 것이 아닙니다.)

나는 이것이 나의 일반적인 x86-64 Linux 상자에서 어떻게 작동하는지, 그리고 동일한 현재 고급 아키텍처에서 어떻게 작동하는지 알고 싶습니다.

관련 정보