2011-09-28 4 views
3

저는 리눅스 커널을 처음 사용합니다. 그리고 최근에 커널 2.6.33의 sendfile syscall을 살펴 보았습니다. 나는 스플 라이스는 DMA 복사를 사용 장소를 찾을 수 없습니다,splice()의 DMA 사본

do_sendfile() 
=> do_splice_direct() 
=> splice_direct_to_actor() 
=> do_splice_to() 
=> do_splice_from() 
=> splice_read,splice_write 

이 순서를 통하여 : 다음은 내 여행의 순서입니다. 그렇다면 DMA 복사는 어디에서 발생합니까?

답변

4

스플 라이스는 DMA 복사본을 만들지 않습니다. 사실 스플 라이스의 주요 사용법은 전혀 복사하지 않는 것입니다. 버퍼를 복사하는 대신 메모리 페이지에 참조를 전달하려고 시도합니다.

스플 라이스와 관련하여 언급 된 DMA는 "리프"에서 발생합니다. 스플 라이스가 참조를 전달하는 페이지의 원점은 예를 들어 디스크 컨트롤러 DMA가 버퍼로 작성한 다음 보내집니다. 패킷의 일부인 페이지의 내용에 대한 이더넷 컨트롤러 DMA - 달성하기 어렵고 드물기 때문에 적어도 "완벽한"제로 카피 (zero copy sceanrio)에서.

스플 라이스는 DMA를 수행하지 않습니다. 첫 번째 DMA와 마지막 DMA 사이에서 복사를 허용하지 않습니다.

+1

안녕하세요, 귀하의 답변에 감사드립니다. 정말 도움이됩니다. 그래서 당신이 말한 것을 정확히 이해한다면 스플 라이스의 순서는 다음과 같습니다 : 디스크 드라이브에서 fd_in 버퍼로의 DMA 복사; fd_in 버퍼는 파이프를 통해 페이지 참조를 fd_out 버퍼로 넘깁니다. 이더넷 카드는 fd_out 버퍼의 참조를보고 실제 데이터를위한 fd_in 버퍼로 직접 갔다. – sliter

+0

@sliter 네, 그렇습니다. – gby

1

내가 알고 있듯이 splice_ * 인프라는 실제로 수행되는 실제 복사 양을 최소화하는 것이 가장 좋습니다. 기껏해야 독자는 작가가 채우고있는 동일한 페이지 집합을 읽는 중입니다.

새로운 시스템 호출을 포함하여 splice()의 다양한 비트를 설명하는 LWN에 대한 훌륭한 기사가 있습니다.

+0

안녕하세요 stsquad, 답장을 보내 주셔서 감사합니다. 나는 거기를 들여다 볼 것이다. – sliter