linux - 5 基本的mmap相关查询

标签 linux mmap

您能否帮助我理解下面提到的关于 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/

相关文章:

large-files - 为文件调用两次 mmap

c - gets 和 mmap 的问题

c - 如何使用预处理器识别 Linux 上的 64 位构建?

c - linux - mmap 共享最大大小

linux - 如何最大化 mmap 性能?

linux - 如果动态加载程序找不到库,我可以运行可执行文件吗?

linux - 如何在 Linux 中保留虚拟内存?

c - 将堆栈移动到特定位置

linux - 如何构建具有自定义更改的 RPM 包

linux - 使用 Git 时,什么时候用一个连字符 (-) 代替两个连字符 (--)?