Linux内核:内存管理——匿名内存

1,匿名内存的概念

匿名内存是指那些在文件系统里没有相对应的”储备文件“的那些内存,堆和栈空间的内存都属于匿名内存。

匿名内存的用途: 当一个程序很久没有运行的时候,需要要将程序占用的堆 栈交换到 swap 分区,而程序打开的文件则不需要放到 swap 分区,因为打开的文件直接可以放到其文件系统, swap 分区还包括堆栈中的一些状态和变量数据等

2,Android匿名内存

在Android系统中,匿名共享内存也是进程间通信方式的一种。相比于malloc和anonymous/named mmap等传统的内存分配机制,Ashmem的优势是通过内核驱动提供了辅助内核的内存回收算法机制(pin/unpin)。内存回收算法机制就是当你使用Ashmem分配了一块内存,但是其中某些部分却不会被使用时,

那么就可以将这块内存unpin掉。unpin后,内核可以将它对应的物理页面回收,以作他用。

http://blog.csdn.net/yangwen123/article/details/9318319

实现文件 kernel\mm\ashmem.c

struct ashmem_area { 
    char name[ASHMEM_FULL_NAME_LEN];   /* 用于/proc/pid/maps中的一个标识名称 */ 
    struct list_head unpinned_list;    /* 所有的匿名共享内存区列表 */ 
    struct file *file;                 /* Ashmem所支持的文件 */ 
    size_t size;                       /* 字节数 */ 
    unsigned long prot_mask;           /* vm_flags */ 
};

域file表示这个共享内存在临时文件系统tmpfs中对应的文件,匿名共享内存是基于Linux内核的临时文件系统tmpfs实现的,每一块匿名共享内存在临时文件系统tmpfs中都有一个对应的文件

ashmem_range数据结构就是用来表示某一块被解锁(unpinnd)的小块匿名共享内存,这些解锁的小块内存都是从一块匿名共享内存中划分出来的。

struct ashmem_range { 
    struct list_head lru;            /* LRU列表 */ 
    struct list_head unpinned;       /* unpinned列表 */ 
    struct ashmem_area *asma;        /* ashmem_area结构 */ 
    size_t pgstart;                  /* 开始页面 */ 
    size_t pgend;                    /* 结束页面 */ 
    unsigned int purged;             /* 是否需要清除(ASHMEM_NOT_PURGED 或者ASHMEM_WAS_PURGED) */ 
};

Ahshmem驱动程序在加载时,会创建一个/dev/ashmem的设备文件,这是一个misc类型的设备。注册misc设备是通过misc_register函数进行的调用这个函数成功后,就会在/

当应用程序调用mmap函数将匿名共享内存设备文件映射到进程的地址空间时,ashmem_mmap被调用,在映射的过程中为该匿名共享内存块创建一个临时文件

原文作者:知了112

原文地址:匿名内存_知了112的博客-CSDN博客(版权归原文作者所有,侵权留言联系删除)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值