1.4.2 Android和Linux内核的区别
Android系统的系统层面的底层是Linux,中间加上了一个叫作Dalvik的Java虚拟机,表面层上面是Android运行库。每个Android应用都运行在自己的进程上,享有Dalvik虚拟机为它分配的专有实例。为了支持多个虚拟机在同一个设备上高效运行,Dalvik被改写过。
Dalvik虚拟机执行的是Dalvik格式的可执行文件(.dex)——该格式经过优化,以降低内存耗用到最低。Java编译器将Java源文件转为class文件,class文件又被内置的dx工具转化为dex格式文件,这种文件在Dalvik虚拟机上注册并运行。
Android系统的应用软件都是运行在Dalvik之上的Java软件,而Dalvik是运行在Linux中的,在一些底层功能,如线程和低内存管理方面,Dalvik虚拟机是依赖Linux内核的。由此可见,可以说Android是运行在Linux之上的操作系统,但是它本身不能算是Linux的某个版本。
Android内核和Linux内核的差别主要体现在11个方面,接下来一一简要介绍。
(1)Android Binder
Android Binder是基于OpenBinder框架的一个驱动,用于提供Android平台的进程间通信(IPC,inter-process communication)。原来的Linux系统上层应用的进程间通信主要是D-bus(desktop bus),采用消息总线的方式来进行IPC。
其源代码如下。
(2)Android电源管理(PM)
Android电源管理是一个基于标准Linux电源管理系统的轻量级的Android电源管理驱动,针对嵌入式设备进行了很多优化。利用锁和定时器来切换系统状态,控制设备在不同状态下的功耗,以达到节能的目的。
Android电源管理的源代码分别如下。
(3)低内存管理器(Low Memory Killer)
Android中的低内存管理器和Linux标准的OOM(Out Of Memory)相比,其机制更加灵活,它可以根据需要杀死进程来释放需要的内存。Low memory killer的代码很简单,关键的一个函数是Lowmem_shrinker。作为一个模块在初始化时调用register_shrinke注册了lowmem_shrinker,它会被vm在内存紧张的情况下调用。Lowmem_shrinker完成具体操作。简单来说,就是寻找一个最合适的进程杀死,从而释放它占用的内存。
低内存管理器的源代码如下。
(4)匿名共享内存(Ashmem)
匿名共享内存为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。如果一个程序尝试访问Kernel释放的一个共享内存块,它将会收到一个错误提示,然后重新分配内存并重载数据。
匿名共享内存的源代码如下。
(5)Android PMEM(Physical)
PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物理内存上。驱动中提供了mmap,open,release和ioctl等接口。
Android PMEM的源代码如下。
(6)Android Logger
Android Logger是一个轻量级的日志设备,用于抓取Android系统的各种日志,是Linux所没有的。
Android Logger的源代码如下。
(7)Android Alarm
Android Alarm提供了一个定时器,用于把设备从睡眠状态唤醒,同时它也提供了一个即使在设备睡眠时也会运行的时钟基准。
Android Alarm的源代码如下。
(8)USB Gadget驱动
USB Gadget驱动是一个基于标准Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gadget框架的。
USB Gadget驱动的源代码如下。
(9)Android Ram Console
为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备里,它是一个基于RAM的Buffer。
Android Ram Console的源代码如下。
(10)Android timed device
Android timed device提供了对设备进行定时控制功能,目前仅支持vibrator和LED设备。
Android timed device的源代码如下。
(11)Yaffs2文件系统
在Android系统中,采用Yaffs2作为MTD nand flash文件系统。Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,Yaffs2使用更小的内存来保存它的运行状态,因此它占用内存小;Yaffs2的垃圾回收非常简单而且快速,因此能达到更好的性能;Yaffs2在大容量的NAND Flash上性能表现尤为明显,非常适合大容量的Flash存储。
Yaffs2文件系统源代码位于fs/yaffs2/目录下。
Android是在Linux的内核基础之上运行的,提供的核心系统服务包括安全、内存管理、进程管理、网络组和驱动模型等内容。内核部分还相当于一个介于硬件层和系统中其他软件组之间的一个抽象层次。但是严格来说它不算是Linux操作系统。