사용자 공간에서 큰 데이터 블록 (~ 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. *을 테스트했습니다.
위의 결과가 의미가 있습니까? 그렇다면, 누군가 일어나고있는 일에 대한 배경 지식을 제공해 줄 수 있습니까?
감사합니다.