主页

Android 系统架构 —— Zygote 进程的启动

前言

通过 Init 进程启动的分析, 我们了解到它会读取 init.rc 脚本文件, zygote 进程启动相关的配置便是在此定义的, 这里我们系统的了解一下

Zygote 进程的作用

顾明思议, Zygote 是孵化器的意思, 在 Android 系统中, 所有的应用程序进程以及用来运行系统关键服务的 System 进程, 都是由 Zygote 创建的, 它就是孵化器进程

阅读更多

Android 系统架构 —— ServiceManager 进程的启动

前言

我们之前在学习 Binder 驱动的过程中就提及过 ServiceManager 是 Binder 驱动的上下文管理者

从 init 进程启动过程中我们知道 ServiceManager 服务管理进程是通过 init 进程 fork 出来的, 这里我们就分析一下 ServiceManager 的启动流程

ServiceManager 的作用

  • Service Manager 是 Binder 进程间通信的核心组件之一
  • 它扮演着 Binder 进程间通信机制的上下文管理者的角色
  • 负责管理系统中的 Service 组件, 并且向 Client 端提供获取 Service 代理对象的服务

阅读更多

Android 系统架构 —— Init 进程的启动

前言

我们知道 Android 是基于 Linux 内核的, 因此 Android 系统的启动与 Linux 内核类似

当 bootloader 中的 kernel.img 选择了操作系统之后, 便会进入 Linux 内核的初始化流程了, 内核启动的初始化由 start_kernel() 开始, 在 init/main.c 文件中, 这是 Linux 的基础知识, 这里就不赘述了

Linux 的启动的参与的进程如下

  • 0 号进程
    • 所有进程的祖先, 这是 Linux 唯一一个没有通过 fork 或者 kernel_thread 产生的进程
  • 1 号进程
    • 为用户进程, 是所有用户态进程的祖先
  • 2 号进程
    • 为内核进程, 负责内核态所有进程的管理和调度, 是所有 Linux 内核进程的祖先

1 号进程也称之为 Init 进程, 是我们需要重点关心的对象, 接下来便着重分析一下 init 进程的启动流程

阅读更多

Android 系统架构 —— Ashmem 共享内存驱动

前言

Ashmen(Anonymous Shared Memory) 匿名共享内存是 Android 的 Linux 内核实现的一个驱动, 它以驱动程序的形式实现在内核空间, 用于在进程间进行数据共享

我们知道 Binder 的内核缓冲区空间最大为 4M, 因此它无法一次性传递大数据, 在 Android UI 渲染时, 我们需要将我们需要渲染的 Surface 数据发送到 SurfaceFlinger 进程进行最后的绘制, Binder 驱动传输显然是无法满足这么大的数据量, 因此这里使用到了 Ashmem 共享内存

接下来我们从下面几个部分分别来解读 Ashmem 共享内存机制

  • 驱动的初始化
  • open 系统调用
  • mmap 系统调用

阅读更多

Android 系统架构 —— Binder 驱动

前言

前面学习了 Binder 对象的实例化流程, 了解了 Android 运行时库中对 Binder 的封装, 为了更好的了解 Binder 驱动的工作机制, 这里我们再学习一下 Linux 内核中 Binder 驱动相关知识

// 目录结构
- ~Android/kernel/goldfish
  - drivers/staging/android
    - binder.h
    - binder.c

阅读更多