Tôi đang cố gắng viết trình điều khiển với chức năng tùy chỉnh mmap()
cho PCIe BAR, với mục tiêu làm cho BAR này có thể lưu trong bộ nhớ cache của bộ xử lý. Tôi biết đây không phải là cách tốt nhất để đạt được băng thông cao nhất và thứ tự viết là không thể đoán trước (không phải là vấn đề trong trường hợp này).cách thực hiện mmap cho thanh PCIe BAR có thể lưu vào bộ nhớ
này tương tự như những gì được mô tả trong How would one prevent MMAP from caching values?
Bộ xử lý là Sandy Bridge i7, thiết bị PCIe là Altera Stratix IV dev. bảng.
Trước tiên, tôi đã cố gắng thực hiện trên CentOS 5 (2.6.18). Tôi đã thay đổi cài đặt MTRR để đảm bảo rằng BAR không nằm trong MTRR không thể thu thập được và sử dụng io_remap_pfn_range()
với các bit _PAGE_PCD
và _PAGE_PWT
bị xóa. Đọc làm việc như mong đợi: đọc trả về giá trị chính xác và lần đọc thứ hai đến cùng một địa chỉ không nhất thiết gây ra đọc để đi đến PCIe (đọc truy cập đã được kiểm tra trong FPGA). Tuy nhiên, các ghi đã khiến hệ thống đóng băng và sau đó khởi động lại mà không có bất kỳ thư nào trong nhật ký hoặc trên màn hình.
Thứ hai, tôi đã cố gắng thực hiện trên CentOS 6 (2.6.32), có hỗ trợ PAT. Kết quả là như nhau: đọc công việc chính xác, viết gây ra hệ thống đóng băng và khởi động lại. Điều thú vị là, dòng ghi toàn bộ dòng ghi tạm thời/ghi kết hợp (AVX/SSE) hoạt động như mong đợi, tức là chúng luôn đi tới FPGA và FPGA quan sát toàn bộ dòng bộ nhớ cache ghi, đọc lại các giá trị chính xác sau đó. Tuy nhiên, việc ghi 64 bit đơn giản vẫn khiến hệ thống bị đóng băng/khởi động lại.
Tôi cũng đã cố gắng ioremap_cache()
và sau đó iowrite32()
bên trong mã trình điều khiển. Kết quả là như nhau.
Tôi nghĩ rằng đó là vấn đề phần cứng nhưng tôi sẽ đánh giá cao nếu ai đó có thể chia sẻ bất kỳ ý tưởng nào về những gì đang diễn ra.
CHỈNH SỬA: Tôi có thể chụp thông điệp MCE trên CentOS 6: Ngoại lệ kiểm tra máy: 5 Ngân hàng 5: be2000000003110a.
Tôi cũng đã thử cùng một mã trên 2-socket Sandy Bridge (Romley): đọc và hành vi ghi thời gian không giống nhau, viết đơn giản không gây ra MCE/crash nhưng không ảnh hưởng đến trạng thái hệ thống, tức là giá trị trong bộ nhớ không thay đổi.
Ngoài ra, tôi đã thử cùng một mã trên hệ thống Nehalem 2 socket cũ hơn: viết đơn giản cũng gây ra MCE, mặc dù các mã khác nhau.