//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 這三個是檔案系統的代表成員。檔案系統...