517static struct file_system_type bd_type = ;
522523static struct vfsmount *bd_mnt __read_mostly;
524struct super_block *blockdev_superblock;
這三個是檔案系統的代表成員。檔案系統型別、掛載點和超級塊。
下面這個函式,應該是bdev檔案系統的初始化函式:
1、為bdev_inode
結構體建立slab快取:
kmem_cache_create
2、把檔案系統型別註冊進系統:
register_filesystem
說下系統啟動的時候,偽檔案系統的啟動流程:
start_kernel →
vfs_caches_init
→bdev_cache_init
所以這個函式就是偽檔案系統的初始過程,我們也可以看到,在系統啟動的時候,偽檔案系統已經啟動起來了。
493void __init bdev_cache_init(void)
494
kern_mount是掛載檔案系統的函式,按道理,我們的偽檔案系統bdev是無法掛載的阿。
架構p450:
核心提供了裝載標誌ms_nouser,防止此類檔案系統被裝載。
所有的檔案系統機制,都適用於偽檔案系統。
核心可以呼叫1804
#define
kern_mount
(type
)kern_mount_data
(type
,null
)這兩個函式來「掛載」bdev檔案系統。
(架構p443)
通常意義上的掛載(使用者空間的)會呼叫
sys_mount->do_mount->do_new_mount->
-->>vfs_kern_mount把檔案系統整合到vfs中去
-->>graft_tree 把檔案系統的檔案和目錄整合到使用者可見的表示中
我們這裡偽檔案系統bdev會通過上面提到的兩個函式,呼叫vfs_kern_mount,把自身整合到vfs中去,供核心使用。但是它呼叫graft_tree的時候,因為設定了裝載標誌位ms_nouser,所以這個函式什麼都不幹。
檔案系統的使用
這樣以來,偽檔案系統就初始化好了。乙個掛載的檔案系統對應三個全域性變數:
523staticstruct
vfsmount
*bd_mnt
__read_mostly
;524
struct
super_block
*blockdev_superblock
;517
staticstruct
file_system_type
bd_type
= 596 return bdev;
597}
571 inode = iget5_locked(bd_mnt->mnt_sb, hash(dev),
572 bdev_test, bdev_set, &dev);
577 bdev = &bdev_i(inode)->bdev;
看到這裡兩個東西,我們知道了,571這個必然是建立了乙個inode,
乙個block_device
,乙個bdev_inode
(後面這兩個要跟到原始碼中看下)。
因為577這個bdev本質上就等效是bdev =bdev_inode->block_device。借助container_of(inode)這個巨集來實現的效果。
所以可以看到,我們的代表整個硬碟的block_device是這個時候被建立的。
下一步來研究我們每個分割槽的block_device是什麼時候建立的。
bdev檔案系統
檔案系統,是對磁碟資料進行組織和管理的一種機制。可通過裝載,以目錄和檔案的形式向使用者層呈現。但,檔案和目錄其實只是檔案系統的前端而已,只是檔案系統的使用者檢視,其本質還在於這樣的乙個資料結構 inode。那純粹從inode角度來描述乙個檔案系統,會是什麼情況?偽檔案系統,就是這樣的一種表示,它不能...
bdev檔案系統
fs block dev.c static struct file system type bd type init main.c start kernel vfs caches init bdev cache init register filesystem bd type bdev檔案系統只能被...
bdev檔案系統
檔案系統,是對磁碟資料進行組織和管理的一種機制。可通過裝載,以目錄和檔案的形式向使用者層呈現。但,檔案和目錄其實只是檔案系統的前端而已,只是檔案系統的使用者檢視,其本質還在於這樣的乙個資料結構 inode。那純粹從inode角度來描述乙個檔案系統,會是什麼情況?偽檔案系統,就是這樣的一種表示,它不能...