块设备的分区信息由struct hd_struct结构描述,其中最重要的信息就是分区的起始扇区号和分区的大小。所有分区信息都一起保存在gendisk的part_tbl结构中,同时每个分区的block_device也可以通过bd_part来查询对应的分区信息。

下图描述了block_device,gendisk以及分区描述符之间的关系(块设备有两个分区)

下面通过打开一个块设备的过程,来理解这些结构之间的联系。

对于块设备文件的操作,通过block_dev伪文件系统来完成,open操作定义的函数为blkdev_open()

blkdev_open的主要任务有两个

1.获取设备的block_device信息

2.从gendisk中读取相关信息保存到block_device,同时建立数据结构之间的联系

static int blkdev_open(struct inode * inode, struct file * filp)

{

struct block_device *bdev;

int res;

/*

* Preserve backwards compatibility and allow large file access

* even if userspace doesn't ask for it explicitly. Some mkfs

* binary needs it. We might want to drop this workaround

* during an unstable branch.

*/

filp->f_flags |= O_LARGEFILE;

if (filp->f_flags & O_NDELAY)

filp->f_mode |= FMODE_NDELAY;

if (filp->f_flags & O_EXCL)

filp->f_mode |= FMODE_EXCL;

if ((filp->f_flags & O_ACCMODE) == 3)

filp->f_mode |= FMODE_WRITE_IOCTL;

bdev = bd_acquire(inode);//获取block device实例

if (bdev == NULL)

return -ENOMEM;

filp->f_mapping = bdev->bd_inode->i_mapping;

res = blkdev_get(bdev, filp->f_mode);//通过gendisk获取信息并建立联系

if (res)

return res;

if (filp->f_mode & FMODE_EXCL) {

res = bd_claim(bdev, filp);

if (res)

goto out_blkdev_put;

}

return 0;

out_blkdev_put:

blkdev_put(bdev, filp->f_mode);

return res;

}

bd_acquire()负责获取block_device的实例

static struct block_device *bd_acquire(struct inode *inode)

{

struct block_device *bdev;

spin_lock(&bdev_lock);

bdev = inode->i_bdev;//如果这个设备之前被打开过则可以直接通过i_bdev获取

if (bdev) {

atomic_inc(&bdev->bd_inode->i_count);

spin_unlock(&bdev_lock);

return bdev;

}

spin_unlock(&bdev_lock);

bdev = bdget(inode->i_rdev);//通过设备号的信息来获取block device实例

if (bdev) {

spin_lock(&bdev_lock);

if (!inode->i_bdev) {

/*

* We take an additional bd_inode->i_count for inode,

* and it's released in clear_inode() of inode.

* So, we can access it via ->i_mapping always

* without igrab().

*/

atomic_inc(&bdev->bd_inode->i_count);

inode->i_bdev = bdev;

inode->i_mapping = bdev->bd_inode->i_mapping;

list_add(&inode->i_devices, &bdev->bd_inodes);

}

spin_unlock(&bdev_lock);

}

return bdev;

}

-------------------------------分割线-------------------------------

struct block_device *bdget(dev_t dev)

{

struct block_device *bdev;

struct inode *inode;

/*这里先在inode的哈希表中进行查找与dev设备号对应的inode,如果没找到的话,

则通过bdev伪文件系统创建bdev_inode(包含inode和block device的结构体)*/

inode = iget5_locked(blockdev_superblock, hash(dev),

bdev_test, bdev_set, &dev);

if (!inode)

return NULL;

//通过inode获取bdev_inode,再通过bdev_inode获取block device实例

bdev = &BDEV_I(inode)->bdev;

if (inode->i_state & I_NEW) {

/*分别设置block device和inode的相关域*/

bdev->bd_contains = NULL;

bdev->bd_inode = inode;

bdev->bd_block_size = (1 << inode->i_blkbits);

bdev->bd_part_count = 0;

bdev->bd_invalidated = 0;

inode->i_mode = S_IFBLK;

inode->i_rdev = dev;

inode->i_bdev = bdev;

inode->i_data.a_ops = &def_blk_aops;

mapping_set_gfp_mask(&inode->i_data, GFP_USER);

inode->i_data.backing_dev_info = &default_backing_dev_info;

spin_lock(&bdev_lock);

list_add(&bdev->bd_list, &all_bdevs);

spin_unlock(&bdev_lock);

unlock_new_inode(inode);

}

return bdev;

}

