系统上电加载内核后,按照以下流程完成系统各个服务和应用的启动:
启动子系统上下文结构图
上电之后,一般在boot引导程序启动内核,在内核的cmdline 配置init进程的位置。
# cat /proc/cmdline
mem=640M console=ttyAMA0,115200 mmz=anonymous,0,0xA8000000,384M clk_ignore_unused rootdelay=10 hardware=Hi3516DV300 init=/init root=/dev/ram0 rw blkdevparts=mmcblk0:1M(boot),15M(kernel),20M(updater),10M(misc),3307M(system),256M(vendor),-(userdata) initrd=0x84000000,0x290e00
mmz :多媒体内存,海思才有的;内核加载的最后,会调用init进程。init进程是内核加载后第一个用户态进程。
init进程启动后,首先挂载tmpfs,procfs 等文件目录,创建基本的dev设备节点,提供最基本的根文件系统。
小型系统SystemPrepare 只是打印了些信息,下面都是标准系统才有的。
mount /tmpfs /dev 0755
mount /tmpfs /mnt 0755
mount /devpts /dev/pts 0
mount /proc /proc hidepid=2
mount /sysfs /sys 0
mount /selinuxfs /sys/fs/selinux 0
跟硬件相关的挂载:
cat /vendor/etc/fstab.Hi3516DV300
fstab file.
#
/dev/block/platform/soc/10100000.himci.eMMC/by-name/system /usr ext4 ro,barrier=1 wait,required
/dev/block/platform/soc/10100000.himci.eMMC/by-name/vendor /vendor ext4 ro,barrier=1 wait,required
/dev/block/platform/soc/10100000.himci.eMMC/by-name/userdata /data ext4 nosuid,nodev,noatime,barrier=1,data=ordered,noauto_da_alloc wait,reservedsize=104857600
/dev/block/platform/soc/10100000.himci.eMMC/by-name/misc /misc none none wait,required
/dev/kmsg
/dev/null
/dev/random
/dev/urandom
打开串口log打印。
创建结点/dev/kmsg,并打开,log写入这里。通过dmesg 可以查看log。目的是通过串口打印log方便调试。
通过命令cat /proc/sys/kernel/printk_devkmsg 可以查看/dev/kmsg 是否打开。
从 /etc/fstab.required 或/system/etc/fstab.require 获取挂载设备列表。
如果这两个挂载文件都不存在,则退出第二阶段。到此结束,继续第一阶段。
启动uvent,根据fstab.required挂载分区
然后执行:
chroot /usr
/bin/init --second-stage
更多回帖