Author: Younix

Platform: RK3399

OS: Android 6.0

Kernel: 4.4

Version: v2017.04

一、格式说明

以 RK3399 的 Android 系统为例。

我们看看根目录下的 fstab.rk30board 文件。

/dev/.. /mnt/internal_sd vfat defaults voldmanaged=internal_sd:14,nomulated

1.1 src

表示 待挂载的设备节点路径

1.2 mount point

表示 挂载点,即 被挂载的目录

1.3 filesystem type

表示 所挂载磁盘的文件系统类型

1.4 mount flags parameters

表示 指定所挂载的文件系统的一些参数,如下

async/sync : 设置是否为同步方式运行

auto/noauto : 当下载mount -a 的命令时,此文件系统是否被主动挂载。默认为auto

rw/ro : 是否以以只读或者读写模式挂载

exec/noexec : 限制此文件系统内是否能够进行”执行”的操作

user/nouser : 是否允许用户使用mount命令挂载

suid/nosuid : 是否允许SUID的存在

usrquota : 启动文件系统支持磁盘配额模式

grpquota : 启动文件系统对群组磁盘配额模式的支持

defaults : 同时具有rw,suid,dev,exec,auto,nouser,async等默认参数的设置

二、加载、解析、执行

2.1 从 init 开始

kernel 加载完后第一个执行的就是 init 进程,init 进程会根据 init.rc 规则启动进程或者服务。

对于我们 rk3399 的板子:

我采用的是 rk3399_mid 工程

./rk3399/rk3399_mid/init.rc:9:import /init.${ro.hardware}.rc

./common/init.rk30board.bootmode.emmc.rc:7: mount_all fstab.rk30board

这个 fstab.rk30board 实际上是 /fstab.rk30board.bootmode.emmc 的软链接。

2.2 mount_all

mount_all 定义在 system/core/init/keywords.h

KEYWORD(mount_all, COMMAND, 1, do_mount_all)

即会调用 do_mount_all(fstab.rk30board)

2.3 do_mount_all

代码在 system/core/init/builtins.c

/* * This function might request a reboot, in which case it will * not return. */

int do_mount_all(int nargs, char **args)

{

pid_t pid;

int ret = -1;

int child_ret = -1;

int status;

const char *prop;

struct fstab *fstab;

if (nargs != 2) {

return -1;

}

/* * Call fs_mgr_mount_all() to mount all filesystems. We fork(2) and * do the call in the child to provide protection to the main init * process if anything goes wrong (crash or memory leak), and wait for * the child to finish in the parent. */

pid = fork();

if (pid > 0) {

/* Parent. Wait for the child to return */

int wp_ret = TEMP_FAILURE_RETRY(waitpid(pid, &status, 0));

if (wp_ret < 0) {

/* Unexpected error code. We will continue anyway. */

NOTICE("waitpid failed rc=%d, errno=%d\n", wp_ret, errno);

}

if (WIFEXITED(status)) {

ret = WEXITSTATUS(status);

} else {

ret = -1;

}

} else if (pid == 0) {

/* child, call fs_mgr_mount_all() */

klog_set_level(6); /* So we can see what fs_mgr_mount_all() does */

fstab = fs_mgr_read_fstab(args[1]); //解析分区文件fstab

child_ret = fs_mgr_mount_all(fstab);

fs_mgr_free_fstab(fstab);

if (child_ret == -1) {

ERROR("fs_mgr_mount_all returned an error\n");

}

_exit(child_ret);

} else {

/* fork failed, return an error */

return -1;

}

if (ret == FS_MGR_MNTALL_DEV_NEEDS_ENCRYPTION) {

property_set("vold.decrypt", "trigger_encryption");

} else if (ret == FS_MGR_MNTALL_DEV_MIGHT_BE_ENCRYPTED) {

property_set("ro.crypto.state", "encrypted");

property_set("vold.decrypt", "trigger_default_encryption");

} else if (ret == FS_MGR_MNTALL_DEV_NOT_ENCRYPTED) {

property_set("ro.crypto.state", "unencrypted");

/* If fs_mgr determined this is an unencrypted device, then trigger * that action. */

action_for_each_trigger("nonencrypted", action_add_queue_tail);

} else if (ret == FS_MGR_MNTALL_DEV_NEEDS_RECOVERY) {

/* Setup a wipe via recovery, and reboot into recovery */

ERROR("fs_mgr_mount_all suggested recovery, so wiping data via recovery.\n");

ret = wipe_data_via_recovery();

/* If reboot worked, there is no return. */

} else if (ret > 0) {

ERROR("fs_mgr_mount_all returned unexpected error %d\n", ret);

}

/* else ... < 0: error */

return ret;

}

我们看到,首先会通过 fs_mgr_read_fstab 读取/解析

fstab文件 将其中的内容存在名为 fstab 的结构体中。

2.4 fs_mgr_read_fstab

./fs_mgr_fstab.c

fstab->recs[cnt].fs_mgr_flags = parse_flags(p, fs_mgr_flags,

&flag_vals, NULL, 0);

fstab->recs[cnt].key_loc = flag_vals.key_loc;

