linux核心inode結構

2021-08-21 14:29:50 字數 3012 閱讀 7421

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...