开机进入kernel后重启了
抓了一份正常的,又抓了一份异常的log,对比后可以发现
"[ 3.466078] <0>.(0)[1:init]init 3: [libfs_mgr]ReadDefaultFstab(): failed to find device default fstab
[ 3.467237] <0>.(0)[1:init]init 3: Failed to fstab for first stage mount
[ 3.468166] <0>.(0)[1:init]init 3: Using Android DT directory /proc/device-tree/firmware/android/
[ 3.469600] <0>.(0)[1:init]init 3: First stage mount skipped (missing/incompatible/empty fstab in device tree)"
"[ 3.472066] <0>.(0)[1:init]init 3: execv("/system/bin/init") failed: No such file or directory
[ 3.476582] <0>.(0)[1:init]init 5: #00 pc 000000000006c17c /system/bin/init
[ 3.477496] <0>.(0)[1:init]init 5: #01 pc 0000000000097ee4 /system/bin/init
[ 3.478387] <0>.(0)[1:init]init 5: #02 pc 000000000000c650 /system/lib64/libbase.so
[ 3.479362] <0>.(0)[1:init]init 5: #03 pc 0000000000040108 /system/bin/init
[ 3.480273] <0>.(0)[1:init]init 5: #04 pc 00000000000240f4 /system/bin/init
[ 3.481162] <0>.(0)[1:init]init 5: #05 pc 000000000007d86c /system/lib64/libc.so
[ 3.482103] <0>.(0)[1:init]init 5: Reboot ending, jumping to kernel"
这里出现了问题
"[ 3.466078] <0>.(0)[1:init]init 3: [libfs_mgr]ReadDefaultFstab(): failed to find device default fstab"
首先是没找到fstab
"[ 3.472066] <0>.(0)[1:init]init 3: execv("/system/bin/init") failed: No such file or directory”
其次在执行/system/bin/init程序的时候,发现没有
然后接下来就像我们所熟知的linux执行init程序如果发现没有,就会
“[ 3.476582] <0>.(0)[1:init]init 5: #00 pc 000000000006c17c /system/bin/init
[ 3.477496] <0>.(0)[1:init]init 5: #01 pc 0000000000097ee4 /system/bin/init
[ 3.478387] <0>.(0)[1:init]init 5: #02 pc 000000000000c650 /system/lib64/libbase.so
[ 3.479362] <0>.(0)[1:init]init 5: #03 pc 0000000000040108 /system/bin/init
[ 3.480273] <0>.(0)[1:init]init 5: #04 pc 00000000000240f4 /system/bin/init
[ 3.481162] <0>.(0)[1:init]init 5: #05 pc 000000000007d86c /system/lib64/libc.so”
把默认的init程序路径都找一遍,然后都没找到,就重启了
ok,根据错误log走一遍相关代码流程
init的main.cpp里面的main函数会调用下面的FirstStageMain()函数
FirstStageMain() //core/init/first_stage_main.cpp这个文件的main函数会调用SetInitAvbVersionInRecovery()这个函数
SetInitAvbVersionInRecovery()
ReadFirstStageFstab()
ReadDefaultFstab
ReadFstabFromDt()
if (fstab_buf.empty()) {
if (log) LINFO << __FUNCTION__ << "(): failed to read fstab from dt"; //正常也有这个打印
...
if (!default_fstab_path.empty()) {
ReadFstabFromFile(default_fstab_path, &default_fstab);