AndroidT(13) init 进程 -- first stage init 的启动(一)

news/2025/2/23 5:44:32

1.概览

  第一阶段的 init 工作主要用于读取系统启动阶段需要的配置信息(例如 linux的bootconfig,cmdline等配置信息)、挂载文件系统、安装 kernel 中的模块驱动,最后就是启动第二阶段的 init 来进行 Android 系统相关的组件。第一阶段的 init 被编译为静态的可执行程序,位于 ramdisk 中。在 kernel 启动后该 init 应用程序则会被运行。

init__2">2.first init 的存储位置

init_boot__3">2.1. init_boot 的目录结构

  init 可执行程序一般位于 ramdisk 中,而在 Android T 中,包含 init 的 ramdisk 则位于 init_boot.img 镜像中,它在编译 Android时会产生。文件格式和 boot.img 是一致的,所以可以使用 AOSP 编译系统的 unpack_bootimg 来拆包

server :~/AOSP_T/out/target/product/board/tmpImage$ unpack_bootimg --boot_img init_boot.img --out init_boot_unpack_out/
boot magic: ANDROID!
kernel_size: 0
ramdisk size: 2257400
os version: 13.0.0
os patch level: 2023-03
boot image header version: 4
command line args:
boot.img signature size: 0

server :~/AOSP_T/out/target/product/board/tmpImage$ ls - init_boot_unpack_out/
-rw-rw-r-- 1 flgstaff flgstaff       0 Mar 19 16:02 kernel
-rw-rw-r-- 1 flgstaff flgstaff 2257400 Mar 19 16:02 ramdisk

  在init_boot中,是没有 linux kernel 的,从它的大小也能看出。下面看下 ramdisk 包含的目录结构,同样的 AOSP 也提供了对应的工具

server :~/AOSP_T/out/target/product/board/tmpImage/init_boot_unpack_out$ export MY_RAMDISK=ramdisk && lz4 -d ${MY_RAMDISK} ${MY_RAMDISK}_d && mkdir ${MY_RAMDISK}Struct && mv ${MY_RAMDISK}_d ${MY_RAMDISK}Struct && cd ${MY_RAMDISK}Struct && cpio -idmv < ${MY_RAMDISK}_d
ramdisk              : decoded 4212992 bytes
debug_ramdisk
dev
first_stage_ramdisk
first_stage_ramdisk/debug_ramdisk
first_stage_ramdisk/dev
first_stage_ramdisk/metadata
first_stage_ramdisk/mnt
first_stage_ramdisk/proc
first_stage_ramdisk/second_stage_resources
first_stage_ramdisk/sys
init
metadata
mnt
proc
second_stage_resources
sys
system
system/bin
system/bin/snapuserd
system/etc
system/etc/init
system/etc/init/snapuserd.rc
system/etc/ramdisk
system/etc/ramdisk/build.prop
8229 blocks

2.2. ramdisk 的目录结构

  下面是上面 ramdisk 解压出来的目录结构

server :~/AOSP_T/out/target/product/board/tmpImage/init_boot_unpack_out/ramdiskStruct$ tree
.
├── debug_ramdisk
├── dev
├── first_stage_ramdisk
│   ├── debug_ramdisk
│   ├── dev
│   ├── metadata
│   ├── mnt
│   ├── proc
│   ├── second_stage_resources
│   └── sys
├── init
├── metadata
├── mnt
├── proc
├── second_stage_resources
├── sys
└── system
    ├── bin
    │   └── snapuserd
    └── etc
        ├── init
        │   └── snapuserd.rc
        └── ramdisk
            └── build.prop

  从目录结构中能看出,这个init位于ramdisk的根目录下,也就是第一阶段的 init 静态可执行程序。
  最终 init_boot.img 会被烧写入 init_boot 分区。

init__82">3.first init 的生成

  编译规则如下

//system\core\init\Android.bp
cc_binary {
    name: "init_first_stage",
    stem: "init",
    defaults: ["init_first_stage_defaults"],
    ...
    srcs: [
        ...
        "first_stage_main.cpp",
        ...
    ],
    static_executable: true,
    ramdisk: true,
    install_in_root: true,
}

  下面是编译时存放位置

server:~/AOSP_T/system/core/init$ mmm .:init_first_stage -j23
[100% 341/341] Install out/target/product/board/ramdisk/init

init__106">4.first init 的启动

  此处的 init 是由 linux kernel 启动的,它也是 kernel 的第一个用户程序,至于它是如何被 linux kernel 拉起来的则不在此处讨论。下面则是 first init 的入口方法

//system\core\init\first_stage_main.cpp
int main(int argc, char** argv) 
    return android::init::FirstStageMain(argc, argv);
        //system\core\init\first_stage_init.cpp
        if (REBOOT_BOOTLOADER_ON_PANIC) {
           InstallRebootSignalHandlers();
        }
        ...

  至此 first init 则被启动了,即将开始它的任务。


http://www.niftyadmin.cn/n/420914.html

相关文章

【链表part02】| 24.两两交换链表中的节点、19.删除链表的倒数第N个节点、02.07.链表相交、142.环形链表

目录 ✿LeetCode24.两两交换链表中的节点❀ ✿LeetCode19.删除链表的倒数第N个节点❀ ✿LeetCode面试题 02.07. 链表相交❀ ✿LeetCode142.环形链表||❀ ✿LeetCode24.两两交换链表中的节点❀ 链接&#xff1a;24.两两交换链表中的节点 给你一个链表&#xff0c;两两交换其…

YOLO技术概要学习笔记2——YOLOV2到YOLOV3

目录 一、前言二、YOLOv22.1 v2特点(1)卷积层归一化(2)高分辨率分类器(3)完全卷积(4)使用锚框来预测边界框(5)维度聚类(6)直接位置预测(7) 更细粒度的特征(8) 多尺度训练2.2 YOLOv2 框架3 YOLOv33.1 v3特点(1)边界框预测(2)类别预测(3)新的骨干网络(4)空间…

MySQL-索引详解(三)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

大学考试-C语言常用考试题及答案选择填空上机-适合期末考试题库

C语言理论上机考试选择题部分&#xff08;共200题&#xff09; 1、下面程序的输出是___D______ #include<stdio.h> void main() { int k11; printf("k%d,k%o,k%x\n",k,k,k); } * A) k11,k12,k11 B) k11,k13,k13 C) k11,k013,k0xb D) k11,k13,kb 2、在…

【Matlab代码实现】电动过滤器:LPF和HPF、模拟调制:调幅和调频、WiFi、蓝牙和蜂窝网络的容量分析.....

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

PoseiSwap的趋势性如何体现?

DEX 代表了一种先进的意识形态&#xff0c;相对于 CEX 其更强调无许可、去中心化以及公开透明。然而随着 DeFi 赛道逐渐从 2021 年年底的高峰逐渐转向低谷&#xff0c;DEX 整体的交易量、TVL等数据指标也开始呈现下滑的趋势&#xff0c;DEX 正在面临发展的新瓶颈期。 在这样的背…

哈希表原理,以及unordered_set/和unordered_map的封装和迭代器的实现

哈希表 unordered系列unordered_set和unordered_map的使用哈希哈希概念哈希冲突哈希函数闭散列开散列哈希表的扩容哈希表源码&#xff08;开散列和闭散列&#xff09; 封装unordered_set/和unordered_map&#xff0c;以及实现迭代器节点定义unordered_set定义unordered_map定义…

从零玩转系列之微信支付安全

一、前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端) 在此之前已经更新了 微信支付开篇 二、微信支…