资源描述
compcache详细说明文档
一、基本概念
1.Swap是什么?
在我们了解compcache之前,我们需要先了解什么是swap。简单 地说,swap就是虚拟内存。换句话说,计算机会划出一小部分硬盘空间来, 当作内存使用。一般来说,计算机会在内存中保留尽可能多的信息,直到内存占满。在这种情况下,计算机会开始把处于非活动状态的数据“块”(称作页)移到 swap里面,以为活动进程腾出内存。尽管swap比物理内存速度慢,但当你需要更多内存而又由于种种原因无法增加的时候,它仍然很有用。随着内存价格的 降低,普通意义上的swap应用也越来越少。
2.Compcache是什么?
“Compcache (压缩缓存)”提供了使用部分内存作为虚拟“压缩”swap的能力。换句话说,你可以把一部分你的物理内存(默认为25%)当作虚拟“压缩”swap使 用。这是一种经典的时间/空间权衡。你得到了更多“内存”,但伴随数据读出写入时的压缩、解压过程又会降低速度。当处理器变得更快(压缩/解压耗时更少) 而计算设备变得更小(没有空间放更多物理内存)时,虚拟“扩展”内存听起来就更有吸引力了。
二、应用场景
Android操作系统中的应用
在默认出厂情况下,当Android用光 内存之后,它会杀掉进程而不是将它们置入swap。从技术上来说,当手机内存不足时,Android会通知非活动进程它将要被杀死。而进程则会写下一小段 信息(比如说地图会写下你的GPS位置)然后死掉。当以后再次启用进程时,它会直接载入这段信息,这样一来,对一些应用来说,就好像它从来没有被关闭过一 样。从机理上说,这跟swap差不多。这两种方式的不同之处在于Android进程只会在它们被关闭的时候记下特定的信息,而 swap/compcache则会记下任何非活动的内存页,而不论这个页里存了些什么东西。理论上说这使得Androids的内存管理机制相对于传统的 swap/compcache更有效率。
三、系统介绍
Rzscontrol
Ramzswap
xvMalloc
Ramzswap
Compache由3部分构成,分别是xvMalloc、rzscontrol、ramzswap。关系图如下:
1、xvMalloc
该工程基于RAM块设备创建swap。Swap在RAM中,以压缩的方式存储内容。
2、rzscontrol
rzscontrol用来控制ramzswap的组件。Compache核心模块在初始化的时候会创建多个ramzswap设备,rzscontrol就是用来控制每一个ramzswap设备的组件,例如使用rzscontrol进行ramzswap的初始化化或者状态查询等。
3、ramzswap
使用xvMalloc在内存中开辟的用来存放压缩数据的swap区域。
四、关键技术
1、内存管理原理
Compcache采用xvmalloc模块来管理系统内存。内存管理结构如下图所示:
Used Block
Free Block
Free Block
Free Block
内存池
系统内存
UsedBlock结构如图所示:
Size:块的大小
Prev:上一块的偏移量
F1:本块已使用/未使用
F2:上一块已使用/未使用
User Data:数据区
FreeBlock结构如下图所示:
2、内存管理关键函数
内存管理函数主要集中在xvmalloc.c文件中。
(1) struct xv_pool *xv_create_pool(void) 函数:
该函数从内存空间中创建内存分配池
(2) void xv_destroy_pool(struct xv_pool *pool) 函数:
销毁内存分配池
(3) int xv_malloc(struct xv_pool *pool, u32 size, struct page **page,
u32 *offset, gfp_t flags) 函数:
申请内存空间
(4) void xv_free(struct xv_po
(5) ol *pool, struct page *page, u32 offset) 函数:
释放内存空间
3、设备管理
设备管理函数主要集中在ramzswap.c文件中
(1) static int create_device(struct ramzswap *rzs, int device_id) 函数:
创建设备
(2) static void destroy_device(struct ramzswap *rzs) 函数:
销毁设备
(3) static int __init ramzswap_init(void) 函数:
设备初始化
(4) static int ramzswap_read(struct ramzswap *rzs, struct bio *bio) 函数:
读设备
(5) static int ramzswap_write(struct ramzswap *rzs, struct bio *bio)函数:
写设备
五、系统功能流程
开始
创建内存设备
初始化内存设备
读设备
写设备
状态查询
注销设备
处理操作请求
其他IO控制
是否合理
抛出异常
否
(1)设备操作总流程
开始
创建内存池
销毁内存池
分配内存空间
释放内存空间
是否有空间
否
扩展内存池
结束
(2)内存管理流程
(3)设备读写流程
设备准备
申请解压空间
数据解压
数据冲刷
设备准备
申请压缩空间
数据压缩
存储
Ioctl:控制I/O设备
Int ioctl(int handle,int cmd,[int *argdx,int argcx])
ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率等。
Cmd参数得出方法:cmd参数在用户程式端由一些宏根据设备类型、序列号、传送方向、数据尺寸等生成,这个整数通过系统调用传递到内核中的驱动程式,在由驱动程式使用解码宏从这个整数中得到设备的类型、序列号、传动方向和数据尺寸等信息,然后通过switch{case}结构进行相应的操作。
快速启动是嵌入式Linux需要解决的关键问题。在比较目前加速嵌入式Linux启动的几种方法的基础上,给出了一种针对内核启动优化的快速启动方案。通过测量内核启动过程时间,获取了主要的延时因素,一次为依据,引入Kernel XIP技术消除了内核映像拷贝解压时间,提出了不检测、驱动模块化、驱动管理化等加速设备初始化策略,设计了一种既适合快速启动又实用的文件系统架构。试验结果表明,该方案明显地加快了嵌入式Linux的启动速度。需要注意的是,方案中使用XIP技术会对系统运行性能造成轻微的影响。在对性能要求高的场合,需采用一定的技术对XIP做进一步优化,如采用Partial XIP。此外,鉴于嵌入式Linux快速启动问题的复杂性,在不同应用背景下,应灵活采用相应的优化技术。
嵌入式系统作为以应用为中心的专用计算机系统,需要在启动速度、实时性、系统尺寸、电源管理等方面进行优化。近年来,linux凭借其优良的特性广泛地应用于嵌入式系统。但是,作为一种原来为PC机设计的操作系统,设计者开始并没有考虑嵌入式应用对启动速度的要求,导致其用典型的方法启动时,启动时间一般都在几十秒以上,这对于用户来说是无法接受的。此外随着Linux内核的不断膨胀,启动时间越来越长,因此,加快启动速度已经成为嵌入式Linux亟待解决的关键问题之一。目前对加快嵌入式linux启动速度的研究主要在以下三个方面:一是待机技术、二是休眠启动、三是常规启动优化。
(2)本文在分析嵌入式Linux启动各个阶段的基础上,结合相关的研究,提出了在嵌入式设备上综合XIP机制和休眠机制,利用休眠的状态信息以加速启动的方案
嵌入式系统大多是专用的计算机系统,以应用为中心,需要在系统的尺寸、启动速度、运行实时性以及电源管理诸方面进行优化。与PC 机相比,嵌入式系统具有不同的硬件结构和软件要求,很多信息设备甚至要求系统即开即用,这就对嵌入式系统的启动速度提出了要求。Linux系统源代码开放,具有内核小、效率高、性能稳定等优点,在嵌入式领域得到了广泛的应用,但启动过程稍显繁琐,因此,Linux应用于嵌入式系统,不仅仅要求在某些功能上的“删减”,加快启动速度也是应用时需要解决的一个重要问题。
快速启动对于普及嵌入式Linux系统具有重要的意义,本文通过分析嵌入式系统的引导过程,提出了综合XIP和linux休眠机制,通过改造bootloader和利用休眠的状态信息,软硬件结合,加速启动的方案。经验证此方案在加快嵌入式Linux启动速度方面效果明显,这对研究和简化嵌入式Linux的引导过程,缩短嵌入式设备的启动时间具有十分重要的研究和借鉴意义。
测试的话可以分5到六次,每次得出采用这种方式的启动时间和不采用这种方式的启动时间画一个表。
XIP技术(execute in place)即就地执行的意思,操作系统内核直接在Flash中运行,不需要拷贝到RAM。但是,NOR Flash的存储器访问周期要比RAM大的多,在使用XIP技术后可能会降低程序的运行速度,不过由于CPU的指令预取机制及Cache机制,实际使用起来并不会明显降低应用程序的运行速度。
(3)提高系统在配置较低的嵌入式设备上的启动速度,对嵌入式Linux的推广应用具有重要的意义。详细分析了嵌入式Linux启动引导过程的Bootloader部分和内核的初始化部分之后,通过对部分内核源代码的修改及U-boot 的重新设计实现,提出了一种基于状态恢复的系统快速引导策略,并在基于Intel Xscale的嵌入式开发板上进行验证。
Linux近年来在嵌入式领域得到了广泛的应用,嵌入式Linux具有内核小、效率高、源代码开放、性能稳定等优点,但启动过程稍显繁琐。信息家电等领域要求系统能够即开即用,简化嵌入式Linux的启动引导过程、缩短启动时间对嵌入式Linux的流行和发展将具有十分重要的意义。
01-.tar格式
解包:[*******]$ tar xvf FileName.tar
打包:[*******]$ tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)
02-.gz格式
解压1:[*******]$ gunzip FileName.gz
解压2:[*******]$ gzip -d FileName.gz
压 缩:[*******]$ gzip FileName
03-.tar.gz格式
解压:[*******]$ tar zxvf FileName.tar.gz
压缩:[*******]$ tar zcvf FileName.tar.gz DirName
04-.bz2格式
解压1:[*******]$ bzip2 -d FileName.bz2
解压2:[*******]$ bunzip2 FileName.bz2
压 缩: [*******]$ bzip2 -z FileName
05-.tar.bz2格式
解压:[*******]$ tar jxvf FileName.tar.bz2
压缩:[*******]$ tar jcvf FileName.tar.bz2 DirName
06-.bz格式
解压1:[*******]$ bzip2 -d FileName.bz
解压2:[*******]$ bunzip2 FileName.bz
07-.tar.bz格式
解压:[*******]$ tar jxvf FileName.tar.bz
08-.Z格式
解压:[*******]$ uncompress FileName.Z
压缩:[*******]$ compress FileName
09-.tar.Z格式
解压:[*******]$ tar Zxvf FileName.tar.Z
压缩:[*******]$ tar Zcvf FileName.tar.Z DirName
10-.tgz格式
解压:[*******]$ tar zxvf FileName.tgz
11-.tar.tgz格式
解压:[*******]$ tar zxvf FileName.tar.tgz
压缩:[*******]$ tar zcvf FileName.tar.tgz FileName
12-.zip格式
解压:[*******]$ unzip FileName.zip
压缩:[*******]$ zip FileName.zip DirName
13-.lha格式
解压:[*******]$ lha -e FileName.lha
压缩:[*******]$ lha -a FileName.lha FileName
14-.rar格式
解压:[*******]$ rar a FileName.rar
压缩:[*******]$ rar e FileName.rar
rar请到: 下载!
解压后请将rar_static拷贝到/usr/bin目录(其他由$PATH环境变量
指定的目录也行):[*******]$ cp rar_static /usr/bin/rar
展开阅读全文