file オブジェクトは Linux や POSIX 系のファイル関数で扱うファイルを抽象化したものです。
プロセスが開くファイルの抽象化であり、ファイル記述子をまとめたテーブルである fdtable のエントリーになります。
// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/fdtable.h
26 struct fdtable {
27 unsigned int max_fds;
28 struct file __rcu **fd; /* current fd array */
29 unsigned long *close_on_exec;
30 unsigned long *open_fds;
31 unsigned long *full_fds_bits;
32 struct rcu_head rcu;
33 };
//割愛
45 /*
46 * Open file table structure
47 */
48 struct files_struct {
49 /*
50 * read mostly part
51 */
52 atomic_t count;
53 bool resize_in_progress;
54 wait_queue_head_t resize_wait;
55
56 struct fdtable __rcu *fdt;
57 struct fdtable fdtab;
58 /*
59 * written part on a separate cache line in SMP
60 */
61 spinlock_t file_lock ____cacheline_aligned_in_smp;
62 unsigned int next_fd;
63 unsigned long close_on_exec_init[1];
64 unsigned long open_fds_init[1];
65 unsigned long full_fds_bits_init[1];
66 struct file __rcu * fd_array[NR_OPEN_DEFAULT];
67 };
68file オブジェクトの宣言は以下のようになります。
// /usr/src/linux-headers-4.18.16-041816-generic/include/linux/fs.h
859 struct file {
860 union {
861 struct llist_node fu_llist;
862 struct rcu_head fu_rcuhead;
863 } f_u;
864 struct path f_path;
865 struct inode *f_inode; /* cached value */
866 const struct file_operations *f_op;
867
868 /*
869 * Protects f_ep_links, f_flags.
870 * Must not be taken from IRQ context.
871 */
872 spinlock_t f_lock;
873 enum rw_hint f_write_hint;
874 atomic_long_t f_count;
875 unsigned int f_flags;
876 fmode_t f_mode;
877 struct mutex f_pos_lock;
878 loff_t f_pos;
879 struct fown_struct f_owner;
880 const struct cred *f_cred;
881 struct file_ra_state f_ra;
882
883 u64 f_version;
884 #ifdef CONFIG_SECURITY
885 void *f_security;
886 #endif
887 /* needed for tty driver, and maybe others */
888 void *private_data;
889
890 #ifdef CONFIG_EPOLL
891 /* Used by fs/eventpoll.c to link all the hooks to this file */
892 struct list_head f_ep_links;
893 struct list_head f_tfile_llink;
894 #endif /* #ifdef CONFIG_EPOLL */
895 struct address_space *f_mapping;
896 errseq_t f_wb_err;
897 } __randomize_layout
898 __attribute__((aligned(4))); /* lest something weird decides that 2 is OK */file オブジェクトの操作には file_operations オブジェクトに宣言された関数ポインターを使います。
1713 struct file_operations {
1714 struct module *owner;
1715 loff_t (*llseek) (struct file *, loff_t, int);
1716 ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
1717 ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
1718 ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
1719 ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
1720 int (*iterate) (struct file *, struct dir_context *);
1721 int (*iterate_shared) (struct file *, struct dir_context *);
1722 __poll_t (*poll) (struct file *, struct poll_table_struct *);
1723 long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
1724 long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
1725 int (*mmap) (struct file *, struct vm_area_struct *);
1726 unsigned long mmap_supported_flags;
1727 int (*open) (struct inode *, struct file *);
1728 int (*flush) (struct file *, fl_owner_t id);
1729 int (*release) (struct inode *, struct file *);
1730 int (*fsync) (struct file *, loff_t, loff_t, int datasync);
1731 int (*fasync) (int, struct file *, int);
1732 int (*lock) (struct file *, int, struct file_lock *);
1733 ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
1734 unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned
1735 int (*check_flags)(int);
1736 int (*flock) (struct file *, int, struct file_lock *);
1737 ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsig
1738 ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsign
1739 int (*setlease)(struct file *, long, struct file_lock **, void **);
1740 long (*fallocate)(struct file *file, int mode, loff_t offset,
1741 loff_t len);
1742 void (*show_fdinfo)(struct seq_file *m, struct file *f);
1743 #ifndef CONFIG_MMU
1744 unsigned (*mmap_capabilities)(struct file *);
1745 #endif
1746 ssize_t (*copy_file_range)(struct file *, loff_t, struct file *,
1747 loff_t, size_t, unsigned int);
1748 int (*clone_file_range)(struct file *, loff_t, struct file *, loff_t,
1749 u64);
1750 ssize_t (*dedupe_file_range)(struct file *, u64, u64, struct file *,
1751 u64);
1752 } __randomize_layout;この中には mmap 関数も含まれています。
1713 struct file_operations {
1725 int (*mmap) (struct file *, struct vm_area_struct *);
1752 } __randomize_layout;この mmap 関数はカーネル側(デバイスドライバー) の処理を担当しているので mmap システムコールの宣言とは随分違いますね。
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);まあ file_operations の中の mmap は(ブロック)デバイス空間とユーザー空間のマッピングとなりますんで、ファイル記述子が呼び出しに必要となっています。
さらに引数の vm_area_struct へのポインターはどの仮想アドレスにマップできるかを指定させてくれます。
Copyright 2018-2019, by Masaki Komatsu