专业的wap网站开发,建设网站需要几个步骤,乌海做网站,织梦cms使用教程1.启动
它是从rc文件中启动的#xff0c;rc文件是second stage init才会解析的#xff0c;也就是说vold主要作用做second stage mount#xff0c;那first stage mount是怎么做的呢#xff0c;第一阶段实际上直接调用的是fs_mgr进行的mount#xff0c;fs_mgr_do_mount_one…1.启动
它是从rc文件中启动的rc文件是second stage init才会解析的也就是说vold主要作用做second stage mount那first stage mount是怎么做的呢第一阶段实际上直接调用的是fs_mgr进行的mountfs_mgr_do_mount_one()
system/core/rootdir/init.rc
584 on early-fs
585 # Once metadata has been mounted, well need vold to deal with userdata checkpointing
586 start vold
2. vold main()分析 这里省略不中要的代码 65 int main(int argc, char** argv) {
....
74 LOG(DEBUG) Detected support for: --- 这里log输出内核支持的文件系统结果来自/proc/filesystems见2.1
75 (android::vold::IsFilesystemSupported(ext4) ? ext4 : )
76 (android::vold::IsFilesystemSupported(f2fs) ? f2fs : )
77 (android::vold::IsFilesystemSupported(vfat) ? vfat : )
78 (android::vold::IsFilesystemSupported(texfat) ? texfat : )
79 (android::vold::IsFilesystemSupported(exfat) ? exfat : );
80
81 VolumeManager* vm; --- vold中两个主要的组件VolumeManager和NetlinkManager
82 NetlinkManager* nm; --- VolumeManager负责volume的管理 NetlinkManager 负责block device uevent的管理
.........
93 mkdir(/dev/block/vold, 0755);
94
95 /* For when cryptfs checks and mounts an encrypted filesystem */
96 klog_set_level(6); --- 设置kernel log输出level 默认是KLOG_INFO_LEVEL 6
97
98 /* Create our singleton managers */
99 if (!(vm VolumeManager::Instance())) { --- 为 VolumeManager 创建实例
100 LOG(ERROR) Unable to create VolumeManager;
101 exit(1);
102 }
103
104 if (!(nm NetlinkManager::Instance())) { --- 为 NetlinkManager 创建实例
105 LOG(ERROR) Unable to create NetlinkManager;
106 exit(1);
107 }
108
109 if (android::base::GetBoolProperty(vold.debug, false)) { --- vold.debug可以用来打开log 用作显示block device uevent的发生
110 vm-setDebug(true);
111 }
112
113 if (vm-start()) { --- VolumeManager 做初始化的操作
114 PLOG(ERROR) Unable to start VolumeManager;
115 exit(1);
116 }
117
118 VoldConfigs configs {};
119 if (process_config(vm, configs)) { --- 获取volume的config信息, 其实config信息解析自fstab中的flags见2.2
120 PLOG(ERROR) Error reading configuration... continuing anyways;
121 }
122
123 android::hardware::configureRpcThreadpool(1, false /* callerWillJoin */);
124
125 ATRACE_BEGIN(VoldNativeService::start); --- VoldNativeService是Ivold的实现作为binder server创建实例并加入到ServiceManager里
126 if (android::vold::VoldNativeService::start() ! android::OK) {
127 LOG(ERROR) Unable to start VoldNativeService;
128 exit(1);
129 }
130 ATRACE_END();
131
132 LOG(DEBUG) VoldNativeService::start() completed OK;
133
134 ATRACE_BEGIN(NetlinkManager::start);
135 if (nm-start()) { --- NetlinkManager 做初始化的操作
136 PLOG(ERROR) Unable to start NetlinkManager;
137 exit(1);
138 }
139 ATRACE_END();
140
141 // This call should go after listeners are started to avoid
142 // a deadlock between vold and init (see b/34278978 for details) --- 从volume的config信息设置property
143 android::base::SetProperty(vold.has_adoptable, configs.has_adoptable ? 1 : 0);
144 android::base::SetProperty(vold.has_quota, configs.has_quota ? 1 : 0);
145 android::base::SetProperty(vold.has_reserved, configs.has_reserved ? 1 : 0);
146 android::base::SetProperty(vold.has_compress, configs.has_compress ? 1 : 0);
147
148 // Do coldboot here so it wont block booting,
149 // also the cold boot is needed in case we have flash drive
150 // connected before Vold launched
151 coldboot(/sys/block); --- 重新触发一下block device uevent和init进程的RegenerateUevents()类似,见2.3
152
153 ATRACE_END();
154
155 android::IPCThreadState::self()-joinThreadPool(); ------ 开启主线程 binder looper
156 LOG(INFO) vold shutting down;
157
158 exit(0);
159 } 2.1 cat proc/filesystems nodev代表vfs 好多啊 头大 搞那么多VFS我是真的服 nodev sysfsnodev tmpfsnodev bdevnodev procnodev cgroupnodev cgroup2nodev cpusetnodev binfmt_miscnodev configfsnodev debugfsnodev tracefsnodev securityfsnodev sockfsnodev bpfnodev pipefsnodev ramfsnodev devptsext3ext2ext4vfatmsdosexfatfuseblknodev fusenodev fusectlnodev virtiofsnodev overlaynodev incremental-fsf2fserofsnodev selinuxfsnodev bindernodev pstorenodev functionfs 2.2 process_config() 229 static int process_config(VolumeManager* vm, VoldConfigs* configs) {230 ATRACE_NAME(process_config);231 232 if (!ReadDefaultFstab(fstab_default)) { ------- 读取fstab233 PLOG(ERROR) Failed to open default fstab;234 return -1;235 }236 237 /* Loop through entries looking for ones that vold manages */238 configs-has_adoptable false;239 configs-has_quota false;240 configs-has_reserved false;241 configs-has_compress false;242 for (auto entry : fstab_default) {243 if (entry.fs_mgr_flags.quota) {244 configs-has_quota true;245 }246 if (entry.reserved_size 0) {247 configs-has_reserved true; -------- userdata分区是有reserved size的所以你的手机存储满了还是可以运行的248 }249 if (entry.fs_mgr_flags.fs_compress) {250 configs-has_compress true;251 }252 253 /* Make sure logical partitions have an updated blk_device. */254 if (entry.fs_mgr_flags.logical !fs_mgr_update_logical_partition(entry) 255 !entry.fs_mgr_flags.no_fail) {256 PLOG(FATAL) could not find logical partition entry.blk_device;257 }258 259 if (entry.mount_point /data !entry.metadata_key_dir.empty()) {260 // Pre-populate userdata dm-devices since the uevents are asynchronous (b/198405417).261 android::vold::defaultkey_precreate_dm_device(); ------ 这个好像有点内容我还没看262 }263 264 if (entry.fs_mgr_flags.vold_managed) { ---- 就两个 /storage/sdcard1 /storage/usbotg wait,voldmanagedsdcard1:auto265 if (entry.fs_mgr_flags.nonremovable) {266 LOG(WARNING) nonremovable no longer supported; ignoring volume;267 continue;268 }269 270 std::string sysPattern(entry.blk_device);271 std::string nickname(entry.label);272 int flags 0;273 274 if (entry.is_encryptable()) {275 flags | android::vold::Disk::Flags::kAdoptable; ---- sdcard 作为adoptable storage 能卡死..呵呵..笑了276 configs-has_adoptable true;277 }278 if (entry.fs_mgr_flags.no_emulated_sd ||279 android::base::GetBoolProperty(vold.debug.default_primary, false)) {280 flags | android::vold::Disk::Flags::kDefaultPrimary;281 }282 283 vm-addDiskSource(std::shared_ptrVolumeManager::DiskSource( ---- 申明voldmanaged的这俩被vm添加到了mDisksource284 new VolumeManager::DiskSource(sysPattern, nickname, flags)));285 }286 }287 return 0;288 } 2.3 do_coldboot() 188 static void do_coldboot(DIR* d, int lvl) {189 struct dirent* de;190 int dfd, fd;191 192 dfd dirfd(d);193 194 fd openat(dfd, uevent, O_WRONLY | O_CLOEXEC);195 if (fd 0) {196 write(fd, add\n, 4); -------- 因为vold启动前就已经有block device add了所以需要重新触发 add block device uevent197 close(fd);198 }199 200 while ((de readdir(d))) {201 DIR* d2;202 203 if (de-d_name[0] .) continue;204 205 if (de-d_type ! DT_DIR lvl 0) continue;206 207 fd openat(dfd, de-d_name, O_RDONLY | O_DIRECTORY | O_CLOEXEC);208 if (fd 0) continue;209 210 d2 fdopendir(fd); 211 if (d2 0)212 close(fd);213 else {214 do_coldboot(d2, lvl 1); -------- sys/block/没有找到uevent文件递归往子目录查找215 closedir(d2);216 }217 }218 }