「ファイルからデータを読み込み」の場合~
例えば以下のCコードで、
read? システムコールを呼び出した場合の
vfsの動作について簡単に示します。~
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
int main(void)
{
int fd;
char vm[4096];
memset(vm, 0, 4096);
if *1 < 0) return errno;
if *2 < 0) return errno;
printf("%s", vm);
close(fd);
return 0;
}
このサンプルで、ファイル操作は
open?,
read?,
close?である。アプリケーションは、どのファイルシステム上に存在するファイルかまったく気にしなくて良い。
ext3上のファイルだったり、
xfs上のファイルだったりはvfsが解決する。~
mini詳解~
Q:
vfsはどうやって、アクセス先のファイルシステムを特定するのか?~
A:例えばreadの場合は以下の動作で各ファイルシステムに振り分ける。~
1.マウント時に各ファイルシステムはジャンプテーブルを用意します。
2.対象ファイルディスクリプターよりfile構造体を得る。~
(fget_light関数→fcheck_filesマクロでtask_structのfilesを参照する)~
(task_structはkernelの重要な動作を成す核なので、ここでは割愛します。)~
(kernelの動きについては。。後で参考になるURL貼っておきます。[7/4])~
3.file->f_op->read が対象ファイルシステムのread登録関数でファイルシステム毎の処理を行う。~
各ファイルシステムは、各ファイルシステムのルールに則り、ディスクアクセス等を行い、ユーザが要求した操作を実現するのが目的である。~
ファイルアクセス操作の流れ~
1.ユーザがある部分のデータを
read?する~
2.
vfsが
ext3に
read?するよう指示を出す~
3.
ext3はディスクアクセスをし、
read?したデータを
vfsに返す~
4.
vfsはユーザに
read?したデータ返す~
5.ユーザが受け取る。~
イメージは以下の図を参照~
後はアセンブラのコードまで行って、実際の読み込みが行われます。~