2013-05-18 4 views
3

사용자 공간에서 큰 데이터 블록 (~ 6MB)을 드라이버에 전송해야합니다. 드라이버에서 pci_alloc_consistent()를 사용하여 블록 당 2 개의 3MB 청크를 할당합니다. 그런 다음 vm_insert_page()를 사용하여 각 블록 (즉, 2 개의 청크)을 단일 vma로 mmap()합니다. 이것은 사용자 공간이 mmap'ing 후 각 블록을 읽고 쓸 수 있습니다. 작동하는 것처럼 보이지만 성능이 좋지 않습니다.mmap()이 write()보다 느립니다. 왜 copy_form_user()입니까?

또한 드라이버의 pci_alloc_consistent()에 의해 할당 된 메모리로 쓰기/읽기의 다른 방법을 구현했습니다. 사용자 공간에서 write()를 사용하고 드라이버에서 copy_from_user()를 사용하여 블록의 각 청크의 내용을 위의 메모리로 이동합니다. 나는 읽는 것과 반대입니다.

첫 번째 접근 방식은 적어도 2-3 배 느리고 ~ 40 % 더 많은 CPU를 사용하는 것으로 나타났습니다. 나는 두 번째 경우에 추가 버퍼 복사본을 도입하면 속도가 느려질 것이라고 예상했다. 그러나 그것은 사실이 아닙니다.

x86 64 비트 플랫폼에서 커널, 2.6. * 및 3. *을 테스트했습니다.

위의 결과가 의미가 있습니까? 그렇다면, 누군가 일어나고있는 일에 대한 배경 지식을 제공해 줄 수 있습니까?

감사합니다.

답변

3

캐싱이 비활성화되었을 수 있습니다. 할당하고 vm_inserted 한 덩어리를 ioremap_cache() 했습니까? Iv는 x86/x86_64에서 이런 종류의 문제를 겪고 PAT (페이지 속성 테이블)와 관련이 있습니다. 메모리 유형을 캐시 가능으로 설정하고 vm_insert_page를 호출하려면 물리적 페이지를 ioremap_cache()해야합니다. 성능 문제가 해결되어야합니다.

관련 문제