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

本文介绍了Linux内核中通过remap_pfn_range方法实现mmap的过程,详细解析了参数含义,并给出了实际操作的例子。内容涉及arm平台上的Linux 3.2.36内核,讨论了kmalloc分配内存的情况。
摘要由CSDN通过智能技术生成

这一篇是说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
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值