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

免费个人网站服务器推荐做职业背景调查的网站

免费个人网站服务器推荐,做职业背景调查的网站,十堰 网站建设,东莞废水处理 东莞网站建设一、文件系统挂载流程概述 二、文件系统挂载流程细节 1、Init启动阶段 众所周知#xff0c;init进程为android系统的第一个进程#xff0c;也是native世界的开端#xff0c;要想让整个android世界能够稳定的运行#xff0c;文件系统的创建和初始化是必不可少的#xff…一、文件系统挂载流程概述 二、文件系统挂载流程细节 1、Init启动阶段 众所周知init进程为android系统的第一个进程也是native世界的开端要想让整个android世界能够稳定的运行文件系统的创建和初始化是必不可少的这个过程需要在android世界的前面。 //aosp/system/core/init/first_stage_init.cpp int FirstStageMain(int argc, char** argv) {LOG(INFO) init first stage started!;//.....bool created_devices false;if (want_console FirstStageConsoleParam::CONSOLE_ON_FAILURE) {if (!IsRecoveryMode()) {//第一步创建设备created_devices DoCreateDevices();if (!created_devices) {LOG(ERROR) Failed to create device nodes early;}}StartConsole(cmdline);}//......//第二步挂载设备if (!DoFirstStageMount(!created_devices)) {LOG(FATAL) Failed to mount required partitions early ...;}//..... } //aosp/system/core/init/first_stage_mount.cpp // Public functions公共函数 // Creates devices and logical partitions from storage devices bool DoCreateDevices() {auto fsm FirstStageMount::Create();if (!fsm.ok()) {LOG(ERROR) Failed to create FirstStageMount: fsm.error();return false;}//来创建设备/即初始化磁盘逻辑分区return (*fsm)-DoCreateDevices(); } // Mounts partitions specified by fstab in device tree. bool DoFirstStageMount(bool create_devices) {// Skips first stage mount if were in recovery mode.if (IsRecoveryMode()) {LOG(INFO) First stage mount skipped (recovery mode);return true;}auto fsm FirstStageMount::Create();if (!fsm.ok()) {LOG(ERROR) Failed to create FirstStageMount fsm.error();return false;}if (create_devices) {if (!(*fsm)-DoCreateDevices()) return false;}//来进行文件系统的挂载return (*fsm)-DoFirstStageMount(); } //void SetInitAvbVersionInRecovery() 第三个public函数看起来是和recovery有关系的 Init进程的通过FirstStageMount::Create()来拿到一个fsm对象然后依次调用fsm的DoCreateDevices和DoFirstStageMount来初始化挂载文件系统。 1.1 FirstStageMount::Create读取fstab配置表 此步骤主要是读取fstab分区配置表具体实现逻辑其实移交给了fs_mgr //aosp/system/core/init/first_stage_mount.cpp using android::fs_mgr::ReadDefaultFstab; using android::fs_mgr::ReadFstabFromDt; Resultstd::unique_ptrFirstStageMount FirstStageMount::Create() {//读取fstab配置表此表配置了各个目录支持的文件系统相关配置auto fstab ReadFirstStageFstab();if (!fstab.ok()) {return fstab.error();}return std::make_uniqueFirstStageMountVBootV2(std::move(*fstab)); } static ResultFstab ReadFirstStageFstab() {Fstab fstab;//从DT里面获取DT好像跟内核有关系没有具体研究if (!ReadFstabFromDt(fstab)) {//读取默认的fstab配置表if (ReadDefaultFstab(fstab)) {fstab.erase(std::remove_if(fstab.begin(), fstab.end(),[](const auto entry) { return !entry.fs_mgr_flags.first_stage_mount; }),fstab.end());} else {return Error() failed to read default fstab for first stage mount;}}return fstab; } fs_mgr被编译成为静态库lib_fs_mgr这部分逻辑其实就是读取fstab.ini配置文件并进行解析 //aosp/system/core/fs_mgr/fs_mgr_fstab.cpp // Loads the fstab file and combines with fstab entries passed in from device tree. bool ReadDefaultFstab(Fstab* fstab) {fstab-clear();ReadFstabFromDt(fstab, false /* verbose */);std::string default_fstab_path;// Use different fstab paths for normal boot and recovery boot, respectivelyif ((access(/sbin/recovery, F_OK) 0) || (access(/system/bin/recovery, F_OK) 0)) {//recovery模式下读取/etc/recovery.fstabdefault_fstab_path /etc/recovery.fstab;} else { //正常模式下读取类似于/odm/etc/fstab.default_fstab_path GetFstabPath();}Fstab default_fstab;if (!default_fstab_path.empty() ReadFstabFromFile(default_fstab_path, default_fstab)) {for (auto entry : default_fstab) {fstab-emplace_back(std::move(entry));}} else {LINFO __FUNCTION__ (): failed to find device default fstab;}return !fstab-empty(); } // Return the path to the fstab file. There may be multiple fstab files; the // one that is returned will be the first that exists of fstab.fstab_suffix, // fstab.hardware, and fstab.hardware.platform. The fstab is searched for // in /odm/etc/ and /vendor/etc/, as well as in the locations where it may be in // the first stage ramdisk during early boot. Previously, the first stage // ramdisks copy of the fstab had to be located in the root directory, but now // the system/etc directory is supported too and is the preferred location. std::string GetFstabPath() {for (const char* prop : {fstab_suffix, hardware, hardware.platform}) {std::string suffix;if (!fs_mgr_get_boot_config(prop, suffix)) continue;for (const char* prefix : {// late-boot/post-boot locations/odm/etc/fstab., /vendor/etc/fstab.,// early boot locations/system/etc/fstab., /first_stage_ramdisk/system/etc/fstab.,/fstab., /first_stage_ramdisk/fstab.}) {std::string fstab_path prefix suffix;if (access(fstab_path.c_str(), F_OK) 0) {return fstab_path;}}}return ; } 如下Android 14的手机的开机日志在init阶段来读取fstab配置表的打印这里的dt没有配置fstab默认路径没有任何打印但是可以了解到libfs_mgr的入口 1.2 fstab文件是什么样子的 android系统的文件系统相关参数定义被统一放在fstab.in里面从上面的流程可以了解到fs_mgr会去读取fstab.*文件并根据此文件配置的内容去逐一挂载所有的分区那么它到底长什么样子的呢 首先cat /vendor/etc/fstab.mtxxxx内容如下 D50:/vendor/etc # cat fsta fstab.enableswap fstab.mt6765 fstab.mt8768 D50:/vendor/etc # cat fstab.mt6765 # 1 vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765 # 1 built-in 1 # 1 built-in 3 # 341 built-in 3 # 1 command line 1 # 1 built-in 2 # 1 vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765 2 # 145 vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765 system /system ext4 ro wait,avbvbmeta_system,logical,first_stage_mount,avb_keys/avb/q-gsi.avbpubkey:/avb/r-gsi.avbpubkey:/avb/s-gsi.avbpubkey,slotselect system_ext /system_ext ext4 ro wait,avbvbmeta_system,logical,first_stage_mount,avb_keys/avb/q-gsi.avbpubkey:/avb/r-gsi.avbpubkey:/avb/s-gsi.avbpubkey,slotselectvendor /vendor ext4 ro wait,avb,logical,first_stage_mount,slotselectproduct /product ext4 ro wait,avb,logical,first_stage_mount,slotselect # 170 vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765 /dev/block/by-name/md_udc /metadata ext4 noatime,nosuid,nodev,discard wait,check,formattable,first_stage_mount/dev/block/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,noflush_merge,reserve_root134217,resgid1065,inlinecrypt latemount,wait,check,quota,reservedsize128M,formattable,resize,,checkpointfs,fileencryptionaes-256-xts:aes-256-cts:v2,keydirectory/metadata/vold/metadata_encryption/dev/block/by-name/protect1 /mnt/vendor/protect_f ext4 noatime,nosuid,nodev,noauto_da_alloc,commit1,nodelalloc wait,check,formattable /dev/block/by-name/protect2 /mnt/vendor/protect_s ext4 noatime,nosuid,nodev,noauto_da_alloc,commit1,nodelalloc wait,check,formattable /dev/block/by-name/nvdata /mnt/vendor/nvdata ext4 noatime,nosuid,nodev,noauto_da_alloc,commit1,nodelalloc wait,check,formattable /dev/block/by-name/nvcfg /mnt/vendor/nvcfg ext4 noatime,nosuid,nodev,noauto_da_alloc,commit1,nodelalloc wait,check,formattable/dev/block/by-name/persist /mnt/vendor/persist ext4 noatime,nosuid,nodev,noauto_da_alloc,commit1,nodelalloc wait,check,formattable/devices/platform/externdevice* auto auto defaults voldmanagedsdcard1:auto,encryptableuserdata/devices/platform/mt_usb* auto vfat defaults voldmanagedusbotg:auto/dev/block/by-name/frp /persistent emmc defaults defaults/dev/block/by-name/nvram /nvram emmc defaults defaults /dev/block/by-name/proinfo /proinfo emmc defaults defaults /dev/block/by-name/lk /bootloader emmc defaults defaults /dev/block/by-name/lk2 /bootloader2 emmc defaults defaults /dev/block/by-name/para /misc emmc defaults defaults/dev/block/by-name/boot /boot emmc defaults first_stage_mount,nofail,slotselect # 210 vendor/mediatek/proprietary/hardware/fstab/mt6765/fstab.in.mt6765 /dev/block/by-name/vbmeta_vendor /vbmeta_vendor emmc defaults first_stage_mount,nofail,slotselect /dev/block/by-name/vbmeta_system /vbmeta_system emmc defaults first_stage_mount,nofail,slotselect,avbvbmeta/dev/block/by-name/logo /logo emmc defaults defaults /dev/block/by-name/expdb /expdb emmc defaults defaults /dev/block/by-name/seccfg /seccfg emmc defaults defaults/dev/block/by-name/tee1 /tee1 emmc defaults defaults /dev/block/by-name/tee2 /tee2 emmc defaults defaults/dev/block/by-name/scp1 /scp1 emmc defaults defaults /dev/block/by-name/scp2 /scp2 emmc defaults defaults/dev/block/by-name/sspm_1 /sspm_1 emmc defaults defaults /dev/block/by-name/sspm_2 /sspm_2 emmc defaults defaults/dev/block/by-name/md1img /md1img emmc defaults defaults /dev/block/by-name/md1dsp /md1dsp emmc defaults defaults /dev/block/by-name/md1arm7 /md1arm7 emmc defaults defaults /dev/block/by-name/md3img /md3img emmc defaults defaults/dev/block/by-name/gz1 /gz1 emmc defaults defaults /dev/block/by-name/gz2 /gz2 emmc defaults defaults/dev/block/by-name/spmfw /spmfw emmc defaults defaults/dev/block/by-name/boot_para /boot_para emmc defaults defaults /dev/block/by-name/odmdtbo /odmdtbo emmc defaults defaults /dev/block/by-name/dtbo /dtbo emmc defaults defaults/dev/block/by-name/vbmeta /vbmeta emmc defaults defaults D50:/vendor/etc # 如上格式此文件可以解析如下三部分 那么我们在源代码是如何配置的呢MTK可以参考如下逻辑后文详细解读各大配置参数 1.3 FirstStageMount::DoCreateDevices //aosp/system/core/init/first_stage_mount.cpp bool FirstStageMount::DoCreateDevices() {if (!InitDevices()) return false;// Mount /metadata before creating logical partitions, since we need to// know whether a snapshot merge is in progress.auto metadata_partition std::find_if(fstab_.begin(), fstab_.end(), [](const auto entry) {//从fstab配置表中寻找/metadata分区的信息此分区很重要存储了一些元数据和秘钥相关的东西return entry.mount_point /metadata;});if (metadata_partition ! fstab_.end()) {//首先需要挂载/metadata分区因为它太重要了if (MountPartition(metadata_partition, true /* erase_same_mounts */)) {// Copies DSU AVB keys from the ramdisk to /metadata.// Must be done before the following TrySwitchSystemAsRoot().// Otherwise, ramdisk will be inaccessible after switching root.//它为什么重要就是因为拷贝AVB Key到这个目录详细的待后续研究CopyDsuAvbKeys();}}//创建逻辑分区if (!CreateLogicalPartitions()) return false;return true; } 流程1如上逻辑首先挂载了/metadata分区为什么要先挂载它 流程2/metadata分区挂载流程对应日志注意这里调用了metadata_partition函数传递了参数所以只挂载了一个分区 流程3创建逻辑分区那么何为逻辑分区从下面日志来看个人理解它类似与PC的C盘来区别于其他磁盘因此这里的逻辑分区通常为system/vendor几个目录 如上日志对应逻辑代码如下 1.4 FirstStageMount::DoFirstStageMount //aosp/system/core/init/first_stage_mount.cpp bool FirstStageMount::DoFirstStageMount() {if (!IsDmLinearEnabled() fstab_.empty()) {// Nothing to mount.LOG(INFO) First stage mount skipped (missing/incompatible/empty fstab in device tree);return true;}//挂载分区if (!MountPartitions()) return false; return true; } 这里的主要流程还是去调用MountPartitions()去挂载分区注意这里不像metadata哪里传递了参数因此这里是根据fstab表去挂载所有其他分区代码如下 2、fstab文件参数解读 3、fs_mgr挂载分区 接着init的FirstStageMount::MountPartition通过fstab表来挂载单个分区如下逻辑在对底层设备块相关初始化之后通过fs_mgr来进行单个分区的挂载。 //aosp/system/core/init/first_stage_mount.cpp bool FirstStageMount::MountPartition(const Fstab::iterator begin, bool erase_same_mounts, Fstab::iterator* end) {// Sets end to begin 1, so we can just return on failure below.if (end) {*end begin 1;}if (!fs_mgr_create_canonical_mount_point(begin-mount_point)) {return false;}//跟底层设备块有关系暂时没有深入研究if (begin-fs_mgr_flags.logical) {if (!fs_mgr_update_logical_partition((*begin))) {return false;}if (!block_dev_init_.InitDmDevice(begin-blk_device)) {return false;}}if (!SetUpDmVerity((*begin))) {PLOG(ERROR) Failed to setup verity for begin-mount_point ;return false;}//核心代码通过fs_mgr去进行挂载bool mounted (fs_mgr_do_mount_one(*begin) 0);// Try other mounts with the same mount point.Fstab::iterator current begin 1;for (; current ! fstab_.end() current-mount_point begin-mount_point; current) {if (!mounted) {// blk_device is already updated to /dev/dm-N by SetUpDmVerity() above.// Copy it from the begin iterator.current-blk_device begin-blk_device;mounted (fs_mgr_do_mount_one(*current) 0);}}if (erase_same_mounts) {current fstab_.erase(begin, current);}if (end) {*end current;}return mounted; } //aosp/system/core/fs_mgr/fs_mgr.cpp // wrapper to __mount() and expects a fully prepared fstab_rec, // unlike fs_mgr_do_mount which does more things with avb / verity etc. int fs_mgr_do_mount_one(const FstabEntry entry, const std::string alt_mount_point) {// First check the filesystem if requested.if (entry.fs_mgr_flags.wait !WaitForFile(entry.blk_device, 20s)) {LERROR Skipping mounting entry.blk_device ;}auto mount_point alt_mount_point.empty() ? entry.mount_point : alt_mount_point;//步骤1挂载前的准备工作其实就是解析fstab分区配置的各种参数int ret prepare_fs_for_mount(entry.blk_device, entry, mount_point);// Wiped case doesnt require to try __mount below.if (ret FS_STAT_INVALID_MAGIC) {return FS_MGR_DOMNT_FAILED;}//步骤2正式进行文件分区的挂载ret __mount(entry.blk_device, mount_point, entry);if (ret) {ret (errno EBUSY) ? FS_MGR_DOMNT_BUSY : FS_MGR_DOMNT_FAILED;}return ret; }如上代码进行总结如下 init最后通过libfs_mgr最后调用了fs_mgr.cpp来进行文件分区的挂载首先通过prepare_fs_for_mount来解析fstab里面配置的一系列参数最后通过__mount来进行文件分区的挂载 3.1 挂载前的准备工作prepare_fs_for_mount 总结如上代码逻辑主要做了如下几个步骤 tune_quotaEnable/disable quota support on the filesystem if neededresize_fs重置文件系统check_fs校验文件系统tune_reserved_sizeext4支持tune_encryptext4支持tune_verityext4支持tune_casefoldext4支持tune_metadata_csumext4支持 3.2 挂载文件分区流程__mount
http://www.dnsts.com.cn/news/201079.html

