프로세서 캐시에서이 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가 발생합니다.