2012-06-28 21 views
6

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_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.

Trả lời

6

Tôi không biết bất kỳ phần cứng x86 nào hỗ trợ loại bộ nhớ WriteBack (WB) cho các địa chỉ MMIO, và bạn gần như chắc chắn thấy kết quả của sự không tương thích đó. Tôi đã đăng tải một cuộc thảo luận về chủ đề này trên blog của tôi tại http://blogs.utexas.edu/jdm4372/2013/05/29/http://blogs.utexas.edu/jdm4372/2013/05/30/

Trong những thông tin đăng, tôi thảo luận về một phương pháp hoạt động trên một số bộ vi xử lý - bản đồ MMIO nô hai lần - một lần cho các hoạt động lưu trữ từ bộ xử lý FPGA sử dụng loại bộ nhớ ghi kết hợp (WC), và một lần cho các lần đọc từ bộ vi xử lý tới FPGA sử dụng các kiểu Write Protect (WP) hoặc Write Through (WT). Bạn sẽ cần phải duy trì sự kết hợp theo cách thủ công bằng cách sử dụng CLFLUSH trên các dòng bộ đệm trong vùng "chỉ đọc" khi bạn viết cho bí danh của dòng đó trong vùng "chỉ ghi". Bạn cũng sẽ cần phải duy trì sự kết hợp theo cách thủ công đối với những thay đổi trong các giá trị trong bộ nhớ FPGA, vì các thiết bị IO không thể tạo ra các giao dịch mất hiệu lực bộ nhớ cache cho các địa chỉ MMIO.

Nhóm của tôi đã làm điều này một vài năm trước khi tôi ở AMD, và bây giờ đang cố gắng tìm ra cách để làm điều đó với hạt nhân Linux mới hơn và với bộ xử lý Intel. Linux không hỗ trợ trực tiếp các loại bộ nhớ WP hoặc WT với các chức năng lập bản đồ được xác định trước của nó, vì vậy cần phải có một số yêu cầu hack ....Nó khá dễ dàng để ghi đè MTRR cho một vùng, nhưng tôi đang gặp khó khăn hơn trong việc tìm kiếm (các) vị trí chính xác trong hậu duệ của hàm remap_pfn_range() mà tôi cần phải thay đổi để có được thuộc tính WP hoặc WT được đặt trong các mục nhập PAT cho phạm vi. Phương pháp này có lẽ phù hợp hơn cho FPGAs hơn các loại thiết bị IO khác (được xác định trước), vì khả năng lập trình của FPGA cho phép linh hoạt xác định các thanh PCI hoạt động ở chế độ được ánh xạ kép này và hợp tác với trình điều khiển bên bộ xử lý trong việc duy trì kết hợp bộ nhớ cache.

Các vấn đề liên quan