2012-07-09 53 views
16
  1. Địa chỉ DMA có được trả lại từ cuộc gọi này giống với địa chỉ thực không? LDD3 nói địa chỉ DMA nên được xử lý như trình điều khiển mờ đục. Tôi muốn mmap bộ đệm DMA này để người dùng không gian có thể đọc/ghi trực tiếp vào nó. Câu hỏi là những gì PFN tôi nên chỉ định cho remap_pfn_range (mà để ngạc nhiên thú vị của tôi bây giờ (kernel 3.4+) hoạt động cho bộ nhớ thông thường giống như cho bộ nhớ I/O). Tôi có thể chỉ cần đúc địa chỉ DMA để unsigned dài và chuyển đổi đó để PFN? Đây không phải là một sự vi phạm những gì LDD3 nói về sự không rõ ràng?Một số câu hỏi về dma_alloc_coherent

  2. dma_alloc_coherent luôn sử dụng __get_free_pages nội bộ? Điều này có nghĩa là khu vực này có khả năng luôn được phân bổ quá mức (vì hàm đầu tiên nhận byte nhưng hàm thứ hai phân bổ theo đơn vị trang)?

  3. Có cách nào để thiết lập ánh xạ trực tiếp cho nhiều trang liên tiếp thu được từ cuộc gọi đến __get_free_pages không? dma_map_page chỉ áp dụng cho các trang đơn lẻ.

+0

bạn có tìm đúng cách để đính kèm bộ nhớ dma vào bộ nhớ remap_pfn_range không? – Luca

Trả lời

11
  1. Không, địa chỉ trở lại là một địa chỉ ảo, nếu không bạn sẽ không thể truy cập nó từ vũ trụ hạt nhân. Đó là dma_handle đại diện cho địa chỉ vật lý, nhưng nó mờ đục. Bạn cần sử dụng virt_to_phys trên địa chỉ mà nó trả về và sau đó chuyển nó đến remap_pfn_range.

  2. Tôi không tin nó (mặc dù có thể phụ thuộc vào nền tảng), nhưng nó phân bổ các trang. Nếu bạn muốn một lượng bộ nhớ nhỏ hơn cho DMA, bạn nên sử dụng dma_pool_create và sau đó phân bổ các vùng từ đó.

  3. Bạn có thể sử dụng dma_map_single thay vì dma_map_page.

Tôi khuyên bạn nên tham khảo ý kiến ​​DMA-API.txt để biết thêm chi tiết về một số nội dung này.