linux block设备,Linux I/O Block--块设备的表示相关推荐

  1. linux块设备驱动(一)——块设备概念介绍

    linux块设备驱动(一)--块设备概念介绍 本文来源于: 1. http://blog.csdn.net/jianchi88/article/details/7212370 2. http://bl ...

  2. Linux文件系统与持久性内存介绍:块设备、闪存(NAND/NOR)、NVDIMM(非易失性内存)、PMEM(PMDK)- ndctl

    <持久内存开发套件(Persistent Memory Development Kit-PMDK) - pmem.io: PMDK> <PMDK介绍> <PMDK(NVM ...

  3. linux 块设备驱动(二)——块设备数据结构

    linux 块设备驱动(二)--块设备数据结构 本文来源于: 1. http://www.cnblogs.com/dyllove98/archive/2013/07/01/3165567.html 块 ...

  4. linux 块设备驱动 (三)块设备驱动开发

    linux 块设备驱动 (三)块设备驱动开发 一: 块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数是 register_blkdev(),其原型为: int ...

  5. linux 网卡是块设备吗,什么是网络块设备(Network Block Device)?

    网络块设备(NBD)是一种用于Linux®和Unix®计算机系统的远程数据存储技术,它允许客户端计算机访问远程系统上的数据存储.一旦客户端计算机设置了NBD,它的使用就好像它实际上是客户端上的一个磁盘 ...

  6. Linux块设备驱动(二)————块设备的体系架构

    块设备的体系架构从上到下依次为VFS虚拟文件系统.磁盘缓冲.各种类型的磁盘系统.通用块设备层.I/O调度层(优化访问上层的请求(读写请求)).块设备驱动层.块设备硬件层. 1.虚拟文件系统(VFS) ...

  7. 块设备驱动程序设计(3)—简单块设备驱动设计

    这节课的内容主要根据上一节课分析出来的块设备的初始化和操作流程,编写出自己的块设备驱动函数.因此这篇博文主要讲一下所用到函数的用法及其他框架. 1.编写一个模块框架 2.注册一个块设备major = ...

  8. linux以下哪个属于块设备,1222.在大多数Linux发行版本中,以下哪个属于块设备( )...

    在10V工作电压下,平行输电线的5V等势线弯曲的可能原因有哪些? 68.DDT属于( ). Consumer promotions are used to encourage potential co ...

  9. linux块设备的IO调度算法和回写机制

    ************************************************************************************** 參考: <Linux ...

  10. Linux设备驱动--块设备(三)之程序设计(转)

    http://blog.csdn.net/jianchi88/article/details/7212701 块设备驱动注册与注销 块设备驱动中的第1个工作通常是注册它们自己到内核,完成这个任务的函数 ...

最新文章

  1. 一句话进行浏览器版本识别
  2. 把ASP应用中的Session传递给asp.net应用
  3. NPOI之Excel——设置单元格背景色
  4. QT [007] QT UI 的控件操控问题 - 如何操控多嵌套的UI控件
  5. 图书馆借阅系统java参考文献_基于java的图书馆管理系统
  6. 《现代控制系统》第五章——反馈控制系统性能分析 5.4 二阶系统里面极点以及零点带来的影响
  7. aso优化师是什么_来肯云商app官网下载_做ASO优化师,只懂刷榜就够了吗
  8. 中职计算机教师发言范文话,中职班主任发言稿范文(精选4篇)
  9. Unity Shader 实现透明护盾效果
  10. 微信这几个好用的功能,你该知道
  11. 0基础学绘画怎么临摹
  12. ISCC 2019 逆向rev02
  13. 延安日报20220323导读:“金斧”、金珠、玉刀、木箱
  14. 基于RK3399配置并测试—单线激光雷达
  15. Python笔记:利用pygame模块实现三原色颜色滚动条效果
  16. IOS pickerView 使用
  17. o.m.s.m.ClassPathMapperScanner : No MyBatis mapper was found in ‘[com.XXX.XXX]‘ pack
  18. 使用BlueZ连接蓝牙手柄
  19. 深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)
  20. Handler更新子线程数据

热门文章

  1. MySql 数据库基本设计规范
  2. 如何使用 C# 中的 Tuple
  3. SQL Server 分页+json分享
  4. .net core 实现基于 JSON 的多语言
  5. Exceptionless(二) - 使用进阶
  6. 【NET CORE微服务一条龙应用】应用部署
  7. .NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现
  8. .net core上 K8S(七).netcore程序的服务发现
  9. Visual Studio 2019 首个预览版本抢先看,有啥新功能?
  10. .net core实践系列之SSO-同域实现