uboot 在初始化结束之后,会调用 start_kernel 来运行linux kernel.
刚刚简单的看了看kernel 3.4, 现在的kernel是采用创建内核线程的形式来运行 init 的。 具体的代码可以参考 linux kernel 代码中的 init/main.c start_kernel -> rest_init , 在 rest_init 中创建了内核线程, 这个线程的处理函数是 init_post, 在 init_post 中系统会调用
run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");
早期的 linux kenel 还不支持内核线程,是直接在 start_kernel 调用 init 的。
Android 的 init 文件在 system/core/sh/init.c 代码不复杂,简单的分析一下:
1. 程序开始先判断一下是不是作为 ueventd 来运行,如果是就运行 ueventd 的逻辑了
2. 创建用到的文件系统的结构 /dev, /proc, /sys, 挂接 tmpfs 等等
3. 创建 /dev/.booting 文件
4. open_devnull_stdio 创建字符设备 /dev/__null_
5. klog_init 创建 klog 用的字符设备
6. 从 init.c 读取配置文件
7. 读取本机专注的配置信息 /init.MACHINENAME.rc
8. ..... 最后读取配置信息的每一条,开始执行
init.rc 脚本是整个 android 其他的一个关键点, init.rc 所支持的所有的关键字都包涵在 core\init\keywords. h
Android 中无数的细节都堪称经典,这个小小的 init.rc 的解析的架构,完全可以复用在自己的项目,对配置文件的简单解析,或者成为简单的脚本引擎。
Android 源码分析之 init 分析
最新推荐文章于 2021-12-09 13:21:40 发布
