当前位置: 首页 > news >正文

中山做网站排名苏州企业网站seo

中山做网站排名,苏州企业网站seo,茌平网站制作,ps怎么做网站设计1.启动 它是从rc文件中启动的,rc文件是second stage init才会解析的,也就是说vold主要作用做second stage mount,那first stage mount是怎么做的呢,第一阶段实际上直接调用的是fs_mgr进行的mount,fs_mgr_do_mount_one…
1.启动

它是从rc文件中启动的,rc文件是second stage init才会解析的,也就是说vold主要作用做second stage mount,那first stage mount是怎么做的呢,第一阶段实际上直接调用的是fs_mgr进行的mount,fs_mgr_do_mount_one()

system/core/rootdir/init.rc
584 on early-fs
585     # Once metadata has been mounted, we'll 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 won't 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,voldmanaged=sdcard1: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_ptr<VolumeManager::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  }

http://www.laogonggong.com/news/102539.html

相关文章:

  • 开发网站需要注意如何形容一个网站做的好
  • 重庆微信营销网站网站网页主页的区别
  • wordpress 站长统计插件高端网站开发价格
  • index.html网站怎么做商务网站建设组成包括网站优化
  • 做U启的网站手机seo网站推广
  • 做ps可以在哪些网站上找素材wordpress mip img
  • 专做it招聘的网站ppt素材模板
  • 做电影网站成本乡镇网站建设自查报告
  • 卖线面网站临海网站建设
  • 做新闻类网站还有市场吗网络服务合同
  • 开发一个企业网站要多少钱国内10大搜索引擎
  • 泰州网站建设外包中国建筑信息查询平台
  • 做er图的网站兴化网站网站建设
  • 网站正能量下载直接进入主页可以吗安全吗网络运维工程师自学
  • 哪些网站可以做微课监察部门网站建设方案
  • 网站定制设计方案wordpress form 高度
  • 福建高能建设工程有限公司网站软件ui的设计流程是什么
  • 杭州哪里可以做网站推广新华网站建设
  • 自助建站系统网站开发与建设
  • pc网站建设和推广兖州网站开发
  • wix做的网站 网址是什么网站手机网站制作
  • 寮步镇做网站wordpress 弹出层
  • 安康网站制作公司工程承包
  • 网站建设的法律依据网站效果
  • 汕头网站建设公司有哪些网络空间安全和信息安全的区别
  • 丰都网站建设公司门户网站建设和管理情况自查
  • 南梁红色景区建设管理局网站建设 信用中国 网站
  • 广东省工程建设注册中心网站海南澄迈住房与建设厅网站
  • 网站建设模式yahoo网站提交入口
  • 做网站用什么电脑好上海久久厂房网