Ashmen 匿名共享内存
来源:互联网 发布:qq飞车抽奖辅助软件 编辑:程序博客网 时间:2024/06/15 20:57
ashmem的意思就是Anonymous Shared Memory,即匿名共享内存。Android系统主要包括五个部分,分别是Linux 内核、本地库、Dalvik 虚拟机、应用程序框架和应用程序。对于其中的Linux内核部分,最初Android是基于2.6.25的,而且Android内核基本是同Linux内核同步更新的,Android在Linux内核的基础上做了一些修改和功能上的添加。目前最新的开源版本是Android2.3,它是基于Linux-2.6.35的,它于2010年12月7日公布。
其中Android在Linux内核的功能上的添加,就有ashmem,它为进程提供大块共享内存,同时为内核提供回收和管理这个内存的机制,其源代码位于Android源码中的kernel/mm/ashmem.c中:(Android内核版本2.0(Eclair),它是基于2.6.29)
1、用到的数据结构:
(1)struct ashmem_area:Android共享内存区,当父文件(应该也可以理解成父进程)调用open()函数时有效,至它调用release()函数消亡,通过“ashmem_mutex”来保护其互斥性。具体定义如下:
- struct ashmem_area {
- char name[ASHMEM_NAME_LEN];
- struct list_head unpinned_list;
- struct file *file;
- size_t size;
- unsigned long prot_mask;
- };
struct list_head unpinned_list; /* ashmem区的链表,用来把所有区连接起来 */
struct file *file; /* 支持shmem-based的文件,struct file结构体定义 */
size_t size; /* 内存映射的大小,以bytes为单位 */
unsigned long prot_mask; /* 一个类似于标志位的变量 */
(2)struct ashmem_range:代表unpinned(evictable)页的区间,生命周期从unpin到pin,同样由“ashmem_mutex”来保证其互斥性。
- struct ashmem_range {
- struct list_head lru;
- struct list_head unpinned;
- struct ashmem_area *asma;
- size_t pgstart;
- size_t pgend;
- unsigned int purged;
- };
struct list_head unpinned; /* unpinned区域链表 */
struct ashmem_area *asma; /* 相关的ashmem区域 */
size_t pgstart; /* 页开始位置(包含在页内) */
size_t pgend; /* 页结束位置(包含在页内) */
unsigned int purged; /* 标志变量,ASHMEM_NOT或ASHMEM_WAS_PURGED */
定义的几个全局变量:
- static LIST_HEAD(ashmem_lru_list);
- static unsigned long lru_count;
- static DEFINE_MUTEX(ashmem_mutex);
- static struct kmem_cache *ashmem_area_cachep __read_mostly; /
- static struct kmem_cache *ashmem_range_cachep __read_mostly;
宏定义实现的函数:
- #define range_size(range) ((range)->pgend - (range)->pgstart + 1)
- #define range_on_lru(range) ((range)->purged == ASHMEM_NOT_PURGED)
- #define page_range_subsumes_range(range, start, end) (((range)->pgstart >= (start)) && ((range)->pgend <= (end)))
- #define page_range_subsumed_by_range(range, start, end) (((range)->pgstart <= (start)) && ((range)->pgend >= (end)))
- #define page_in_range(range, page) (((range)->pgstart <= (page)) && ((range)->pgend >= (page)))
- #define page_range_in_range(range, start, end) (page_in_range(range, start) || page_in_range(range, end) || page_range_subsumes_range(range, start, end))
- #define range_before_page(range, page) ((range)->pgend < (page))
4、函数实现:
(1)内联函数:
- static inline void lru_add(struct ashmem_range *range)
- static inline void lru_del(struct ashmem_range *range)
- static inline void range_shrink(struct ashmem_range *range, size_t start, size_t end)
基本函数:
- static int range_alloc(struct ashmem_area *asma, struct ashmem_range *prev_range,
- unsigned int purged, size_t start, size_t end)
- static void range_del(struct ashmem_range *range)
static struct file_operations ashmem_fops 成员函数:
- struct file_operations定义如下:
- static struct file_operations ashmem_fops = {
- .owner = THIS_MODULE,
- .open = ashmem_open,
- .release = ashmem_release,
- .mmap = ashmem_mmap,
- .unlocked_ioctl = ashmem_ioctl,
- .compat_ioctl = ashmem_ioctl,
- };
成员函数定义如下:
- static int ashmem_open(struct inode *inode, struct file *file)
- static int ashmem_release(struct inode *ignored, struct file *file)
- static int ashmem_mmap(struct file *file, struct vm_area_struct *vma)
- static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
- static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
- {
- struct ashmem_area *asma = file->private_data;
- long ret = -ENOTTY;
- switch (cmd) {
- case ASHMEM_SET_NAME:
- ret = set_name(asma, (void __user *) arg);
- break;
- case ASHMEM_GET_NAME:
- ret = get_name(asma, (void __user *) arg);
- break;
- case ASHMEM_SET_SIZE:
- ret = -EINVAL;
- if (!asma->file && !(arg & ~PAGE_MASK)) {
- ret = 0;
- asma->size = (size_t) arg;
- }
- break;
- case ASHMEM_GET_SIZE:
- ret = asma->size;
- break;
- case ASHMEM_SET_PROT_MASK:
- ret = set_prot_mask(asma, arg);
- break;
- case ASHMEM_GET_PROT_MASK:
- ret = asma->prot_mask;
- break;
- case ASHMEM_PIN:
- case ASHMEM_UNPIN:
- case ASHMEM_GET_PIN_STATUS:
- ret = ashmem_pin_unpin(asma, cmd, (void __user *) arg);
- break;
- case ASHMEM_PURGE_ALL_CACHES:
- ret = -EPERM;
- if (capable(CAP_SYS_ADMIN)) {
- ret = ashmem_shrink(0, GFP_KERNEL);
- ashmem_shrink(ret, GFP_KERNEL);
- }
- break;
- }
- return ret;
- }
①ASHMEM_SET_NAME 设置名称,调用set_name函数。
②ASHMEM_GET_NAME 获取名称,调用get_name函数。
③ASHMEM_SET_SIZE 设置ashmem的大小,通过改变ashmem_area中的成员变量设置。
④ASHMEM_GET_SIZE 获得ashmem的大小,通过读ashmem_area的成员变量获取。
⑤ASHMEM_SET_PROT_MASK 设置prot_mask,调用set_prot_mask函数。
⑥ASHMEM_GET_PROT_MASK 获取prot_mask,通过读ashmem_area的成员变量获取。
⑦ASHMEM_PIN 使用pin语法,调用ashmem_pin_upin函数,通过判断再调用ashmem_pin函数。
⑧ASHMEM_UNPIN 使用upin语法,调用ashmem_pin_upin函数,通过判断再调用ashmem_upin函数。
⑨ASHMEM_GET_PIN_STATUS 获取pin状态,调用ashmem_pin_upin函数,通过判断再调用ashmem_get_pin_status函数。
⑩ASHMEM_PURGE_ALL_CACHES "净化"所有cache,调用ashmem_shrink函数。
(4)模块函数:定义模块的入口函数和出口函数。
static int __init ashmem_init(void)
/* 模块编程的规范,入口函数 */
static void __exit ashmem_exit(void)
/* 模块编程的规范,出口函数 */
- Ashmen 匿名共享内存
- Ashmem 匿名内存共享
- Ashmem(匿名内存共享)
- android ashmem 匿名共享内存
- Android匿名共享内存笔记
- Ashmem匿名共享内存系统
- Android系统匿名共享内存Ashmem
- 匿名共享内存Ashmem实例--C++
- android 匿名共享内存的特点
- Android 匿名共享内存驱动源码分析
- Android 匿名共享内存Java接口分析
- Android 匿名共享内存C接口分析
- Android 匿名共享内存C++接口分析
- Android 匿名共享内存C++接口分析
- Android系统匿名共享内存Ashmem
- Android系统匿名共享内存Ashmem
- 共享内存:全双工匿名管道
- Android匿名共享内存和MemoryFile
- Eclipse常用设置
- Node.js 究竟是什么?
- 使用Spring进行切面(AOP)编程
- 编程标准之注释
- Asp.net_设置Button属性跳过控件验证
- Ashmen 匿名共享内存
- map容器的使用
- T4模板从字符串生成 INSERT
- 解释“用最小空间度将一个M*N的矩阵旋转90度(顺逆时针均可) ”
- js绘制玫瑰花
- C++要点
- practice from RubyMonk
- [情人节专属]纯js脚本1k大小的3D玫瑰
- Jquery中判断input文本框的值为空