Linux Kernel(2.6)の実装に関するメモ書き

Virtual File System


Rev.6を表示中。最新版はこちら

1. 概要

sys_open,sys_readなどのシステムコールのエントリルーチンと実際のファイルシステムの間に入るレイヤ。struct fileのf_opに登録されている処理を呼び出すことで実際のファイルシステムへ処理を渡す。

2. Read処理

read()システムコールのエントリルーチンはsys_read()。sys_read()は渡されたfd(ファイルディスクリプタ)に対応するstruct fileを取得して、VFSのRead処理(vfs_read())を呼び出す。

vfs_read()はパーミッションのチェックなどを行った後、file->f_opに登録されているファイルシステムのReadルーチンを呼び出してファイルシステムに処理をさせる。

sys_read()処理の概要

sys_read(unsigned int fd, char __user * buf, size_t count)
{
    /* ファイルディスクリプタに対応するstruct fileを取得 */
    file = fget_light(fd, &fput_needed);
    if (file) {
        loff_t pos = file_pos_read(file);
        /* Virtual File SystemのRead処理へ */
        ret = vfs_read(file, buf, count, &pos);
        file_pos_write(file, pos);
        fput_light(file, fput_needed);
    }

    return ret;
}

vfs_read()の処理概要

vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)
{
    ret = rw_verify_area(READ, file, pos, count);
    if (ret >= 0) {
        count = ret;
        ret = security_file_permission (file, MAY_READ);
        if (!ret) {
            /* fileが存在するファイルシステムのRead処理の呼び出し */
            if (file->f_op->read)
                ret = file->f_op->read(file, buf, count, pos);
            else
                ret = do_sync_read(file, buf, count, pos);
            if (ret > 0) {
                fsnotify_access(file->f_dentry);
                current->rchar += ret;
            }
            current->syscr++;
        }
    }
    return ret;
}


3. 関連データ

3.1 struct file

open済みのファイルを管理する構造体。ファイルopen時にdo_filp_open()により確保される。

新しいstruct fileを取得するにはget_empty_filp()を使用する。get_empty_filp()はスラブアロケータからstruct fileを取得(キャッシュ名:filp)して初期化する。

表1 struct fileの主なフィールド

フィールド
説明
f_op
ファイルを操作するハンドラへのポインタを持つstruct file_operationsへのポインタ
f_pos
ファイルのRead/Write位置。
f_mode
ファイルのアクセスモード
f_uid
ファイルのUser ID
f_gid
ファイルのGroup ID



最終更新 2006/10/04 21:49:23 - kztomita
(2006/09/26 20:39:20 作成)


リンク
最近更新したページ
検索