进程与内存5-mmap实现2(remap_pfn_range方法原理及实例)

这一篇是说mmap()的另一种实现方法,利用remap_pfn_page一次性映射。

 

先简单看看remap_pfn_page的源代码吧。这个代码有些函数基于平台基于版本。我的平台:arm920tlinux-3.2.36。

先对参数解读:

vma:用户层使用的vma

addr:用户的起始地址

pfn:内核空间的物理地址(内核这么写的)。我觉得只能说是内核空间地址。

size:映射大小

prot:页保护标志。

 

int remap_pfn_range(struct vm_area_struct*vma, unsigned long addr,

                    unsigned long pfn, unsignedlong size, pgprot_t prot)

{

       pgd_t *pgd;

       unsigned long next;

       unsigned long end = addr + PAGE_ALIGN(size);

       struct mm_struct *mm = vma->vm_mm;

       int err;

 

       /*

VM_IO: 标志一个 VMA 作为内存映射的 I/O 区. 在其他方面, VM_IO 标志阻止这个区被包含在进程核转储中

VM_RESERVED: 告知内存管理系统不要试图交换出这个 VMA; 它应当在大部分设备映射中设置.          

  VM_PFNMAP:纯粹的PFN,内存管理不要用struct page管理。

        */

       if (addr == vma->vm_start && end == vma->vm_end) {//整个vma

你可能感兴趣的:(进程与内存,arm,linux内核,移动设备,linux,内存管理)