你能帮我理解下面提到的关于 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) 的示例代码,但无法理解它们是相同还是不同?如果不同,何时使用哪种形式?