inode是linux核心的檔案系統裡邊最重要的資料結構,可以說,乙個inode就代表了乙個檔案,inode結構體儲存了檔案的大小,建立時間,檔案的塊大小等各種引數,乙個檔案可以有多個dentry,因為在linux裡由於軟連線,硬連線的存在,指向乙個檔案的路徑可能有多個,但是乙個檔案的inode只能有乙個,一般在檔案系統裡氛圍inode區和資料區,而inode區的大小能佔到10%左右。
inode資料結構定義在include/linux/fs.h,我們看一下他的定義。
struct inode ;
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 hlist_node i_hash;
在檔案系統裡,所有的inode都在雜湊鍊錶上,加快尋找速度。
struct list_head i_list;
struct list_head i_sb_list;
struct list_head i_dentry;
這分別是標識inode在使用中狀態的鍊錶,在superblock上記錄的鍊錶,在目錄上鏈結的鍊錶,當新建乙個inode的時候,會將i_list加在所有的已使用的inode鍊錶上,然後再加到超級塊上,最後連線到對應的目錄鍊錶上。
unsigned long i_ino;/* inode的唯一標號 */
atomic_t i_count; /* inode引用計數 */
unsigned int i_nlink;/* inode的硬連線數 */
uid_t i_uid;/* inode的對應檔案的使用者id */
gid_t i_gid;/* inode的對應檔案的使用者的組id */
dev_t i_rdev;/* 裝置標識 */
unsigned long i_version;/* 版本號 */
loff_t i_size; /* 檔案大小 */
struct timespec i_atime;/* 最後修改時間 */
struct timespec i_mtime;/* 檔案內容更改時間 */
struct timespec i_ctime;/* 檔案change time */
unsigned int i_blkbits; /* inode塊大小位數 */
blkcnt_t i_blocks;/* 塊數 */
unsigned short i_bytes;/* 已經使用的位元組數 */
umode_t i_mode; /* 檔案的開啟模式 */
spinlock_t i_lock; /* 自旋鎖 */
struct mutex i_mutex; /* 互斥量 */
struct rw_semaphore i_alloc_sem; /* 讀寫訊號量 */
const struct inode_operations *i_op; /* inode的操作函式集合 */
const struct file_operations *i_fop; /* 檔案操作函式 */
struct super_block *i_sb; /* 超級塊指標 */
struct file_lock *i_flock; /* 檔案鎖 */
struct list_head i_devices; /* 連線到裝置鍊錶上 */
__u32 i_generation;
unsigned long i_state; /* 檔案狀態位 */
unsigned long dirtied_when; /* 資料變髒時間 */
unsigned int i_flags; /* 狀態位 */
atomic_t i_writecount; /* 寫入計數 */
#ifdef config_security
void *i_security; /* 如果定義了這個巨集,就會有乙個專門用作安全作用的指標 */
#endif
void *i_private; /* 私有資料 */
};
linux 核心中根據inode得到檔名
核心程式設計中,操作的物件往往是inode,但是如何根據inode得到檔名呢,或者找到對應於檔案系統的位置呢?527 struct inode 560 dev t i rdev 561 loff t i size 562 struct timespec i atime 563 struct time...
linux檔案系統結構關於inode初步理解
檔案系統 根據分割槽建立的檔案系統基本由以下構成 bootblock superblock inodes datablocks。超級塊 superblock 儲存著描述檔案系統的大小和形狀的基本資訊。檔案系統的管理員可以使用其中的資訊來使用和維護檔案系統。在超級塊資料結構中包含 first inod...
Linux核心結構
linux核心主要由五個子系統組成 程序排程,記憶體管理,虛擬檔案系統,網路介面,程序間通訊。1.程序排程 sched 控制程序對cpu的訪問。當需要選擇下乙個程序執行時,由排程程式選擇最值得執行的程序。可執行程序實際上是僅等待cpu資源的程序,如果某個程序在等待其它資源,則該程序是不可執行程序。l...