タダノキロク

日々の考えたことの記録 主に無駄なこと

12章 VFS 1/9アップデート

詳細Linuxカーネル 12章 VFSを読む

LinuxVFSを導入することで、 いろんなファイルシステムを扱うことを可能にしている。

共通ファイルモデルの役割

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_flagsflagsmodeでアクセスモード、フラグを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に格納する。