linux block设备,Linux I/O Block--块设备的表示

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

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

8096a944bc1cb29166ce96c659985ea6.png

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

对于块设备文件的操作,通过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;

}0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

请来围观:WPF开发的微信客户端!!!

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;眾尋原文链接&#xff1a;https://www.cnblogs.com/ZXdeveloper/p/6058206.html公司的同事离职了&#xff0c;接下来的日子可能会忙碌&#xff0c;能完善DEMO的时间也会少了&#xff0c;因…

ios-新浪微博-下拉刷新获取最新的消息(解决消息重复的问题)(五)

2019独角兽企业重金招聘Python工程师标准>>> 第一步 在上一篇博文的基础上&#xff0c;利用新浪提供的since_id进行判断&#xff0c;在刷新监听的方法中&#xff0c;引入下面的代码 结果如下图 转载于:https://my.oschina.net/iOSliuhui/blog/520495

《看聊天记录都学不会Python到游戏实战?太菜了吧》(7)我用函数写了个特洛伊木马

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

linux修改windows注册表,妙招:让修改的注册表立即生效的几种方法

建站学院(LieHuo.Net)Windows文档Windows操作系统是全球最广泛&#xff0c;使用者最多的软件&#xff0c;熟悉Windows软件成了电脑操作者必不可少的功课&#xff0c;注册表作为“Windows的神经系统”非常重要&#xff0c;相信很多朋友都非常熟悉注册&#xff0c;在开始&#xf…

Android之通过用户名和密码连接指定wifi热点(兼容Android9.0和Android10.0和addNetwork(wifiNewConfiguration)返回-1问题)

1 需求 通过用户名和密码连接指定wifi热点,网上的代码乱七八糟,没几个可以用,我这边整理了下,测试了华为Android9.0和小米Android9.0和10.0和OPPO Android9.0 都没问题,直接回调结果就行。 2 问题 在Android10.0手机上 mWifiManager.addNetwork(wifiNewConfiguration);…

WPF怎么做新手引导界面?

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;眾尋原文链接&#xff1a;https://www.cnblogs.com/ZXdeveloper/p/8391864.html这两天不忙&#xff0c;所以&#xff0c;做了一个简易的新手引导小Demo。因为&#xff0c;不是项目上应用&a…

《看聊天记录都学不会C语言?太菜了吧》(19)巩固开始,数字1、2、3、4能够组成多少个 3 位数的不同的排列

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

【经典回放】多种语言系列数据结构算法:串(C版)

我们这里说的串、就是标准的C语言的串,这点,和我们教材中另行定义的串并不一致。我们这里强调仅仅是按C语言的标准处理串,是因为你会按C语言的标准构造串、而不是按其它的模式定义的。在我们的教材上,串相当与一个: struct ElemType {char *str; }; 构造的顺序表、或者是…

可以只读的 ServiceCollection

可以只读的 ServiceCollectionIntro在 .NET 7 Preview 4 中&#xff0c;ServiceCollection 可以声明为只读了&#xff0c;这使得我们可以有效避免在构建了 ServiceProvider 之后再新增服务&#xff0c;导致服务注册失败。Sample在新的版本中&#xff0c;ServiceCollection 新增…

阿里云与中国联通首个公共云平台上线

11月8日&#xff0c;阿里云与中国联通关于公共云合作的首个项目&#xff1a;浙江联通“沃云Powered by Alibaba cloud” 平台&#xff08;cloud.10010zj.com.cn&#xff09;正式发布上线。该平台将以沃云品牌为客户提供“阿里云联通”服务&#xff0c;结合阿里云技术及浙江联通…

IBM X System ServerGuide 8.41 服务器 系统安装 引导盘

IBM X System ServerGuide 8.41 支持操作系统: 32位: Microsoft Windows 2003/2003 R2 (Enterprise, Standard, Web and DataCenter UV) Microsoft Small Business Server 2003/2003 R2 (Standard/Premium Edition) Microsoft Windows 2008 (Enterprise, Standard, Web and Dat…

Matlab R2018b简体中文版完整安装图文教程(附安装包下载)

目 录 一、安装过程 二、下载地址 matlab R2018b安装包如下所示,包括主程序和补丁文件两部分。 一、安装过程 双击安装包中的setup.exe。 选择使用文件安装MIYAO,点击下一步。

《看聊天记录都学不会C语言?太菜了吧》(20)(必懂!题解)我能知道2000年后的这个月一共有几天

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

linux nginx线程池,nginx使用线程池提升9倍性能

众所周知nginx使用异步&#xff0c;事件驱动方法处理连接。这意味着nginx使用一个worker进程处理多个连接和请求&#xff0c;而不是每一个请求有一个专门的进程或着线程处理(像传统架构的服务器那样&#xff0c;例如apache)。为了实现这个目的&#xff0c;nginx使用非阻塞模式的…

Android之解决androidx.appcompat.widget.Toolbar去掉左边距

1 问题 androidx.appcompat.widget.Toolbar默认左边有间距 2 解决办法 在Toolbar下面添加如下熟悉 app:contentInsetLeft"0dp"app:contentInsetStart"0dp"app:contentInsetEnd"0dp"app:maxButtonHeight"20dp"app:titleMargin"0…

C# 配置日志记录

在 .NET Core 中&#xff0c;可以给配置文件使用提供程序&#xff0c;例如从 JSON 或 XML文件、环境变量或命令行参数中读取配置。只需要从 NuGet 包 Microsoft.ExtensionsConfiguration 中创建一个ConfigurationBuilder&#xff0c;并向此构建器添加提供程序。要添加 JSON 提供…

使用“using” 的 “Cursor”

很多时候&#xff0c;我们会写下面的这段代码&#xff1a; private void button1_Click(object sender, EventArgs e) {Cursor cursor Cursor.Current;this.Cursor Cursors.WaitCursor;LongTimeMethod();this.Cursor cursor; }private void LongTimeMethod() {for (int i 0…

《看聊天记录都学不会C语言?太菜了吧》(21)(必懂!题解)在现实生活中,打擂台比赛争名次竟用的是冒泡排序?

若是大一学子或者是真心想学习刚入门的小伙伴可以私聊我&#xff0c;若你是真心学习可以送你书籍&#xff0c;指导你学习&#xff0c;给予你目标方向的学习路线&#xff0c;无套路&#xff0c;博客为证。 本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖…

ArcGIS 10.7如何获取矢量多边形所有折点的坐标(平面坐标和经纬度坐标)?

Descriptions:As shown in the figure below is a surface pattern spot, how to obtain the coordinates of each vertex (plane coordinates and latitude and longitude coordinates)? The results we want are as follows: Via data source,we get the information that…

Mahout分类算法学习之实现Naive Bayes分类示例

1.简介 (1) 贝叶斯分类器的分类原理发源于古典概率理论&#xff0c;是通过某对象的先验概率&#xff0c;利用贝叶斯公式计算出其后验概率&#xff0c;即该对象属于某一类的概率&#xff0c;选择具有最大后验概率的类作为该对象所属的类。朴素贝叶斯分类器(Naive Bayes Classifi…