安卓Linux与Linux有什么不同

最近想把以前在Linux下用C写的程序移植到安卓盒子上,照理安卓就是Linux,移植起来应该没有什么困难,到实际做的时候,才发现部分类库安卓用的和我们以前用的不一样(比如说共享内存),具体体现在:

下面内容出自:http://buaadallas.blog.51cto.com/399160/376296

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” (会导致全局资源泄漏)