Linux 檔案系統結構詳解

2021-06-06 12:32:53 字數 4004 閱讀 2135

一、 常見檔案相關結構體以2.6.22為例,其他的2.6.x版本可能調整,但是變化不大。

struct file結構體定義在include/linux/fs.h中定義。檔案結構體代表乙個開啟的檔案,系統中的每個開啟的檔案在核心空間都有乙個關聯的struct file。它由核心在開啟檔案時建立,並傳遞給在檔案上進行操作的任何函式。在檔案的所有例項都關閉後,核心釋放這個資料結構。在核心建立和驅動原始碼中,struct file的指標通常被命名為file或filp。如下所示:

struct file 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 */

};dentry的中文名稱是目錄項,是linux檔案系統中某個索引節點(inode)的鏈結。這個索引節點可以是檔案,也可以是目錄。inode(可理解為ext2 inode)對應於物理磁碟上的具體物件,dentry是乙個記憶體實體,其中的d_inode成員指向對應的inode。也就是說,乙個inode可以在執行的時候鏈結多個dentry,而d_count記錄了這個鏈結的數量。

struct dentry ;

對於每個程序,包含乙個files_struct結構,用來記錄檔案描述符的使用情況,定義在include/linux/file.h中

struct files_struct

;struct fdtable ;

struct fs_struct ;

索引節點物件由inode結構體表示,定義檔案在linux/fs.h中。

下圖為乙個程序中各主要的檔案相關結構的關係圖:

下圖為多個程序開啟同一檔案的情況:

核心的結構體不提供檔案的絕對路徑成員,由相對路徑得到絕對路徑的關鍵在得到當前的工作路徑。

當前的工作路徑可以由current->fs的pwd和pwdmnt成員得到,基本過程:

1、由pwd->d_name.name得到當前路徑名,由pwd->d_parent得到父目錄dentry結構,

一直向上檢索,直到父目錄為"/",此時得到的是檔案在本檔案系統下的路徑。

2、如果current->fs->pwdmnt->mnt_mountpoint的路徑不是"/",說明檔案所在的檔案系統不是掛載在根目錄下,需要得到掛載點。mnt_mountpoint也是乙個dentry變數,方法同1。

3、最後把檔案系統掛載點和檔案在檔案系統中的路徑拼接起來即可。

由當前程序的檔案描述符得到檔案的絕對路徑:

#if linux_version_code >= 0x020616

由current->files->fdt->fd[fd]->f_path.dentry->d_name.name

和current->files->fdt->fd[fd]->f_path.dentry->d_parent

得到在所在檔案系統下的路徑

由current->files->fdt->fd[fd]->f_path.mnt->mnt_mountpoint->d_name.name

和current->files->fdt->fd[fd]->f_path.mnt->mnt_mountpoint->d_parent

得到檔案系統掛載點在系統中掛載點的路徑

#elif linux_version_code >= 0x020610

由current->files->fdt->fd[fd]->f_dentry->d_name.name

和current->files->fdt->fd[fd]->f_dentry->d_parent

得到在所在檔案系統下的路徑

由current->files->fdt->fd[fd]->f_vfsmnt->mnt_mountpoint->d_name.name

和current->files->fdt->fd[fd]->f_vfsmnt->mnt_mountpoint->d_parent

得到檔案系統掛載點在系統中掛載點的路徑

#else

由current->files->fd[fd]->f_dentry->d_name.name

和current->files->fd[fd]->f_dentry->d_parent

得到在所在檔案系統下的路徑

由current->files->fd[fd]->f_vfsmnt->mnt_mountpoint->d_name.name

和current->files->fd[fd]->f_vfsmnt->mnt_mountpoint->d_parent

得到檔案系統掛載點在系統中掛載點的路徑

#endif

#if linux_version_code >= 0x020616

由current->mm->mmap->vm_file->f_path.dentry->d_name.name

和current->mm->mmap->vm_file->f_path.dentry->d_parent

得到在所在檔案系統下的路徑

由current->mm->mmap->vm_file->f_path.mnt->mnt_mountpoint->d_name.name

和current->mm->mmap->vm_file->f_path.mnt->mnt_mountpoint->d_parent

得到檔案系統掛載點在系統中掛載點的路徑

#else

由current->mm->mmap->vm_file->f_dentry->d_name.name

和current->mm->mmap->vm_file->f_dentry->d_parent

得到在所在檔案系統下的路徑

由current->mm->mmap->vm_file->f_vfsmnt->mnt_mountpoint->d_name.name

和current->mm->mmap->vm_file->f_vfsmnt->mnt_mountpoint->d_parent

得到檔案系統掛載點在系統中掛載點的路徑

#endif

linux 檔案系統 Linux 檔案系統結構介紹

ubuntu 像所有類unix系統一樣 在分層樹中組織檔案,其中的關係就像父母和孩子一樣。目錄可以包含其他目錄以及常規檔案,它們是樹的 葉子 樹的任何元素都可以通過路徑名引用 絕對路徑以字元 標識根目錄,其中包含所有其他目錄和檔案 開頭,然後列出必須遍歷以到達該元素的每個子目錄,每個子目錄用 符號分...

Linux檔案系統詳解

bin 存放著一百多個 linux下常用的命令 工具 dev 存放著linux下所有的裝置檔案 home 使用者主目錄,每建乙個使用者,就會在這裡新建乙個與使用者同名的目錄,給該使用者乙個自己的空間 lost found 顧名思義,一些丟失的檔案可能可以在這裡找到 mnt 外部裝置的掛接點,通常用c...

linux檔案系統詳解

主要結構 磁碟組成與分割槽 檔案系統特性 linux的ext2檔案系統 與目錄樹的關係 ext2 ext3檔案的訪問與日誌式檔案系統功能 linux檔案系統的執行 掛載點的意義 其他linux支援的檔案系統與vfs xfs檔案系統簡介 1.整顆磁碟的組成 圓形的碟片 竹雅頌記錄資料的部分 機械手臂,...