首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Android系统的内存管理研究 01

Android系统的内存管理研究 01

 Android系统概述

Android是Google(谷歌)公司开发的一款专门为移动设备打造的操作系统。2005年谷歌公司收购Android Inc公司后,于2007年研发了基于Linux的操作系统Android。2008年,TMobile与HTC公司共同研发了第一款Android手机——HTC G1。Android的发展速度非常惊人,仅仅3年便超过了Symbian系统,并且有强大的OEM支持以及众多的开发者。

Android基于Linux平台,主要由操作系统、中间件、用户界面和应用软件组成。采用的是软件堆栈的结构,操作系统的底层仅提供最基本的系统功能。在Android系统中,基本上使用的是标准的Linux2.6内核,但是Google为了让Android更适合移动手持设备,对Linux内核进行了各种优化和增强。除了Linux的通用代码外,主要包含体系结构和处理器、Android特定的驱动程序和标准的设备驱动程序3个方面的内容。Android对Linux内核的增强主要包括Alarm(硬件闹钟)、Ashmem(匿名内存共享)、Low Memory Killer(低内存管理)、Logger(日志管理)等。本文将集中分析Android的内存管理,因为Android系统是在Linux系统的基础上发展起来的,所以在介绍Linux基本的内存管理的基础上对Android的内存管理进行研究。

2 Linux内存管理

在内存管理方面,Linux系统新旧两个版本(2.6之前和之后)之间有很大的不同。由于Android系统是基于Linux2.6.x内核的,本文主要介绍Linux2.6在内存管理方面的基本内容。

2.1 反向映射机制

Linux2.6引入了基于对象的反向映射机制,这种方法为物理页面设置一个用于反向映射的链表,但是链表上的节点并不是引用了该物理页面的所有页表项,而是相应的虚拟内存区域(vm_area_struct结构)。虚拟内存区域通过内存描述符(mm_struct结构)找到页全局目录,从而找到相应的页表项。相对于前一种方法来说,用于表示虚拟内存区域的描述符比用于表示页面的描述符要少得多,所以遍历后边这种反向映射链表所消耗的时间也会少很多。

page结构中与基于对象的反向映射相关的关键字段有两个:_mapcount和mapping。基于对象的反向映射的实现如下:

struct page{

atomic_t_mapcount;

union{

……

struct{

……

struct address_space*mapping;

};

};

字段_mapcount表明共享该物理页面的页表项的数目,该计数器可用于快速检查该页面除所有者之外有多少使用者在使用,初始值是-1,每增加一个使用者,该计数器加1。

字段mapping用于区分匿名页面和基于文件映射的页面。如果该字段的最低位置被置位,那么该字段包含的是指向anon_vma结构(用于匿名页面)的指针;否则,该字段包含指向address_space结构的指针(用于基于文件映射的页面)。

返回列表