fstab->recs[cnt].verity_loc = flag_vals.verity_loc;

fstab->recs[cnt].length = flag_vals.part_length;

fstab->recs[cnt].label = flag_vals.label;

fstab->recs[cnt].partnum = flag_vals.partnum;

fstab->recs[cnt].swap_prio = flag_vals.swap_prio;

fstab->recs[cnt].zram_size = flag_vals.zram_size;

然后通过 fs_mgr_mount_all 对文件系统进行挂载。

2.5 fs_mgr_mount_all

其代码在 .system/core/fs_mgr/fs_mgr.c 这里不再进一步分析。

参考文章

android fstab文件,[Android6.0][RK3399] fstab 文件格式说明和解析代码跟踪相关推荐

  1. [Android6.0][RK3399] PCIe 转 SATA 调试步骤

    Author: Younix Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017.04 一PCI 设备调试手段 busybox ls ...

  2. [Android6.0][RK3399] PCIe 接口 4G模块 EC20 调试记录

    原址 Platform: RK3399  OS: Android 6.0  Kernel: 4.4  Version: v2017.04  4G Module: EC20-CE 一基本概念 USB 部 ...

  3. Android教程 -05 Android6.0权限的管理

    视频为本篇博客知识的讲解,建议采用超清模式观看, 欢迎点击订阅我的优酷 height="498" width="510" src="http://pl ...

  4. android+桌面歌词,Android6.0系统适配桌面歌词效果

    在360手机助手及各家的音乐播放器软件上,都使用了桌面浮动窗功能,桌面歌词都是在音乐客户端显示在前台时隐藏,在用户把软件切换到后台后显示出来,此效果在Android 6.0以前,大部分都是使用系统的A ...

  5. android闪光灯参数,android6.0中的闪光灯

    在android6.0中,加入了Camera相关新特性,在做开发过程中,遇到闪光灯的操作,如下: 1.导入包: import android.hardware.camera2.CameraManage ...

  6. 这可能是最精简的Android6.0运行时权限处理,百行代码的工具类,支持Rationale,附:各种权限详细处理

    0x00:前言 对于Android6.0运行时权限的处理方式网上有很多,包括注解,RxJava等等.一直没有正面提到我关心的问题–如果我不在Activity或者Fragment里面,需要运行时权限该怎 ...

  7. android 6.0 电池曲线,Android6.0 RK3399 电池系统(一)BQ25700 IC 驱动分析 · Younix’s Studio...

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? Platform: RK3399 OS: Android 6.0 Kernel: 4.4 Version: v2017. ...

  8. [Android6.0][RK3399] 双屏异显代码实现流程分析(二)

    Patch Code dtsi rk3399-androiddtsi rk3399-evb-rev3-androiddts lcdc 控制器 rk322x_lcdcc rk_fbc timing 初始 ...

  9. [Android6.0][RK3399] 双屏异显代码实现流程分析(二)【转】

    本文转载自:http://blog.csdn.net/dearsq/article/details/55050125 Patch Code dtsi rk3399-androiddtsi rk3399 ...

最新文章

  1. 使用squid在阿里云服务器(centos7)上搭建自己的代理服务器
  2. mac java+selenium 实现UI自动化1_琉璃
  3. 关于realarm S5P4418的u-boot显示内存大小问题解决方法
  4. from表单提交和JSON区别
  5. 携程元旦出游数据:冰雪运动热度升级 张家口酒店一房难求
  6. nginx编译包含perl模块
  7. iOS开发之cocoapods报错问题You need at least git version 1.8.5 to use CocoaPods
  8. KNN--K近邻算法
  9. Apache Commons Net 实现 FTP 上传/下载/删除/同步
  10. grasshopper python_【转】精华教学 | GH_Cpython——将原生的 Python 与机器学习框架引入Grasshopper...
  11. 按要求写mysql语句_根据要求写SQL 语句
  12. 阴阳师2017 7服务器维护,《阴阳师》手游4月17日维护更新公告
  13. 推荐一些非常好用的网盘搜索神器
  14. 【LeetCode】377. 组合总和 Ⅳ(错题2刷)
  15. Python手写汉字(中文)识别~单字/多字推荐模式
  16. 多年经验的程序员迷失了自己,该怎么办
  17. matlab 中的del2函数
  18. (PC+WAP)美女图片大全类网站pbootcms模板 明星写真网站源码下载
  19. iOS 设计主题(迟来的总结)
  20. ggplot2-局部整体型图表

热门文章

  1. 网站SEO,HTTP请求的关键数字----6
  2. Windows给力!可以扔掉Linux虚拟机了!
  3. 【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
  4. 华为云之RDS云数据库的管理使用与快速入门
  5. CentOS 7 安装 Tengine
  6. tengine php环境,基于TENGINE部署LNMP环境
  7. 200万奖金广聚天下算法英雄,第二届广州·琶洲算法大赛要来了!
  8. 某阿里程序员女友吐槽男友整天消失不见!早上发消息凌晨才回复!
  9. Silverlight 2.0中文學習資源集萃
  10. osgEarth的Earth格式文件说明