應用程式與vfs(virtual filesystem)之間的介面是系統呼叫。
vfs與檔案系統及裝置檔案之間的介面是file_operation 結構體成員函式。(結構成員函式過多,基本上程式設計用到的有.read .write .open .owner = this_module)。
在對file_opreation 結構體成員函式進行編寫時,主要的用到的file ,incode這兩個結構體。
struct file f_u;
struct path f_path;
#define f_dentry f_path.dentry
#define f_vfsmnt f_path.mnt
const struct file_operations *f_op;
spinlock_t f_lock; /* f_ep_links, f_flags, no irq */
#ifdef config_smp
int f_sb_list_cpu;
#endif
atomic_long_t f_count;
unsigned int f_flags;
fmode_t f_mode;
loff_t f_pos;
struct fown_struct f_owner;
const struct cred *f_cred;
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;
#endif /* #ifdef config_epoll */
#ifdef config_debug_writecount
unsigned long f_mnt_write_state;
#endif
};
在file結構體裡f_mode讀/寫模式,f_flags標誌是裝置驅動的實際考慮要點。
/* needed for tty driver, and maybe others */
void *private_data;//用來指向裝置驅動自定義用來描述裝置的結構體。
struct inode ;
unsigned long i_ino;
atomic_t i_count;
unsigned int i_nlink;
dev_t i_rdev;
unsigned int i_blkbits;
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;
blkcnt_t i_blocks;
unsigned short i_bytes;
struct rw_semaphore i_alloc_sem;
const struct file_operations *i_fop; /* former ->i_op->default_file_ops */
struct file_lock *i_flock;
struct address_space i_data;
#ifdef config_quota
struct dquot *i_dquot[maxquotas];
#endif
struct list_head i_devices;
union ;
__u32 i_generation;
#ifdef config_fsnotify
__u32 i_fsnotify_mask; /* all events this inode cares about */
struct hlist_head i_fsnotify_marks;
#endif
#ifdef config_ima
atomic_t i_readcount; /* struct files open ro */
#endif
atomic_t i_writecount;
#ifdef config_fs_posix_acl
struct posix_acl *i_acl;
struct posix_acl *i_default_acl;
#endif
void *i_private; /* fs or device private pointer */
};
在vfs inode結構體包含檔案訪問許可權,屬性,組,大小,生成時間,訪問時間,最後修改時間等資訊。是檔案系統連線任何子目錄、檔案的橋梁。
dev_t i_rdev;//i_rdev欄位包含裝置編號、分為主裝置編號,和次裝置編號。前者為高12位,後者為低20位。
從乙個inode中獲取到主裝置號,次裝置號。
unsigned int iminor(struct incode *inode);
unsigned int imajor(struct incode *inode);
Linux 檔案系統與驅動
之前做應用程式的開發,就知道linux系統的一大特點就是一切皆檔案,一直以來對所有裝置的操作都是使用系統函式open read write close來實現的,就沒關心過系統裡面是怎麼實現對各種裝置的區分和控制櫃,直到開始看linux裝置驅動方面的知識以後,感覺像發現了新大陸一樣的神奇,故把相關知識...
dev loop與裝置檔案系統
摘要 在進行測試的時候,我們往往需要新建一些磁碟分割槽或者裝置等,此時對硬碟進行重新劃分往往不太方面。這種情況下,我們可以通過偽裝置來實現迴圈掛載,從而達到目的。本文主要為你講解什麼是迴圈掛載,什麼是虛擬裝置,裝置和檔案系統有什麼關係。在類unix系統中,dev loop 或稱vnd vnode d...
Linux 驅動相關檔案系統
1.dev 裝置檔案目錄,存放所有系統中device 裝置 的相關資訊。dev snd 音效卡裝置 2.etc 系統配置檔案 3.opt 表示可選擇,自定義軟體安裝的地方 4.proc 作業系統執行時,程序相關資訊,由系統動態生成。proc ioports 可以檢視i o埠使用情況。proc mod...