您能否帮助我理解下面提到的关于 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 交换,已正确完成 通过内核。
即,如果我正在为 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) 的示例代码,但无法 明白它们是相同还是不同吗? 如果不同什么时候使用哪种形式?
最佳答案
对于第 (d) 点,取消保留 PAGE 的解决方案正确的函数是 ClearPageReserved(page)....
我仍在尝试理解其他要点。任何人都可以指导同样的事情
阿希什·米什拉
关于linux - 5 基本的mmap相关查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14576518/