Jimmy Chen

A Programmer

(原创)从代码分析Android分区挂载过程

  本来想直接分析Android磁盘加密部分的代码的。但是看了下代码,还是先认真看看磁盘挂载部分的代码吧,本文以Google Pixel + 8.1.0作为实例分析。

分区挂载入口:init

  init进程是Android的第一个进程,磁盘挂载就是通过它来实现的。init进程主要是通过分析各种.rc脚本来实现对应的动作。Pixel挂载过程使用的.rc文件在device/google/marlin/init.common.rc文件

可以看到init初始化设备过程中,共调用了两次mount_all过程,使用的都是同一个fstab文件。对于Pixel,对应的文件路径就是/vendor/etc/fstab.sailfish,文件的内容如下,在分析的时候我们使用userdata这一栏作为例子来进行分析:

  在init.rc文件中使用mount_all动作,最后是会调用到do_mount_all函数的。所以下面我们就直接从这个函数开始分析。

do_mount_all开始分析

  do_mount_all函数定义在system/core/init/builtins.cpp中,源码如下:

do_mount_all –> mount_fstab

  过程在上面的注释中已经解析得很清楚了,首先会读取并解析fstab.sailfish文件的内容并填充到fstab结构体中,然后在调用fs_mgr_mount_all进行实际mount

其中对fstab.sailfish文件解析得过程没什么好解释的,主要也就是逐行读取文件内容,然后解析填充结构体就可以了。需要注意的是fstab结构体中的flags字段对应关系,后面有可能会用到,这里我将他们截取出来列在下面

接下来继续看另一个函数

mount_fstab –> fs_mgr_mount_all

fs_mgr_mount_all –> mount_with_alternatives

最后我们再看看prepare_fs_for_mount函数

mount_with_alternatives –> prepare_fs_for_mount

分区设置的内容大概就到这里了,后面的加密部分,会在下一篇再做分析。

  1. U影动说道:

    你好,
    知道quota的配额限制在哪儿设置的吗?谢谢

    1. jimmychen说道:

      文章最后到prepare_fs_for_mount之后会调用tune_quota函数,应该就是设置quota限额的,如果说是具体配额大小怎么设置的话,这个就没有研究过。希望能帮到你

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注