大家都知道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" (会导致全局资源泄漏)