大家都知道Android是基于Linux的开放软件平台,它的系统构架图如下所示: 

 那么它使用的linux和普通的 linux 有什么区别呢?下面我稍微总结一下:

1.  Ashmem - Anonymous shared memory subsystem (匿名共享内存子系统)

    - mm/ashmem.c

    - 允许进程共享命名的内存block

    - 内核在其不使用时可以对其回收

    - 更加适合小内存设备

    - 使用open /dev/ashmem打开该设备,用mmap()之后,可以使用以下iocts:

       . ASHMEM_SET_NAME 

      . ASHMEM_GET_NAME 

      . ASHMEM_SET_SIZE 

      . ASHMEM_GET_SIZE 

      . ASHMEM_SET_PROT_MASK 

      . ASHMEM_GET_PROT_MASK 

      . ASHMEM_PIN 

      . ASHMEM_UNPIN 

      . ASHMEM_GET_PIN_STATUS 

      . ASHMEM_PURGE_ALL_CACHES

2. Pmem - Process Memory Allocator

    - drivers/misc/pmem.c

    - pmem是用来管理用户空间和内核驱动之间(dsp, gpu, etc)较大块的连续共享物理内存(1-16+MB)

3.  Binder IPC - 类似corba的IPC

    - drivers/staging/android/binder.c

    - 用以替代System-V IPC进行进程间通讯

    - 减少进程间通信开销,解决安全漏洞问题

    - 进程/线程池间通讯

    - 面向系统的组件结构

    - 提供面向对象的操作系统环境

4. Logger - 日志功能 (kernel support for 'logcat' command)

    - drivers/staging/android/logger.c

       . 提供给用户进程读写系统日志信息 

    - drivers/staging/android/ram_console.c

      . 在RAM buffer中存储内核日志 

    - 如果发生kernel panic,下次启动后,可以通过/proc/last_kmsg查看内核信息

4. Low Memory Killer

    - drivers/staging/android/lowmemorykiller.c

    - 扫描所有运行的进程然后杀死其中的一个进程

5. Yaffs2

    - Yet another flash file system 2nd edition

    - fs/yaffs2/*

    - 专门针对NAND flash特性设计的文件系统

    - Yaffs2具有以下特点:

      . 日志系统:Yaffs2是一个日志型文件系统,因此具有掉电保护功能。它需要一定的额外RAM空间来存储日志

      . 垃圾回收:Yaffs2具有高度优化和可预测的垃圾回收策略,因此该文件系统具有高性能以及deterministic。当可用的内存太少时,Yaffs2会执行垃圾回收。一个有dirty page和good page的block将会被选择,Yaffs会把好的页面考到另外的block,然后把当前的block标记为dirty,并且擦出,使之能够再次被使用。

      . 较少的额外内存需求:它比其他的大部分文件系统都需要更少的额外内存,因此具有更高的扩展性

      . 灵活性,可移植性,健壮性。

6. Frame Buffer

    - 需要double buffering aka panning 功能

    -  分配实际frame大小两倍的内存

    - Pan 功能选择实际输出到屏幕的buffer

7. Power Management

    - 基于linux的电源管理

    - More aggressive 的策略- “没有说要用,就关掉“

    - 使用wakelock(唤醒锁)来管理电源

8. Bionic 

    - Andriod 版的Libc

    - glibc 和 uclibc 都是基于LGPL版权

    - 为了避免版权的纠纷,Android自己开发了仅有200k的BSD版权的bionic,除此之外,bionic更加适合小型移动设备

    - Bionic不支持c++异常

    - Bionic不与glibc或者uclibc兼容

    - Bionic有意不提供System-V IPCs机制(semget(), shmget(), msgget()等)

    - 不支持System-V IPC 的原因是“they lead to global kernel resource leakage" (会导致全局资源泄漏)