1、android文件系统(rootfs)
在uboot中检查启动参数,如果是normal mode,则load boot.img以及boot.img中的ramdisk,如果是recovery mode,则会load recovery.img以及recovery.img中的ramdisk。

注意:如果开启了system_as_root功能(在android9.0及其后的版本中要求开启了),原先boot.img中的ramdisk搬移到了system.img中。开启system_as_root功能,需要在cmdline中添加"skip_initramfs"参数
kernel/linux/init/initramfs.c中的populate_rootfs()检查到了skip_initramfs后,不去解压uboot解析后的ramdisk,而是创建了一个default_rootfs()空目录,然后将整个system.img mount到根目录.

(normal mode时)

acct       charger data         init                init.currenttest.rc init.recovery.aquilac_evb.rc init.zygote64_32.rc oem     sbin    system                 verity_key
bin        config  default.prop init.aquilac_evb.rc init.environ.rc     init.usb.configfs.rc         lost+found          proc    sdcard  ueventd.aquilac_evb.rc
bugreports cores   dev          init.ata.rc         init.factory.rc     init.usb.rc                  mnt                 product storage ueventd.rc
cache      d       etc          init.calibration.rc init.rc             init.zygote32.rc             odm                 res     sys     vendor

(recovery mode时)

acct       charger data         init                         odm                    proc         root     sideload system_root            vendor
bin        config  default.prop init.rc                      oem                    product      sbin     storage  tmp                    vendor_file_contexts
bugreports cores   dev          init.recovery.aquilac_evb.rc plat_file_contexts     prop.default sdcard   sys      ueventd.aquilac_evb.rc vendor_property_contexts
cache      d       etc          mnt                          plat_property_contexts res          sepolicy system   ueventd.rc             verity_key

2、busybox文件系统(rootfs)

xxxx

3、android init的启动 / busybox init的启动

#cat /proc/cmdline

firmware_class.path=/vendor/firmware uart_dma keep_dbgclk_on clk_ignore_unused log_buf_len=1M printk.devkmsg=on pmic_status=0x2 lcd_id=ID1901, fb_base=FB17e200000, fb_size=SZ7f8000, lcd_config=CF101. androidboot.serialno=0123456789 board_id=2 crash_page=0x10c040000 init=/init skip_initramfs rootwait root=/dev/dm-0 dm="system none ro,0 1 android-verity /dev/mmcblk0p20" veritykeyid=id:7e4333f9bba00adfe0ede979e28ed1920492b40f buildvariant=userdebug printk_nc earlycon nokaslr androidboot.dtbo_idx=0 androidboot.hardware=aquilac_evb androidboot.selinux=enforcing

在kernel_init()中:
(1)先检查ramdisk_execute_command变量(对应的cmdline中的rdinit参数,该参数是一个可执行文件的名字),如果存在则执行.
(2)、再检查execute_command(对应的cmdline中的init参数,该参数是一个可执行文件的名字),如果存在则执行,然后返回.
(3)、如果步骤(2)不存在,则会尝试执行"/sbin/init"、"/etc/init"、"/bin/init"、"/bin/sh"

vim kernel/linux/init/main.c
static int __ref kernel_init(void *unused)
{int ret;kernel_init_freeable();/* need to finish all async __init code before freeing the memory */async_synchronize_full();free_initmem();mark_readonly();system_state = SYSTEM_RUNNING;numa_default_policy();flush_delayed_fput();printk("kernel_init enter\n");if (ramdisk_execute_command) {ret = run_init_process(ramdisk_execute_command);if (!ret)return 0;pr_err("Failed to execute %s (error %d)\n",ramdisk_execute_command, ret);}/** We try each of these until one succeeds.** The Bourne shell can be used instead of init if we are* trying to recover a really broken machine.*/if (execute_command) {ret = run_init_process(execute_command);if (!ret)return 0;panic("Requested init %s failed (error %d).",execute_command, ret);}printk("kernel_init execute_command after\n");if (!try_to_run_init_process("/sbin/init") ||!try_to_run_init_process("/etc/init") ||!try_to_run_init_process("/bin/init") ||!try_to_run_init_process("/bin/sh"))return 0;panic("No working init found.  Try passing init= option to kernel. ""See Linux Documentation/init.txt for guidance.");
}

在android的设计中,根目录下的init就是system/core/init/init.cpp编译生成的可执行文件,并且cmdline添加了"init=/init"参数, 自然而然的就运行了android的init,接下来就是执行parse init.rc、load property、selinux等程序。android init的流程就不在本文介绍了。

在非android系统的设计中(如busybox文件系),依然在cmdline添加了"init=/init"参数,但此时根目录下的init是busybox中的init程序

busybox init程序会依次调用:
a. 为init设置信号处理过程
b. 初始化控制台
c. 剖析/etc/inittab文件
d. 执行系统初始化命令行,缺省情况下会使用/etc/init.d/rcS
e. 执行所有导致init暂停的inittab命令(动作类型:wait)
f. 执行所有仅执行一次的inittab(动作类型:once)

其中,/etc/inittab不是linux shell脚本,有一定的语法规则,如下是我系统中的inittab:

