:
:
OS: 6.0
: 4.4
: v2017.04
一、格式說明
以 的 系統為例。
我們看看根目錄下的 fstab. 文件。
/dev/.. /mnt/ vfat =:14,
1.1 src
表示 待掛載的設備節點路徑
1.2 mount point
表示 掛載點,即 被掛載的目錄
1.3 type
表示 所掛載磁盤的文件系統類型
1.4 mount flags
表示 指定所掛載的文件系統的一些參數,如下
async/sync : 設置是否為同步方式運行
auto/ : 當下載mount -a 的命令時,此文件系統是否被主動掛載。默認為auto
rw/ro : 是否以以只讀或者讀寫模式掛載
exec/ : 限制此文件系統內是否能夠進行”執行”的操作
user/ : 是否允許用戶使用mount命令掛載
suid/ : 是否允許SUID的存在
: 啟動文件系統支持磁盤配額模式
: 啟動文件系統對群組磁盤配額模式的支持
: 同時具有rw,suid,dev,exec,auto,,async等默認參數的設置
二、加載、解析、執行
2.1 從 init 開始
加載完后第一個執行的就是 init 進程安卓6.0系統文件詳細說明,init 進程會根據 init.rc 規則啟動進程或者服務。
對于我們 的板子:
我采用的是 工程
.///init.rc:9: /init.${ro.}.rc
.//init...emmc.rc:7: fstab.
這個 fstab. 實際上是 /fstab...emmc 的軟鏈接。
2.2
定義在 /core/init/.h
(, , 1, )
即會調用 (fstab.)
2.3
代碼在 /core/init/.c
/* * This might a , in which case it will * not . */
int (int nargs, char **args)
{
pid_t pid;
int ret = -1;
int = -1;
int ;
const char *prop;
fstab *fstab;
if (nargs != 2) {
-1;
}
/* * Call () to mount all . We fork(2) and * do the call in the child to to the main init * if goes wrong (crash or leak), and wait for * the child to in the . */
pid = fork();
if (pid > 0) {
/* . Wait for the child to */
int = ((pid, &, 0));
if ( < 0) {
/* error code. We will . */
(" rc=%d, errno=%d\n", , errno);
}
if (()) {
ret = ();
} else {
ret = -1;
}
} else if (pid == 0) {
/* child, call () */
(6); /* So we can see what () does */
fstab = (args[1]); //解析分區文件fstab
= (fstab);
(fstab);
if ( == -1) {
ERROR(" an error\n");
}
_exit();
} else {
/* fork , an error */
-1;
}
if (ret == ) {
("vold.", "");
} else if (ret == ) {
("ro..state", "");
("vold.", "");
} else if (ret == ) {
("ro..state", "");
/* If this is an , then * that . */
ger("", l);
} else if (ret == ) {
/* Setup a wipe via , and into */
ERROR(" , so data via .\n");
ret = ry();
/* If , there is no . */
} else if (ret > 0) {
ERROR(" error %d\n", ret);
}
/* else ... < 0: error */
ret;
}
我們看到安卓6.0系統文件詳細說明,首先會通過 讀取/解析
fstab文件 將其中的內容存在名為 fstab 的結構體中。
2.4
./.c
fstab->recs[cnt]. = (p, ,
&, NULL, 0);
fstab->recs[cnt]. = .;
fstab->recs[cnt]. = .;
fstab->recs[cnt]. = .;
fstab->recs[cnt].label = .label;
fstab->recs[cnt]. = .;
fstab->recs[cnt]. = .;
fstab->recs[cnt]. = .;
然后通過 對文件系統進行掛載。
2.5
其代碼在 ./core//.c 這里不再進一步分析。
參考文章