轉自:http://www.cnblogs.com/QJohnson/archive/2011/06/24/2089414.htmlhtml
內核中用inode結構表示具體的文件,而用file結構表示打開的文件描述符。Linux2.6.27內核中,inode結構體具體定義以下:node
struct inode { struct hlist_node i_hash; struct list_head i_list; struct list_head i_sb_list; struct list_head i_dentry; unsigned long i_ino; atomic_t i_count; unsigned int i_nlink; uid_t i_uid; gid_t i_gid; dev_t i_rdev; //該成員表示設備文件的inode結構,它包含了真正的設備編號。 u64 i_version; loff_t i_size; #ifdef __NEED_I_SIZE_ORDERED seqcount_t i_size_seqcount; #endif struct timespec i_atime; struct timespec i_mtime; struct timespec i_ctime; unsigned int i_blkbits; blkcnt_t i_blocks; unsigned short i_bytes; umode_t i_mode; spinlock_t i_lock; /* i_blocks, i_bytes, maybe i_size */ struct mutex i_mutex; struct rw_semaphore i_alloc_sem; const struct inode_operations *i_op; const struct file_operations *i_fop; /* former ->i_op->default_file_ops */ struct super_block *i_sb; struct file_lock *i_flock; struct address_space *i_mapping; struct address_space i_data; #ifdef CONFIG_QUOTA struct dquot *i_dquot[MAXQUOTAS]; #endif struct list_head i_devices; union { struct pipe_inode_info *i_pipe; struct block_device *i_bdev; struct cdev *i_cdev; //該成員表示字符設備的內核的 內部結構。當inode指向一個字符設備文件時,該成員包含了指向struct cdev結構的指針,其中cdev結構是字符設備結構體。 }; int i_cindex; __u32 i_generation; #ifdef CONFIG_DNOTIFY unsigned long i_dnotify_mask; /* Directory notify events */ struct dnotify_struct *i_dnotify; /* for directory notifications */ #endif #ifdef CONFIG_INOTIFY struct list_head inotify_watches; /* watches on this inode */ struct mutex inotify_mutex; /* protects the watches list */ #endif unsigned long i_state; unsigned long dirtied_when; /* jiffies of first dirtying */ unsigned int i_flags; atomic_t i_writecount; #ifdef CONFIG_SECURITY void *i_security; #endif void *i_private; /* fs or device private pointer */ };
二、struct file ──字符設備驅動相關重要結構linux
文件結構 表明一個打開的文件描述符,它不是專門給驅動程序使用的,系統中每個打開的文件在內核中都有一個關聯的struct file。它由內核在open時建立,並傳遞給在文件上操做的任何函數,知道最後關閉。當文件的全部實例都關閉以後,內核釋放這個數據結構。安全
struct file { /* * fu_list becomes invalid after file_free is called and queued via * fu_rcuhead for RCU freeing */ union { struct list_head fu_list; struct rcu_head fu_rcuhead; } f_u; struct path f_path; #define f_dentry f_path.dentry //該成員是對應的 目錄結構 。 #define f_vfsmnt f_path.mnt const struct file_operations *f_op; //該操做 是定義文件關聯的操做的。內核在執行open時對這個 指針賦值。 atomic_long_t f_count; unsigned int f_flags; //該成員是文件標誌。 mode_t f_mode; loff_t f_pos; struct fown_struct f_owner; unsigned int f_uid, f_gid; struct file_ra_state f_ra; u64 f_version; #ifdef CONFIG_SECURITY void *f_security; #endif /* needed for tty driver, and maybe others */ void *private_data;//該成員是系統調用時保存狀態信息很是有用的資源。 #ifdef CONFIG_EPOLL /* Used by fs/eventpoll.c to link all the hooks to this file */ struct list_head f_ep_links; spinlock_t f_ep_lock; #endif /* #ifdef CONFIG_EPOLL */ struct address_space *f_mapping; #ifdef CONFIG_DEBUG_WRITECOUNT unsigned long f_mnt_write_state; #endif };
struct file { union { struct list_head fu_list; 文件對象鏈表指針linux/include/linux/list.h struct rcu_head fu_rcuhead; RCU(Read-Copy Update)是Linux 2.6內核中新的鎖機制 } f_u; struct path f_path; 包含dentry和mnt兩個成員,用於肯定文件路徑 #define f_dentry f_path.dentry f_path的成員之一,當前文件的dentry結構 #define f_vfsmnt f_path.mnt 表示當前文件所在文件系統的掛載根目錄 const struct file_operations *f_op; 與該文件相關聯的操做函數 atomic_t f_count; 文件的引用計數(有多少進程打開該文件) unsigned int f_flags; 對應於open時指定的flag mode_t f_mode; 讀寫模式:open的mod_t mode參數 off_t f_pos; 該文件在當前進程中的文件偏移量 struct fown_struct f_owner; 該結構的做用是經過信號進行I/O時間通知的數據。 unsigned int f_uid, f_gid; 文件全部者id,全部者組id struct file_ra_state f_ra; 在linux/include/linux/fs.h中定義,文件預讀相關 unsigned long f_version; #ifdef CONFIG_SECURITY void *f_security; #endif /* needed for tty driver, and maybe others */ void *private_data; #ifdef CONFIG_EPOLL /* Used by fs/eventpoll.c to link all the hooks to this file */ struct list_head f_ep_links; spinlock_t f_ep_lock; #endif /* #ifdef CONFIG_EPOLL */ struct address_space *f_mapping; };
struct dentry { atomic_t d_count; 目錄項對象使用計數器,能夠有未使用態,使用態和負狀態 unsigned int d_flags; 目錄項標誌 struct inode * d_inode; 與文件名關聯的索引節點 struct dentry * d_parent; 父目錄的目錄項對象 struct list_head d_hash; 散列表表項的指針 struct list_head d_lru; 未使用鏈表的指針 struct list_head d_child; 父目錄中目錄項對象的鏈表的指針 struct list_head d_subdirs;對目錄而言,表示子目錄目錄項對象的鏈表 struct list_head d_alias; 相關索引節點(別名)的鏈表 int d_mounted; 對於安裝點而言,表示被安裝文件系統根項 struct qstr d_name; 文件名 unsigned long d_time; /* used by d_revalidate */ struct dentry_operations *d_op; 目錄項方法 struct super_block * d_sb; 文件的超級塊對象 vunsigned long d_vfs_flags; void * d_fsdata;與文件系統相關的數據 unsigned char d_iname [DNAME_INLINE_LEN]; 存放短文件名 };
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; 最後修改(modify)時間 struct timespec i_ctime; 最後改變(change)時間 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; };
inode 譯成中文就是索引節點。每一個存儲設備或存儲設備的分區(存儲設備是硬盤、軟盤、U盤 ... ... )被格式化爲文件系統後,應該有兩部份,一部份是inode,另外一部份是Block,Block是用來存儲數據用的。而inode呢,就是用來存儲這些數據的信息,這些信息包括文件大小、屬主、歸屬的用戶組、讀寫權限等。inode爲每一個文件進行信息索引,因此就有了inode的數值。操做系統根據指令,能經過inode值最快的找到相對應的文件。
作個比喻,好比一本書,存儲設備或分區就至關於這本書,Block至關於書中的每一頁,inode 就至關於這本書前面的目錄,一本書有不少的內容,若是想查找某部份的內容,咱們能夠先查目錄,經過目錄能最快的找到咱們想要看的內容。
當咱們用ls 查看某個目錄或文件時,若是加上-i 參數,就能夠看到inode節點了;好比ls -li lsfile.sh ,最前面的數值就是inode信息.數據結構