最近Linus炮轟C++,“C++是一種糟糕的(horrible)語言。而且因為有大量不夠標准的程序員在使用而使許多真正懂得底層問題,而不會折騰那些白癡‘對象模型’”。牛人就是牛氣沖天阿。
在fs/sysfs/下面,除去makefile,還有8個文件。其中, bin.c, file.c, dir.c, symblink.c分別代表了在sysfs文件系統中當文件類型為二進制文件,普通文件,目錄,符號連接時的各自的file operations結構體的實現。inode.c則是inode oprations的實現,還有創建和刪除inode。mount.c包括了sysfs的初始化函數。sysfs.h就是頭文件,裡面有函數的原形,並將其extern出去。
sysfs的文件系統的所讀寫的信息是存放在kobject當中,那麼dentry是如何與kobject聯系起來的呢?是通過sysfs_dirent。
sysfs_direntsysfs文件系統有自己的dirent結構,dirent = directory entry (目錄實體)。sysfs中,每一個dentry對應了一個dirent結構,dentry->d _fsdata是一個void的指針,它指向sysfs_dirent結構。
struct sysfs_dirent {
atomic_t s_count;
struct list_head s_sibling;
struct list_head s_children;
void * s_element;
int s_type;
umode_t s_mode;
struct dentry * s_dentry;
struct iattr * s_iattr;
atomic_t s_event;
};
s_count是引用計數,s_sibling,s_children指針是這些sysfs_dirent 連成一個樹狀結構。s_type則說明了這個dirent具體的類型:
#define SYSFS_ROOT 0x0001
#define SYSFS_DIR 0x0002
#define SYSFS_KOBJ_ATTR 0x0004
#define SYSFS_KOBJ_BIN_ATTR 0x0008
#define SYSFS_KOBJ_LINK 0x0020
s_element就是指向相應與s_type類型的數據結構。如DIR(就是kobject,一個kobject對應一個DIR),KOBJ_ATTR(attribute屬性,代表一個文件)。sysfs_dirent是kobject和sysfs聯系的一個中間連接結構。它通過s_sibling,s_children連接成一個層次結構。而且它的層次結構與sysfs完全一致的,它就是一個連接kobject和dentry結構的連接件。
舉個例子總結一下這些數據結構的連接關系。在sysfs中的文件結構如下
/sys/bus/ldd/
|--device
|--driver
`--version
它對應的dentry,dirent,kobject的連接圖如圖1,2,3
圖1: dentry連接圖
圖2: dirent連接圖
圖3: kobject連接圖
對比一下可以發現不同之處。向version這樣用bus_create_file()創建的文件,或曰屬性,只停留在sysfs_dirent這一層。
對於sysfs下的文件夾而言,denrty, dirent, kobject之間通過指針相互聯系起來。
dentry->d_fsdata = &dirent;
dirent->element = &kobject;
kobject->dentry = &dentry;