Virtual File System
Rev.5を表示中。最新版はこちら。
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()でスラブアロケータから取得(キャッシュ名:filp)して初期化する。
表1 struct fileの主なフィールド
フィールド |
説明 |
---|---|
f_op |
ファイルを操作するハンドラへのポインタを持つstruct file_operationsへのポインタ |
f_pos |
ファイルのRead/Write位置。 |
f_mode |
ファイルのアクセスモード |
f_uid |
ファイルのUser ID |
f_gid |
ファイルのGroup ID |