2011年03月01日 情報科学類 オペレーティングシステム II 筑波大学 システム情報工学研究科 コンピュータサイエンス専攻, 電子・情報工学系 新城 靖 <yas@is.tsukuba.ac.jp>
このページは、次の URL にあります。
http://www.coins.tsukuba.ac.jp/~yas/coins/os2-2010/2011-03-01
あるいは、次のページから手繰っていくこともできます。
http://www.coins.tsukuba.ac.jp/~yas/
http://www.cs.tsukuba.ac.jp/~yas/
試験について
解決策:
図? ファイル・システム実現に置ける層構造
ディスク・キャッシュの層もある。解決策
$ ls -l /bin/{gunzip,gzip,zcat}
-rwxr-xr-x 3 root root 62872 Jan 21 2010 /bin/gunzip
-rwxr-xr-x 3 root root 62872 Jan 21 2010 /bin/gzip
-rwxr-xr-x 3 root root 62872 Jan 21 2010 /bin/zcat
$ ls -li /bin/{gunzip,gzip,zcat}
5636134 -rwxr-xr-x 3 root root 62872 Jan 21 2010 /bin/gunzip
5636134 -rwxr-xr-x 3 root root 62872 Jan 21 2010 /bin/gzip
5636134 -rwxr-xr-x 3 root root 62872 Jan 21 2010 /bin/zcat
$
$ cat /etc/fstab
LABEL=/ / ext3 defaults 1 1
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
LABEL=SWAP-sda3 swap swap defaults 0 0
130.158.86.2:/vol/vol1/home /home nfs rw,hard,bg,nfsvers=3,intr 0 0
130.158.86.2:/vol/vol5/local3 /usr/local3 nfs rw,hard,bg,nfsvers=3,intr 0 0
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 222G 13G 198G 6% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
130.158.86.2:/vol/vol1/home
4.0T 1.5T 2.5T 38% /home
130.158.86.2:/vol/vol5/local3
80G 4.9G 76G 7% /usr/local3
$
include/linux/fs.h 1318: struct super_block { 1319: struct list_head s_list; /* Keep this first */ ... 1321: unsigned char s_dirt; ... 1324: loff_t s_maxbytes; /* Max file size */ ... 1325: struct file_system_type *s_type; 1326: const struct super_operations *s_op; ... 1332: struct dentry *s_root; ... 1342: struct list_head s_inodes; /* all inodes */ ... 1347: struct list_head s_files; ... 1350: struct list_head s_dentry_lru; /* unused dentry lru */ 1351: int s_nr_dentry_unused; /* # of dentry on lru */ 1352: 1364: void *s_fs_info; /* Filesystem private info */ 1388: };
struct super_block *sh; ... sh->s_op->write_super(sb);s_op には、次のような手続きがある。各ファイルシステム (ext3,nfs,tmpfs,...) ごとに、手続きの実体は異なるが、インタフェースは同 じ。
1560: struct super_operations { 1561: struct inode *(*alloc_inode)(struct super_block *sb); 1562: void (*destroy_inode)(struct inode *); 1563: 1564: void (*dirty_inode) (struct inode *); 1565: int (*write_inode) (struct inode *, struct writeback_control *wbc); 1566: int (*drop_inode) (struct inode *); 1567: void (*evict_inode) (struct inode *); 1568: void (*put_super) (struct super_block *); 1569: void (*write_super) (struct super_block *); 1570: int (*sync_fs)(struct super_block *sb, int wait); 1571: int (*freeze_fs) (struct super_block *); 1572: int (*unfreeze_fs) (struct super_block *); 1573: int (*statfs) (struct dentry *, struct kstatfs *); 1574: int (*remount_fs) (struct super_block *, int *, char *); 1575: void (*umount_begin) (struct super_block *); 1576: 1577: int (*show_options)(struct seq_file *, struct vfsmount *); 1578: int (*show_stats)(struct seq_file *, struct vfsmount *); 1579: #ifdef CONFIG_QUOTA 1580: ssize_t (*quota_read)(struct super_block *, int, char *, size_t, loff_t); 1581: ssize_t (*quota_write)(struct super_block *, int, const char *, size_t, loff_t); 1582: #endif 1583: int (*bdev_try_to_free_page)(struct super_block*, struct page*, gfp_t); 1584: };
include/linux/fs.h 725: struct inode { 726: struct hlist_node i_hash; 727: struct list_head i_list; /* backing dev IO list */ ... 729: struct list_head i_dentry; 730: unsigned long i_ino; 731: atomic_t i_count; 732: unsigned int i_nlink; 733: uid_t i_uid; 734: gid_t i_gid; 735: dev_t i_rdev; 736: unsigned int i_blkbits; 737: u64 i_version; 738: loff_t i_size; ... 742: struct timespec i_atime; 743: struct timespec i_mtime; 744: struct timespec i_ctime; 745: blkcnt_t i_blocks; 746: unsigned short i_bytes; 747: umode_t i_mode; ... 751: const struct inode_operations *i_op; 752: const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ 753: struct super_block *i_sb; ... 774: unsigned long i_state; ... 788: };
struct inode *inode; ... inode->i_op->truncate(inode);i_op には、次のような手続きがある。各ファイルシステム (ext3,nfs,tmpfs,...) ごとに、手続きの実体は異なるが、インタフェースは同じ。
1516: struct inode_operations { 1517: int (*create) (struct inode *,struct dentry *,int, struct nameidata *); 1518: struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *); 1519: int (*link) (struct dentry *,struct inode *,struct dentry *); 1520: int (*unlink) (struct inode *,struct dentry *); 1521: int (*symlink) (struct inode *,struct dentry *,const char *); 1522: int (*mkdir) (struct inode *,struct dentry *,int); 1523: int (*rmdir) (struct inode *,struct dentry *); 1524: int (*mknod) (struct inode *,struct dentry *,int,dev_t); 1525: int (*rename) (struct inode *, struct dentry *, 1526: struct inode *, struct dentry *); 1527: int (*readlink) (struct dentry *, char __user *,int); 1528: void * (*follow_link) (struct dentry *, struct nameidata *); 1529: void (*put_link) (struct dentry *, struct nameidata *, void *); 1530: void (*truncate) (struct inode *); 1531: int (*permission) (struct inode *, int); 1532: int (*check_acl)(struct inode *, int); 1533: int (*setattr) (struct dentry *, struct iattr *); 1534: int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); 1535: int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); 1536: ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); 1537: ssize_t (*listxattr) (struct dentry *, char *, size_t); 1538: int (*removexattr) (struct dentry *, const char *); 1539: void (*truncate_range)(struct inode *, loff_t, loff_t); 1540: long (*fallocate)(struct inode *inode, int mode, loff_t offset, 1541: loff_t len); 1542: int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start, 1543: u64 len); 1544: };
include/linux/dcache.h 89: struct dentry { 90: atomic_t d_count; 91: unsigned int d_flags; /* protected by d_lock */ 92: spinlock_t d_lock; /* per dentry lock */ 93: int d_mounted; 94: struct inode *d_inode; /* Where the name belongs to - NULL is 95: * negative */ ... 100: struct hlist_node d_hash; /* lookup hash list */ 101: struct dentry *d_parent; /* parent directory */ 102: struct qstr d_name; 103: 104: struct list_head d_lru; /* LRU list */ ... 109: struct list_head d_child; /* child of parent list */ ... 112: struct list_head d_subdirs; /* our children */ 113: struct list_head d_alias; /* inode alias list */ 114: unsigned long d_time; /* used by d_revalidate */ 115: const struct dentry_operations *d_op; 116: struct super_block *d_sb; /* The root of the dentry tree */ 117: void *d_fsdata; /* fs-specific data */ 118: 119: unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */ 120: };
include/linux/dcache.h 134: struct dentry_operations { 135: int (*d_revalidate)(struct dentry *, struct nameidata *); 136: int (*d_hash) (struct dentry *, struct qstr *); 137: int (*d_compare) (struct dentry *, struct qstr *, struct qstr *); 138: int (*d_delete)(struct dentry *); 139: void (*d_release)(struct dentry *); 140: void (*d_iput)(struct dentry *, struct inode *); 141: char *(*d_dname)(struct dentry *, char *, int); 142: };
include/linux/fs.h 909: struct file { ... 915: struct list_head fu_list; ... 918: struct path f_path; 919: #define f_dentry f_path.dentry 920: #define f_vfsmnt f_path.mnt 921: const struct file_operations *f_op; ... 926: atomic_long_t f_count; 927: unsigned int f_flags; 928: fmode_t f_mode; 929: loff_t f_pos; 930: struct fown_struct f_owner; 931: const struct cred *f_cred; 932: struct file_ra_state f_ra; ... 939: void *private_data; ... 945: struct address_space *f_mapping; ... 949: };
1488: struct file_operations { 1489: struct module *owner; 1490: loff_t (*llseek) (struct file *, loff_t, int); 1491: ssize_t (*read) (struct file *, char __user *, size_t, loff_t *); 1492: ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); 1493: ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 1494: ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t); 1495: int (*readdir) (struct file *, void *, filldir_t); 1496: unsigned int (*poll) (struct file *, struct poll_table_struct *); 1497: long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long); 1498: long (*compat_ioctl) (struct file *, unsigned int, unsigned long); 1499: int (*mmap) (struct file *, struct vm_area_struct *); 1500: int (*open) (struct inode *, struct file *); 1501: int (*flush) (struct file *, fl_owner_t id); 1502: int (*release) (struct inode *, struct file *); 1503: int (*fsync) (struct file *, int datasync); 1504: int (*aio_fsync) (struct kiocb *, int datasync); 1505: int (*fasync) (int, struct file *, int); 1506: int (*lock) (struct file *, int, struct file_lock *); 1507: ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); 1508: unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); 1509: int (*check_flags)(int); 1510: int (*flock) (struct file *, int, struct file_lock *); 1511: ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int); 1512: ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int); 1513: int (*setlease)(struct file *, long, struct file_lock **); 1514: };主な手続きの意味
p->files->fd_array[fd]
の struct file を表
す。
include/linux/fdtable.h 44: struct files_struct { ... 58: struct file * fd_array[NR_OPEN_DEFAULT]; 59: }; include/linux/sched.h 1163: struct task_struct { ... 1319: struct files_struct *files; ... 1497: };
fs/stat.c 151: SYSCALL_DEFINE2(stat, const char __user *, filename, 152: struct __old_kernel_stat __user *, statbuf) 153: { 154: struct kstat stat; 155: int error; 156: 157: error = vfs_stat(filename, &stat); 158: if (error) 159: return error; 160: 161: return cp_old_stat(&stat, statbuf); 162: }
95: int vfs_stat(const char __user *name, struct kstat *stat) 96: { 97: return vfs_fstatat(AT_FDCWD, name, stat, 0); 98: } 71: int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat, 72: int flag) 73: { 74: struct path path; 75: int error = -EINVAL; 76: int lookup_flags = 0; ... 83: 84: error = user_path_at(dfd, filename, lookup_flags, &path); 85: if (error) 86: goto out; 87: 88: error = vfs_getattr(path.mnt, path.dentry, stat); 89: path_put(&path); 90: out: 91: return error; 92: }
40: int vfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) 41: { 42: struct inode *inode = dentry->d_inode; ... 49: if (inode->i_op->getattr) 50: return inode->i_op->getattr(mnt, dentry, stat); 51: 52: generic_fillattr(inode, stat); 53: return 0; 54: }