ファイルの読み込み

フィアルのread/write処理は、ローカルディスク上のファイルシステムであっても、ページキャッシュ経由でアクセスする。(v2.4でページキャッシュに統合された)

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_nolock関数)) {
                  フリーページを確保(page_cache_alloc関数)
                  フリーページをキャッシュに登録(__add_to_page_cache関数)
                  ファイルのiノードのreadpageオペレーションを呼び出す.
                        (ext2の場合は、block_read_full_page関数)
             }
             先読み要求を出しておく(generic_file_readahead関数)
             ヒットしたページへのI/O完了を待つ(wait_on_page関数)
             ページの解放(page_cache_release関数)
        }
img48.gif

do_generic_read_file関数が呼び出す iノードのreadpageオペレーション(アドレススペース構造体で管理)は、ローカルディスク上のファイルシステム(ext2のような)では、下記block_read_full_page関数が登録されている。block_read_full_page関数は、ファイルのiノードからI/Oを行うべきディスク上の物理ブロック番号を求め、I/Oを発行する。(ページキャッシュの章で説明済)物理ブロック番号を求める処理はext2ファイルシステムにおいてはext2_getblock関数が利用される。

   block_read_full_page(読み込むページ, getblock関数)
        ページにまだバッファヘッドが割り付けられていなければ、
    バッファヘッドを確保しページとリンク(create_empty_buffer関数)
        do {
            if(バッファが有効) continue;
            if(バッファがブロックと対応付けられていない) {
                getblock関数(ext2の場合は、ext2_getblock関数)を利用し、
                  inodeとファイルオフセットからブロック番号を求める。
                ブロックの割り当てられてない領域なら、バッファの0クリア。
            }
           バッファヘッドを初期化
             (I/O完了コールバック関数としては、end_buffer_io_asyncを登録)
        } while(バッファのある間)
        I/O要求の発行(ll_rw_block関数)

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1