偽檔案系統bdev

2021-05-31 22:49:58 字數 1956 閱讀 3939

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角度來描述乙個檔案系統,會是什麼情況?偽檔案系統,就是這樣的一種表示,它不能...