linux vfs系統基礎

2021-09-16 21:43:44 字數 2994 閱讀 4826

struct fs_struct ;
#define nr_open_default bits_per_long

#define bits_per_long 32 /* asm-i386 */

struct files_struct ;

檔案描述符表

struct fdtable ;
檔案物件

/*順序打亂,突出重點*/

struct file f_u; /* 用於通用檔案物件鍊錶的指標 */

struct dentry *f_dentry; /* 與檔案相關的目錄項物件 */

mode_t f_mode; /* 程序的訪問模式 */

unsigned int f_flags; /* 當開啟檔案時所指定的標誌 */

loff_t f_pos; /* 當前的檔案位移量(檔案指標) */

atomic_t f_count; /* 檔案物件的引用計數器 */

struct vfsmount *f_vfsmnt; /* 含有該檔案的已安裝檔案系統 */

const struct file_operations *f_op; /* 指向檔案操作表的指標 */

struct fown_struct f_owner; /* 通過訊號進行 i/o 事件通知的資料 */

unsigned int f_uid, f_gid; /* 使用者的 uid、 gid */

struct file_ra_state f_ra; /* 檔案預讀狀態 */

unsigned long f_version; /* 版本號,每次使用後自動遞增 */

void *f_security; /* 指向檔案物件的安全結構的指標 */

/* 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; /* 保護 f_ep_links 鍊錶的自旋鎖 */

#endif /* #ifdef config_epoll */

};

每個目錄看作由若干子目錄和檔案組成的乙個普通檔案。然而目錄項不同,一旦目錄項被讀入記憶體, vfs 就把它轉換成基於dentry結構的乙個目錄項物件。

對於程序查詢的路徑名中的每個分量,核心都為其建立乙個目錄項物件;

struct dentry  d_u;

struct list_head d_alias; /* 用於與同一索引節點(別名)相關的目錄項鍊表的指標 */

unsigned long d_time; /* 由 d_revalidate 方法使用 */

struct dentry_operations *d_op; /* 目錄項方法 */

struct super_block *d_sb; /* 檔案的超級塊物件 */

void *d_fsdata; /* 依賴於檔案系統的資料 */

void *d_extra_attributes; /* tux-specific data */

#ifdef config_profiling

struct dcookie_struct *d_cookie; /* cookie,指向核心配置檔案使用的資料結構的指標*/

#endif

int d_mounted; /* 對目錄而言,用於記錄安裝該目錄項的檔案系統數的計數器 */

unsigned char d_iname[dname_inline_len_min]; /* 存放短檔名的空間 */

};

struct inode ;

int i_cindex; /* 擁有一組次裝置號的裝置檔案的索引 */

__u32 i_generation; /* 索引節點版本號(由某些檔案系統使用) */

#ifdef config_dnotify

unsigned long i_dnotify_mask; /* 目錄通知事件的位掩碼 */

struct dnotify_struct *i_dnotify; /* 用於目錄通知 */

#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; /* 索引節點的弄髒時間(以節拍為單位) */

unsigned int i_flags; /* 檔案系統的安裝標誌 */

atomic_t i_writecount; /* 用於寫程序的引用計數器 */

void *i_security; /* 指向索引節點安全結構的指標 */

void *i_private; /* 指向私有資料的指標 */

#ifdef __need_i_size_ordered

seqcount_t i_size_seqcount;/* smp 系統為 i_size 字段獲取一致值時使用的順序計數器 */

#endif

};

Linux VFS中write系統呼叫實現原理

目錄 使用者空間的 write 函式在核心裡面的服務例程為 sys write.1 vfs write 函式實現原理 2 word裡面的目錄複製過來似乎不能直接用。還是放在這裡當主線看吧.使用者空間的 write 函式在核心裡面的服務例程為 sys write root syslab grep wr...

Linux檔案系統型別與Linux VFS

linux 有著極其豐富的檔案系統,大體上可分如下幾類 磁碟檔案系統 指本地主機中實際可以訪問到的檔案系統,包括硬碟,cd rom,usb儲存器,磁碟陣列等。如fat16 fat32 ext3 ext4等 網路檔案系統 可以遠端訪問的檔案系統,這種檔案系統在伺服器端仍是本地的磁碟檔案系統,客戶機通過...

linux VFS資料結構 一

vfs的資料結構 超級塊物件 記錄已安裝檔案系統的整體資訊,由於具體的檔案系統來實現,它對應於具體檔案系統的超級塊或控制塊,儲存在磁碟的特定扇區上,如果不是基於磁碟的檔案系統,比如sysfs,會生成臨時的超級塊,儲存在記憶體當中。01struct super block 第2行指向超級塊鍊錶的指標 ...