Android文件系統加載之一

1. fstab變量

在文件core/init/first_stage_mount.cpp中:

229 std::unique_ptr<FirstStageMount> FirstStageMount::Create() {                    
230     auto fstab = ReadFirstStageFstab();                                         
231     if (IsDtVbmetaCompatible(fstab)) {                                          
232         return std::make_unique<FirstStageMountVBootV2>(std::move(fstab));      
233     } else {                                                                                                                                                                                                   
234         return std::make_unique<FirstStageMountVBootV1>(std::move(fstab));      
235     }                                                                           
236 } 

debug信息:

[    1.381627] init: init first stage started!
[    1.381996] init: tom L=231
[    1.382236] init: tom F=ReadFirstStageFstab L=149
[    1.382623] init: tom F=ReadFstabFromDt L=674
[    1.383014] init: [libfs_mgr]ReadFstabFromDt(): failed to read fstab from dt
[    1.383578] init: tom F=ReadFstabFromDt L=674
[    1.383984] init: [libfs_mgr]tom L=474 line=# Android fstab file for ramdisk
[    1.384663] init: 
[    1.384837] init: [libfs_mgr]tom L=474 line=#<dev>  <mnt_point> <type>  <mnt_flags options> <fs_mgr_flags>
[    1.385621] init: 
[    1.385831] init: [libfs_mgr]tom L=474 line=system   /system     ext4    ro,barrier=1     wait,logical,avb=vbmeta,first_stage_mount
[    1.386947] init: 
[    1.387164] init: [libfs_mgr]tom L=474 line=vendor   /vendor     ext4    ro,barrier=1     wait,logical,first_stage_mount
[    1.388142] init: 

2. 調用流程

FirstStageMount::Create()—>ReadFirstStageFstab() ---->ReadDefaultFstab(Fstab* fstab)---->std::string GetFstabPath()

FirstStageMount::Create的定義如下:

230 std::unique_ptr<FirstStageMount> FirstStageMount::Create() {                    
231     auto fstab = ReadFirstStageFstab();                                                                                                                                                                 
232     if (IsDtVbmetaCompatible(fstab)) {                                          
233         return std::make_unique<FirstStageMountVBootV2>(std::move(fstab));      
234     } else {                                                                    
235         return std::make_unique<FirstStageMountVBootV1>(std::move(fstab));      
236     }                                                                           
237 }

ReadFirstStageFstab的定義如下:

147 static Fstab ReadFirstStageFstab() {                                            
148     Fstab fstab;                                                                
149     LOG(INFO) << "tom F="<<__FUNCTION__<<" L="<<__LINE__;                       
150     if (!ReadFstabFromDt(&fstab)) {                                             
151         if (ReadDefaultFstab(&fstab)) {                                                                                                                                                                 
152             fstab.erase(std::remove_if(fstab.begin(), fstab.end(),              
153                                        [](const auto& entry) {                  
154                                            return !entry.fs_mgr_flags.first_stage_mount;
155                                        }),                                      
156                         fstab.end());                                           
157         } else {                                                                
158             LOG(INFO) << "Failed to fstab for first stage mount";               
159         }                                                                       
160     }                                                                           
161     return fstab;                                                               
162 } 

GetFstabPath的定義如下:

448 // Identify path to fstab file. Lookup is based on pattern fstab.<hardware>,    
449 // fstab.<hardware.platform> in folders /odm/etc, vendor/etc, or /.             
450 std::string GetFstabPath() {                                                    
451     for (const char* prop : {"hardware", "hardware.platform"}) {                
452         std::string hw;                                                         
453                                                                                 
454         if (!fs_mgr_get_boot_config(prop, &hw)) continue;                       
455                                                                                 
456         for (const char* prefix : {"/odm/etc/fstab.", "/vendor/etc/fstab.", "/fstab."}) {                                                                                                               
457             std::string fstab_path = prefix + hw;                               
458             if (access(fstab_path.c_str(), F_OK) == 0) {                        
459                 return fstab_path;                                              
460             }                                                                                            
461         }                                                                                                
462     }                                                                                                    
463                                                                                                          
464     return "";                                                                                           
465 }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章