这一篇是说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