-1

你能帮我理解下面提到的关于 LINUX 上的 MMAP 的几点吗:-

a) 为什么 KMALLOC 和 DMA_ALLOC_COHERENT 返回的内存必须是 PAGE_ALLIGNED 才能用于 MMAP

b) krnl_area=(int *)((((unsigned long)krnl_ptr) + PAGE_SIZE - 1)&PAGE_MASK); 通过一些搜索,我可以找出上面的代码,但我仍然不清楚它是如何完成的。

c)我如何确认我已经完成 MMAP 然后保留的 PAGE 以便它们不会使用 SetPageReserved 交换,已由 kernel 正确完成。

即,如果我正在为 MMAPED 的 4 页执行 SetPageReserved,我如何确认调度程序不会像我在这些页面上执行 SetPageReserved 那样交换这些页面。

d) 是否有任何功能可以 UN_RESERVED 页面,我尝试了 SetUnPageReserved 但无法找出该功能的头文件

e)有什么区别,即(1)和(2)中的哪一个是在 remap_pfn_range 中提供物理地址的正确方法...

(1) (virt_to_phys((void *)krnl_ptr) >> PAGE_SHIFT)

     or

(2) (vma->vm_pgoff)

因为我已经看到使用 (1) 或 (2) 的示例代码,但无法理解它们是相同还是不同?如果不同,何时使用哪种形式?

4

1 回答 1

0

对于点 (d) 取消保留 PAGE 的解决方案,正确的函数是 ClearPageReserved(page)....

我仍在尝试理解其他观点。任何人都可以指导一下吗

阿什米什拉

于 2013-01-29T08:26:52.643 回答