bdev檔案系統

2021-07-15 21:33:01 字數 1663 閱讀 6910

//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檔案系統只能被核心使用,,用於構造內部資料結構之間的關聯。

//fs/block-dev.c

blkdev_open

//struct block_device *bdev,從inode中取出block_device

bdev = bd_acquire(inode);

bdev = bdget(inode->i_rdev);

通過bd_acquire從inode中取出block_device,乙個block_device對應/dev/目錄下乙個裝置節點,為什麼能從inode中取出block_device,看下面這段**:

struct bdev_inode ;

static

struct inode *bdev_alloc_inode(struct super_block *sb)

const

struct super_operations bdev_sops = ;

static

struct dentry *bd_mount(struct file_system_type *fs_type,

int flags, const

char *dev_name, void *data)

static

struct file_system_type bd_type = ;

在super_block的ops->alloc_inode實現函式bdev_alloc_inode中分配的是struct bdev_inode,裡面的struct block_device和struct inode是一一對應的。

//fs/block_dev.c

blkdev_open

struct block_device *bdev = bd_acquire(inode);//inode與block_device之間的關係

blkdev_get(bdev, filp->f_mode, filp);//block_device與gendisk之間的關係

__blkdev_get(bdev, mode, 0);

struct gendisk *disk = get_gendisk(bdev->bd_dev, &partno);

對於字元裝置,乙個物理字元裝置由乙個cdev表示,所以乙個cdev裡面內嵌了乙個device,

對於塊裝置,乙個物理塊裝置由乙個gendisk表示,所以乙個gendisk裡面內嵌了乙個device,

block_device對應/dev/目錄下的乙個塊裝置節點,比如/dev/sda1和/dev/sda2分別對應乙個block_device。通過對block_device的訪問最終都轉換為對對應gendisk的訪問。block_device可以有多個,而gendisk只有乙個,他包含了對裝置的操作的方法。並且hd_struct是gendisk下面用於表示分割槽的結構體。

bdev檔案系統

檔案系統,是對磁碟資料進行組織和管理的一種機制。可通過裝載,以目錄和檔案的形式向使用者層呈現。但,檔案和目錄其實只是檔案系統的前端而已,只是檔案系統的使用者檢視,其本質還在於這樣的乙個資料結構 inode。那純粹從inode角度來描述乙個檔案系統,會是什麼情況?偽檔案系統,就是這樣的一種表示,它不能...

bdev檔案系統

檔案系統,是對磁碟資料進行組織和管理的一種機制。可通過裝載,以目錄和檔案的形式向使用者層呈現。但,檔案和目錄其實只是檔案系統的前端而已,只是檔案系統的使用者檢視,其本質還在於這樣的乙個資料結構 inode。那純粹從inode角度來描述乙個檔案系統,會是什麼情況?偽檔案系統,就是這樣的一種表示,它不能...

偽檔案系統bdev

517static struct file system type bd type 522523static struct vfsmount bd mnt read mostly 524struct super block blockdev superblock 這三個是檔案系統的代表成員。檔案系統...