2012-03-27 30 views
10

Tôi đã viết một trình điều khiển linux rằng ioremaps xuất PCI BAR0 cho một thiết bị cụ thể thành thuộc tính nhị phân sysfs cho phép userspace kiểm soát trực tiếp nó.Làm cách nào để ngăn chặn MMAP lưu vào bộ nhớ đệm?

Sự cố xảy ra khi tôi cố gắng MMAP trên đầu thuộc tính để truy cập trực tiếp vào bộ nhớ đó (từ chương trình người dùng). Đọc thành công tốt và trả về giá trị mong đợi, mặc dù khi tôi ghi vào bộ nhớ đó, nó dường như được lưu trữ ở đâu đó giữa hạt nhân và bộ nhớ và không được gửi tới tổ hợp gốc GMCH (và do đó là thiết bị). Những gì tôi muốn làm là có một rào cản bộ nhớ ngầm ẩn sau mỗi lần truy cập.

  • Có cách nào để ngăn hạt nhân lưu vào bộ nhớ đệm ghi vào bit bộ nhớ mmap-ed không?

Follow up:

  • Được gọi msync() sau mỗi lần truy cập vào "chấp nhận" cách để làm điều này?
+1

Để trả lời câu hỏi tiếp theo ... bạn không cần 'msync()' ở đây vì không có tệp sao lưu mmap. Những gì bạn có thể cần mặc dù là một số hướng dẫn cụ thể về kiến ​​trúc cho nhiều thứ khác nhau ... ví dụ để đảm bảo thứ tự truy cập phần cứng đúng trên powerpc bạn có thể cần [eieio] (https://www-01.ibm.com/support/knowledgecenter /ssw_aix_61/com.ibm.aix.alangref/idalangref_eieio_instrs.htm) hướng dẫn (ai đó có một cảm giác hài hước :-) ... cùng một bình luận được thực hiện [ở đây] (https://unix.stackexchange.com/questions/237783/ truy cập-bộ nhớ-ánh xạ-io-là-chậm). –

Trả lời

19

Hãy tiếp tục và trả lời câu hỏi này theo cách của tôi.

Trong trình điều khiển Kernel từ hàm mmap sysfs của tôi, có macro trong /include/asm/pgtable.h đặt cờ thích hợp cho bản remap nocache'd pfn. Có vẻ như sau:

vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); 
if (io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, 
       vma->vm_end - vma->vm_start, 
       vma->vm_page_prot)) 
    return -EAGAIN; 

Ngoài ra, trong mmap của người dùng, tôi đã sử dụng cờ MAP_SHARED trong đối số cờ mmap.

Sự kết hợp của hai cuối cùng đã thực hiện thủ thuật.

+0

Thx rất nhiều người đàn ông! Tôi đã có chính xác cùng một vấn đề như u và không thể tìm thấy một giải pháp ... – Julien

+1

+1 Làm việc cho tôi quá. Cảm ơn bạn đã dành thời gian để đăng giải pháp ở đây khi bạn tìm thấy nó. :-) – TheCodeArtist

+0

cảm ơn bạn bro, đây là chính xác những gì tôi đang tìm kiếm! – Luca

0

Có thể ioremap_nocache() trợ giúp?

+0

Tôi đang sử dụng io_remap_pfn_range để remap và dịch các trang hạt nhân thành địa chỉ không gian người dùng. Tôi đã xem (và đang sử dụng) ioremap_nocache() ở nơi khác và đặt thủ công thuộc tính KERNEL_NOCACHE trên mỗi trang theo cách thủ công. Tôi không thể tìm thấy bất kỳ đề cập đến điều đó xảy ra (hoặc một lá cờ để thiết lập) bằng cách sử dụng io_remap_pfn_range. –

+1

Bổ sung: ioremap_nocache() được sử dụng khá nhiều chỉ để ánh xạ bộ nhớ IO vào không gian hạt nhân chứ không phải vào không gian người dùng - đó là lý do tại sao io_remap_pfn_range là tiện dụng. –

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