android文件系统\busybox文件系统的启动介绍
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文件系统的启动介绍相关推荐
- Android 10 根文件系统和编译系统(四):Android源码目录结构
配套系列教学视频链接: Android 10.0 AOSP源码编译: https://www.100ask.net/detail/p_60a1e037e4b0adb2d864c6d8/6 Androi ...
- Android 分区与文件系统
像Windows分盘一样,Android 设备上也有几个重要分区,用来组织和存储特定的数据 Android 分区 之所以是独立分区,是因为各自有对应的功能和用途的考量,可以进行单独读写和格式化. 进入 ...
- linux inittab 时间,linux根文件系统制作之inittab启动分析
之前讲过虚拟文件系统挂载根文件系统之后,会执行用户程序,参见博文: http://blog.chinaunix.net/uid-29401328-id-4909649.html 但只提了一下内核会启动 ...
- busybox文件系统制作
arm-linux下busybox文件系统制作 一.使用busybox制作rootfs 1.下载busybox源码 //源码下载地址.版本可根据自己需求来进行下载 https://www.busybo ...
- android文件系统只读,Android Studio - 只读文件系统?
我正在尝试将文件写入手机(以及未来用户手机上)的内部设备存储器中.我正在观看2016年的视频教程(https://www.youtube.com/watch?v=EhBBWVydcH8),它显示了他如 ...
- Android基础_1 四大基本组件介绍与生命周期
Android四大基本组件分别是Activity,Service(服务),Content Provider(内容提供者),BroadcastReceiver(广播接收器). 一.四大基本组件 Acti ...
- Android -- 多媒体播放之Media Playback基础介绍
Android -- MediaPlayer之Media Playback基础介绍 文章翻译自Android官方文档:http://www.android-dev.cn/guide/topics/me ...
- Busybox init进程启动过程 (资料收集)
http://blog.csdn.net/wjs1033/article/details/25740363 busybox的init busybox中的init程序可以完成初始化的基本功能而且去掉了S ...
- 关于android 1.6全部的权限介绍
原文:关于android 1.6全部的权限介绍 我们在 AndroidManifest.xml里需要对一些软件需要的操作做一些权限的声明, 比如我们的软件有发送短信的功能,那么就需要在 Android ...
最新文章
- 【存储知识学习】第五章-5.4虚拟磁盘和5.5卷管理层-《大话存储》阅读笔记
- Windows杀死结束进程图形化界面操作方法
- SAP Cloud Platform certificate trust下载和business role创建
- java架构师之路:推荐的15本书
- RDLC报表开发分组笔记
- Visual Studio 2017 15.6预览版最新进展
- 域还原的三种模式,以及应用场景
- GIS技巧100例25-ArcGIS之shp文件修复
- 视频ts格式转mp4
- jupyter连接失败
- ppt上显示无法显示图片计算机可能,把手机里做好的PPT导入电脑,为何有些图片会显示不出来?该如何解决?...
- 2020年毕业生腾讯校园招聘提前批——后台开发——面试经验——分享给大家交流经验。
- 计算机上机模拟试题答案,[计算机类试卷]国家二级VB机试(上机操作)模拟试卷420及答案与解析.doc...
- 闲鱼平台API,item_app获得闲鱼原生数据
- golang not enough arguments in call to uuid.Must have (uuid.UUID) want (uuid.UUID, error)
- 侍魂胧月传说显示服务器满了,侍魂胧月传说满级之后做什么 满级每日必做任务详解[多图]...
- .NET Core Web API 发布IIS 报错 500.31
- Postgresql on conflict do update 设置当前值,原始值,当前值与原始值相加值
- unity 发光字体_Unity 游戏开发技巧集锦之创建自发光材质
- sass/lsee 转换css 网站 SASS 转 CSS 工具,在线 SASS/SCSS 编译工具 - 在线工具-wetools.com微工具
热门文章
- GB50174-2017新旧对比
- 环境监控告警系统之TIM即时消息推送部署(二)
- 数据传输完整性_生产系统数据完整性事件常见指标(下)
- vbsedit无法创建空文档_如何用Python快速优雅的批量修改Word文档样式?
- 聊一聊深度学习的activation function
- shell对文本进行操作命令
- BZOJ 1008--[HNOI2008]越狱(容斥快速幂)
- os.path.dirname( __ file __ ) 2018/6/2
- 44.更多replace案例
- Python__封装