2012-06-28 4 views
6

프로세서 캐시에서이 BAR을 캐시 가능하도록 목표로 PCIe BAR 용 사용자 정의 mmap() 기능을 사용하여 드라이버를 작성하려고합니다. 나는 이것이 최고 대역폭을 달성하는 가장 좋은 방법은 아니며 쓰기 순서는 예측할 수 없다는 것을 알고있다. (이 경우 문제도 아니다).캐시 가능한 PCIe BAR에 대한 mmap 수행 방법

How would one prevent MMAP from caching values?

프로세서에 기재된 것과 유사하다 샌디 브릿지 I7이다 PCIe 장치 알테라의 Stratix IV의 디바이스이다. 판.

먼저 CentOS 5 (2.6.18)에서 시도했습니다. BMC가 캐싱 할 수없는 MTRR 내에 있지 않고 io_remap_pfn_range()을 사용하여 및 _PAGE_PWT 비트를 삭제했는지 확인하기 위해 MTRR 설정을 변경했습니다. 예상 한대로 작동 한 읽기 : 올바른 값을 반환하고 동일한 주소로 두 번째 읽기가 반드시 읽기를 PCIe로 보내지는 않습니다 (읽기 카운터는 FPGA에서 확인 됨). 그러나 쓰기로 인해 시스템이 멈추고 로그 또는 화면에 메시지가 나타나지 않고 다시 부팅되었습니다.

둘째, PAT를 지원하는 CentOS 6 (2.6.32)에서 시도했습니다. 결과는 동일합니다 : 읽기가 올바르게 작동하고 쓰기가 시스템 정지 및 재부팅을 야기합니다. 흥미롭게도 비 임시/쓰기 - 결합 전체 캐시 라인 쓰기 (AVX/SSE)는 예상대로 작동합니다. 즉, 항상 FPGA로 이동하고 FPGA는 전체 캐시 라인 쓰기를 관찰하고, 판독은 나중에 올바른 값을 반환합니다. 그러나 단순한 64 비트 쓰기는 여전히 시스템 정지/재부팅을 야기합니다.

또한 드라이버 코드 내에 ioremap_cache() 및 그 다음 iowrite32()을 시도했습니다. 결과는 같습니다.

하드웨어 문제라고 생각하지만 누군가가 무슨 일이 일어나고 있는지 아이디어를 공유 할 수 있다면 감사하겠습니다.

EDIT : CentOS 6 : Machine Check Exception : 5 Bank 5 : be2000000003110a에서 MCE 메시지를 캡처 할 수있었습니다.

또한 2 소켓 샌디 브릿지 (Romley)에서 동일한 코드를 시도했습니다. 읽기 및 비 임시 쓰기 동작은 동일하며 단순 쓰기는 MCE/충돌을 일으키지 않지만 시스템 상태, 즉 값에는 영향을주지 않습니다. 메모리가 변경되지 않습니다.

또한 이전의 2 소켓 Nehalem 시스템에서 동일한 코드를 시도했습니다. 코드가 다르더라도 간단한 쓰기로 인해 MCE가 발생합니다.

답변

6

MMIO 주소에 대해 WriteBack (WB) 메모리 유형을 지원하는 x86 하드웨어를 인식하지 못해서 그 비 호환성 문제가 거의 확실하게 확인됩니다. 범위를 두 번 MMIO를 매핑 - - 가 나는 http://blogs.utexas.edu/jdm4372/2013/05/29/에서 내 블로그에이 주제의 논의와 그 게시물에 http://blogs.utexas.edu/jdm4372/2013/05/30/

을 게시, 나는 일부 프로세서에서 작동하는 방법을 논의 한 번 저장 작업에 프로세서에서 WC (Write-Combining) 메모리 유형을 사용하는 FPGA 및 WP (Write Protect) 또는 WT (Write Through) 유형을 사용하여 프로세서에서 FPGA 로의 읽기에 한 번 사용됩니다. "쓰기 전용"영역에서 해당 행의 별칭에 쓸 때 "읽기 전용"영역의 캐시 행에서 CLFLUSH를 사용하여 수동으로 일관성을 유지해야합니다. 입출력 장치는 MMIO 주소에 대한 캐시 무효화 트랜잭션을 생성 할 수 없으므로 FPGA 메모리의 값 변경과 관련하여 수동으로 일관성을 유지해야합니다.

우리 팀은 내가 AMD에 있었을 때 몇 년 전에 이것을했고, 새로운 리눅스 커널과 인텔 프로세서로 어떻게 할 것인지를 고민하고 있습니다. 리눅스는 미리 정의 된 맵핑 기능으로 WP 나 WT 메모리 타입을 직접 지원하지 않기 때문에 해킹이 필요합니다 ....지역에 대한 MTRR을 재정의하는 것은 매우 쉽지만, WP 또는 WT 속성을 설정하기 위해 변경해야하는 remap_pfn_range() 함수의 자손에서 정확한 위치를 찾는 데 더 많은 어려움을 겪고 있습니다. 범위의 PAT 엔트리.

이 방법은 FPGA의 프로그래밍 가능성으로 인해이 이중 매핑 모드에서 작동하고 협조하도록 PCI BAR을 정의하는 유연성을 허용하므로 다른 (사전 정의 된) 유형의 IO 장치보다 FPGA에 더 적합 할 것입니다 캐시 일관성을 유지하는 데 프로세서 쪽 드라이버가 필요합니다.