12章 VFS 1/9アップデート
詳細Linuxカーネル 12章 VFSを読む
LinuxはVFSを導入することで、 いろんなファイルシステムを扱うことを可能にしている。
共通ファイルモデルの役割
VFSは共通ファイルモデルに従っている。
共通ファイルモデルで
Linuxのカーネルは各ファイルシステム固有の関数を呼び出し、
ソフト・アプリ側に意識をさせない役割がある。
VFSが取り扱うシステムコール
12.6.1参照
ファイルコピーのプログラムcp()
を通してVFSシステムコールを確認する。
cpが以下のコードで実現できるらしい。(正常系のみ)
nf = open("/floppy/TEST", O_RDONLY, 0);
outf = open("/tmp/test", O_WRONLY | O_CREAT | O_TRUNC, 0600);
do {
len = read(inf, buf, 4096);
write(outf, buf, len);
} while (len);
close(outf);
close(inf);
open() システムコール
open()
の実体はdo_sys_open()
になる。
引数は以下の4つ。
dfd
:filename
:ファイルのパス名flags
:アクセスモードフラグmode
:パーミッションビット
ソースを追うと
builud_open_flags
でflags
とmode
でアクセスモード、フラグをopen_flag
に設定getname
でファイルのパス名を読み取りカーネルがユーザ空間のファイル名を読み取りを実施する。
具体的にはgetname_flags
で__getname
をコールしてkmemからファイルを展開する領域確保する。 そして__getname
で確保した領域に、stryncpy_from_user()
でユーザ空間のファイル名をカーネル空間にコピー。 もしも、ファイル名がEMBEDDED_NAME_MAX
より大きいと、PATH_MAX
で再度コピー。get_unused_fd_flags()
でfd(ファイルディスクリプタ)の空きを確保する。do_filp_opne()
でfile構造体を取得する。以下の順序にて設定
set_nameidata()
でdfd
とファイル名からnameidata
構造体を生成 ー>これを何に使うかはわからなん。path_openat()
がfile構造体を取得するメインの関数。get_empty_filp()
でからのfile構造体を取得。フラグ
open_flag
でfile構造体のファイルフラグを初期化。nameidata
構造体(nd)の初期化とファイル名からPathの検索を実施。 絶対パスの場合、dfd=AT_FDCWD
の場合を考えてる。 ここをもう少し読みたいが、まずはnameidata
構造体を理解すべきか。
fd_install
でflie構造体のポインタをfdに格納する。