ファイルの読み込み

readシステムコールはローカルディスク上のファイルシステムであっても、generic_file_read関数を利用し、ページキャッシュ経由でアクセスする流儀になっている。

readシステムコールの入口は vfs sys_read関数である。この関数では殆どなにも処理を行っておらず、ファイルディスクリプタに対応したファイル構造体を見つけたあと、即ファイル構造体に登録されているreadオペレーションを呼び出す。

ext2ファイルシステム上の通常ファイルの場合は、汎用ルーチンgeneric_file_read関数が登録されている。ext2ファイルシステム上のディレクトリの場合は、EISDIRエラーを返す関数ext2_dir_read関数が登録されている。

generic_file_read関数はバッファへの書き込みが可能か否かのチェックをした後、do_generic_read_file関数を呼び出す。

   do_generic_file_read(ファイル構造体、バッファ, ファイルオフセット)
        for(要求サイズが満たされるまで) {
             if(ページキャッシュ上にない?(__find_page関数)) {
                  フリーページを確保(__get_free_page関数)
                  フリーページをキャッシュに登録(add_to_page_cache関数)
                  ファイルのiノードのreadpageオペレーションを呼び出す
             }
             if(ページキャッシュの内容が有効か、または丁度I/O中なら){
                  先読み要求を出しておく(generic_file_readahead関数)
             }
             ヒットしたページへのI/O完了を待つ(wait_on_page関数)
             ページの解放(release_page関数)
        }

do_generic_read_file関数が呼び出す iノードのreadpageオペレーションは、ローカルディスク上のファイルシステム(ext2のような)では、下記generic_readpage関数が登録されている。generic_readpage関数は、ファイルのiノードからI/Oを行うべきディスク上の物理ブロック番号を求め、brw_page関数(先に説明)を呼び出す。物理ブロック番号を求める処理はファイルiノードのbmapオペレーションを呼び出すことにより実現している。ext2ファイルシステムでは、先に説明した ext2_bmap関数が呼び出される。

   generic_readpage(ファイル構造体、ページ構造体)
        ページ構造体にI/O中ロックのフラグを立てる。
        ページ構造体にI/O中ロック解除時の自動ページ解放要求のフラグを立てる
        while(ページをブロックサイズに分解して)  {
             iノードのbmapオペレーションでブロック番号を求める
        }
        求めた全てのブロックに対しI/O要求を出す(brw_page関数)

(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1