相关文章:

  • 棋牌类网站设计建设cms网站有哪些
  • 成都网站登记备案查询wordpress 自定义产品页面
  • 做教师知识网站有哪些内容智慧团建学生登录入口
  • 华为网站的建设目标织梦网站添加搜索功能
  • 上海网站建设工作室软件培训
  • 公司网站建设流媒体视频网站建设
  • 网站网站制作怎么样高效网站建设咨询
  • 模板网站建设开发dw个人网页设计
  • 网站的内容有哪些内容吗怎么制作网站记事本
  • 学生兼职做网站大良建站公司行业现状
  • 个人网站介绍源码中国基建人才培训网证书查询
  • 四川 优质高职建设网站建设汽车网站
  • 网站推广的软文工资卡app下载
  • 滕州盛扬网站建设推广邢台快用网络科技有限公司
  • 大型电子商务网站建设方案网站技术开发文档模板
  • 网站开发岗位简介homezz wordpress
  • 怎么做网站演示郑州网站排名哪家好
  • 大学生简历免费制作网站广西南宁建设银行最新招聘网站
  • 做网站建设业务员好吗个人简历范本
  • 做印尼购物网站如何发货浏览器下载大全免费下载
  • jeecg 做网站盐城网站推广
  • 课堂阵地建设网站软文代发布
  • 购物网站设计方案专业做外贸网站建设
  • 恶意推广网站做网站和淘宝美工 最低电脑
  • 网站怎么做优化百度能搜索到英文网站建设推广
  • 织梦cms网站更新wordpress建立数据库连接时出错
  • 珠宝网站建设的主要方式服装外贸流程
  • 网站开发是打代码吗免费代理加盟项目
  • 书店建设网站k大原画培训班官网
  • 网站seo关键词公司网页推广