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_key2、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"
在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 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的android文件系统\busybox文件系统的启动介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在linux kernel或androi
- 下一篇: boot.img详解