This is run first except when booting in single-user mode.#Startup the system
::sysinit:/bin/mount -t proc proc /proc
::sysinit:/bin/mount -t sysfs sysfs /sys
::sysinit:/bin/mount -t devtmpfs devtmpfs /dev
::sysinit:/bin/mount -o remount,rw /
::sysinit:/bin/mkdir -p /dev/pts
::sysinit:/bin/mount -t devpts devpts /dev/pts
::sysinit:/bin/mount -a::sysinit:/etc/init.d/rcS#Stuff to do before rebooting
::ctrlaltdel:/sbin/reboot
::shutdown:/etc/init.d/rcK
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r#Stuff to do when restarting the init process
::restart:/sbin/init#set hostname
null::sysinit:/bin/busybox hostname -F /etc/hostname
ttyS0::respawn:-/bin/sh

android文件系统\busybox文件系统的启动介绍相关推荐

  1. Android 10 根文件系统和编译系统(四):Android源码目录结构

    配套系列教学视频链接: Android 10.0 AOSP源码编译: https://www.100ask.net/detail/p_60a1e037e4b0adb2d864c6d8/6 Androi ...

  2. Android 分区与文件系统

    像Windows分盘一样,Android 设备上也有几个重要分区,用来组织和存储特定的数据 Android 分区 之所以是独立分区,是因为各自有对应的功能和用途的考量,可以进行单独读写和格式化. 进入 ...

  3. linux inittab 时间,linux根文件系统制作之inittab启动分析

    之前讲过虚拟文件系统挂载根文件系统之后,会执行用户程序,参见博文: http://blog.chinaunix.net/uid-29401328-id-4909649.html 但只提了一下内核会启动 ...

  4. busybox文件系统制作

    arm-linux下busybox文件系统制作 一.使用busybox制作rootfs 1.下载busybox源码 //源码下载地址.版本可根据自己需求来进行下载 https://www.busybo ...

  5. android文件系统只读,Android Studio - 只读文件系统?

    我正在尝试将文件写入手机(以及未来用户手机上)的内部设备存储器中.我正在观看2016年的视频教程(https://www.youtube.com/watch?v=EhBBWVydcH8),它显示了他如 ...

  6. Android基础_1 四大基本组件介绍与生命周期

    Android四大基本组件分别是Activity,Service(服务),Content Provider(内容提供者),BroadcastReceiver(广播接收器). 一.四大基本组件 Acti ...

  7. Android -- 多媒体播放之Media Playback基础介绍

    Android -- MediaPlayer之Media Playback基础介绍 文章翻译自Android官方文档:http://www.android-dev.cn/guide/topics/me ...

  8. Busybox init进程启动过程 (资料收集)

    http://blog.csdn.net/wjs1033/article/details/25740363 busybox的init busybox中的init程序可以完成初始化的基本功能而且去掉了S ...

  9. 关于android 1.6全部的权限介绍

    原文:关于android 1.6全部的权限介绍 我们在 AndroidManifest.xml里需要对一些软件需要的操作做一些权限的声明, 比如我们的软件有发送短信的功能,那么就需要在 Android ...

最新文章

  1. 【存储知识学习】第五章-5.4虚拟磁盘和5.5卷管理层-《大话存储》阅读笔记
  2. Windows杀死结束进程图形化界面操作方法
  3. SAP Cloud Platform certificate trust下载和business role创建
  4. java架构师之路:推荐的15本书
  5. RDLC报表开发分组笔记
  6. Visual Studio 2017 15.6预览版最新进展
  7. 域还原的三种模式,以及应用场景
  8. GIS技巧100例25-ArcGIS之shp文件修复
  9. 视频ts格式转mp4
  10. jupyter连接失败
  11. ppt上显示无法显示图片计算机可能,把手机里做好的PPT导入电脑,为何有些图片会显示不出来?该如何解决?...
  12. 2020年毕业生腾讯校园招聘提前批——后台开发——面试经验——分享给大家交流经验。
  13. 计算机上机模拟试题答案,[计算机类试卷]国家二级VB机试(上机操作)模拟试卷420及答案与解析.doc...
  14. 闲鱼平台API,item_app获得闲鱼原生数据
  15. golang not enough arguments in call to uuid.Must have (uuid.UUID) want (uuid.UUID, error)
  16. 侍魂胧月传说显示服务器满了,侍魂胧月传说满级之后做什么 满级每日必做任务详解[多图]...
  17. .NET Core Web API 发布IIS 报错 500.31
  18. Postgresql on conflict do update 设置当前值,原始值,当前值与原始值相加值
  19. unity 发光字体_Unity 游戏开发技巧集锦之创建自发光材质
  20. sass/lsee 转换css 网站 SASS 转 CSS 工具,在线 SASS/SCSS 编译工具 - 在线工具-wetools.com微工具

热门文章

  1. GB50174-2017新旧对比
  2. 环境监控告警系统之TIM即时消息推送部署(二)
  3. 数据传输完整性_生产系统数据完整性事件常见指标(下)
  4. vbsedit无法创建空文档_如何用Python快速优雅的批量修改Word文档样式?
  5. 聊一聊深度学习的activation function
  6. shell对文本进行操作命令
  7. BZOJ 1008--[HNOI2008]越狱(容斥快速幂)
  8. os.path.dirname( __ file __ ) 2018/6/2
  9. 44.更多replace案例
  10. Python__封装