linux学習ノート--文字デバイス駆動に関するデータ構造
文字設備に関するいくつかのデータ構造は主にstruct cdev、struct file_operations、struct inode struct file;
1.struct cdev 変数は、ケネルに代表される文字デバイス、すなわちKernelのいずれかの文字デバイスに対応して、デバイス駆動に関する情報(主にデバイス番号とデバイス実行可能な動作を含む)を記録するためのstruct cdevがあります.この構造体の定義は以下の通りです.
1.struct cdev 変数は、ケネルに代表される文字デバイス、すなわちKernelのいずれかの文字デバイスに対応して、デバイス駆動に関する情報(主にデバイス番号とデバイス実行可能な動作を含む)を記録するためのstruct cdevがあります.この構造体の定義は以下の通りです.
struct cdev{
struct kobject kobject;
struct module * owner;
const struct file_operations * ops;
struct list_head list;
dev_t dev;
unsigned int conut;
};
2.struct file_operationsは、デバイスドライバとkenelとの間のインターフェースを定義し、Kernelは、構造体に定義された関数ポインタが指すファイル操作関数によって実際のハードウェアを操作し、異なるハードウェアデバイスに対して異なる読み書き動作を行うことができ、この構造体に定義された関数ポインタによって達成される.この構造体の定義は以下の通りである.struct file_operations {
struct module *owner;
loff_t(*llseek) (struct file *, loff_t, int);
ssize_t(*read) (struct file *, char __user *, size_t, loff_t *);
ssize_t(*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
ssize_t(*write) (struct file *, const char __user *, size_t, loff_t *);
ssize_t(*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);
int (*readdir) (struct file *, void *, filldir_t);
unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
int (*mmap) (struct file *, struct vm_area_struct *);
int (*open) (struct inode *, struct file *);
int (*flush) (struct file *);
int (*release) (struct inode *, struct file *);
int (*fsync) (struct file *, struct dentry *, int datasync);
int (*aio_fsync) (struct kiocb *, int datasync);
int (*fasync) (int, struct file *, int);
int (*lock) (struct file *, int, struct file_lock *);
ssize_t(*readv) (struct file *, const struct iovec *, unsigned long, loff_t *);
ssize_t(*writev) (struct file *, const struct iovec *, unsigned long, loff_t *);
ssize_t(*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void __user *);
ssize_t(*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
unsigned long (*get_unmapped_area) (struct file *, unsigned long,
unsigned long, unsigned long,
unsigned long);
};
3.struct inodeはファイルのノードを表しています.任意のファイル(ファイル、ディレクトリ)はinode構造体変数事前作成に対応しています.この構造体はファイルの共通情報を記録しています.struct inode {
struct hlist_node i_hash; /* */
struct list_head i_list; /* */
struct list_head i_dentry; /* */
unsigned long i_ino; /* */
atomic_t i_count; /* */
umode_t i_mode; /* */
unsigned int i_nlink; /* */
uid_t i_uid; /* id */
gid_t i_gid; /* id */
kdev_t i_rdev; /* */
loff_t i_size; /* */
struct timespec i_atime; /* */
struct timespec i_mtime; /* */
struct timespec i_ctime; /* */
unsigned int i_blkbits; /* */
unsigned long i_blksize; /* */
unsigned long i_version; /* */
unsigned long i_blocks; /* */
unsigned short i_bytes; /* */
spinlock_t i_lock; /* */
struct rw_semaphore i_alloc_sem; /* */
struct inode_operations *i_op; /* */
struct file_operations *i_fop; /* */
struct super_block *i_sb; /* */
struct file_lock *i_flock; /* */
struct address_space *i_mapping; /* */
struct address_space i_data; /* */
struct dquot *i_dquot[MAXQUOTAS]; /* */
struct list_head i_devices; /* */
struct pipe_inode_info *i_pipe; /* */
struct block_device *i_bdev; /* */
unsigned long i_dnotify_mask; /* */
struct dnotify_struct *i_dnotify; /* */
unsigned long i_state; /* */
unsigned long dirtied_when; /* */
unsigned int i_flags; /* */
unsigned char i_sock; /* */
atomic_t i_writecount; /* */
void *i_security; /* */
__u32 i_generation; /* */
union {
void *generic_ip; /* */
} u;
};