《存储IO路径》专题:IO块设备的创建

今天我们来一起学习一下Linux块设备层。它就像是一位大厨,为我们准备各种数据的饕餮盛宴。这个大厨非常厉害,不仅能够读取和写入数据,还能对数据进行各种复杂的操作,比如切割、合并、复制等等。那么,块设备层是如何实现这些操作的呢?

其实,这里的关键就是“缓冲区”。缓冲区就像是一个中转站,它存储从底层硬件读取的数据,等待上层的应用程序或者操作系统来取。同时,缓冲区还可以暂存要写入底层硬件的数据,等待设备驱动程序将其写入设备。这个过程就像是大厨在烹饪美食,先把食材放进锅里,然后加入各种调料,最后将美食呈现在客人的面前。

接下来,让我们来看看IO请求的创建。当应用程序需要进行读写操作时,它会向块设备层发送IO请求。块设备层接收到IO请求后,会根据请求的类型和参数来创建相应的IO请求。这个过程就像是客人向大厨点菜,大厨需要根据客人的需求来准备不同的菜品。

在块设备层中,当块设备层接收到读写请求时,它会根据请求的类型和参数来创建相应的读写请求,并将它们放入缓冲区中等待执行。这个过程就像是厨师需要根据客人的要求来准备不同的菜肴,并将它们放入盘中等待服务员端给客人。

接下来,让我们来看看块设备的注册机制。在Linux中,块设备的注册是非常重要的过程,它让设备能够被系统识别和管理。代码中,我们可以通过register_blkdev函数来注册一个块设备。

struct file_operations fops = {  .read = blkdev_read,  .write = blkdev_write,  .open = blkdev_open,  .release = blkdev_release,  
};  int register_blkdev(unsigned int major, const char *name, struct file_operations *fops)  
{  struct block_device *bdev;  dev_t dev;  int error;  bdev = kzalloc(sizeof(*bdev), GFP_KERNEL);  if (!bdev)  return -ENOMEM;  bdev->bd_dev = MKDEV(major, 0);  bdev->bd_openers = 0;  bdev->bd_contains = NULL;  bdev->bd_holders = 0;  bdev->bd_disk = NULL;  bdev->bd_queue = NULL;  bdev->bd_inode->i_bdev = NULL;  bdev->bd_inode->i_data.a_ops = &zero_aops;  error = register_blkdev(major, name);  if (error < 0) {  kfree(bdev);  return error;  }  set_device_ro(bdev->bd_inode, 0);  bdev->bd_disk = alloc_disk(1);  if (!bdev->bd_disk) {  unregister_blkdev(major, name);  kfree(bdev);  return -ENOMEM;  }  add_disk(bdev->bd_disk);  return 0;  
}

这段代码展示了register_blkdev函数的实现。它首先分配了一个struct block_device结构体的内存空间,然后设置了该结构体的一些成员变量,比如major、openers、contains等。接着,它调用register_blkdev函数将major和name注册为一个块设备。最后,它分配了一个磁盘(disk)结构体,并将其添加到系统中。这样,一个块设备就被成功地注册了。

当然,这只是块设备注册的一个简单示例。在实际的Linux内核中,块设备的注册机制更加复杂和精细。不过,通过这个示例,我们可以初步了解块设备的注册过程。

总之呢,大厨烹饪美食就像Linux系统中的块设备层处理数据一样,都需要经过一系列复杂的过程才能最终呈现出美味佳肴。希望这个小故事能够帮助大家更好地掌握Linux块设备层的原理和块设备的注册机制!

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

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

相关文章

SpringBoot初级开发--整体应用的统一性异常管理(7)

在整个系统中&#xff0c;通常会要求有统一性的异常抛出&#xff0c;统一的异常格式&#xff0c;统一的异常界面&#xff0c;而不是把整个堆栈错误信息抛出&#xff0c;这样对整个系统的安全性以及错误定位都非常不好&#xff0c;接下来我们紧接上一章的源码&#xff0c;加上统…

JVM之程序计数器和栈

Java虚拟机&#xff08;JVM&#xff09;是运行Java程序的关键组件&#xff0c;它负责将Java源代码转换为可执行的字节码&#xff0c;并在运行时管理内存、执行程序等。在JVM的内部&#xff0c;有许多重要的组成部分&#xff0c;如下图&#xff1a; 1. JVM程序计数器 程序计数器…

CSRF(跨站请求伪造)和SSRF(服务端请求伪造)漏洞复现:风险与防护方法

这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 环境准备 一、CSRF&#xff08;跨站请求伪造&#xff09; 示例&#xff1a;假设用户在银行网站A上登录并保持会话活动&#xff0c;同时他也在浏览其他网站。攻击者在一个不可信任…

聊聊Http服务化改造实践

在微服务架构体系中远程RPC调用主要包括Dubbo与Http调用两个大类&#xff0c;由于Dubbo拥有服务注册中心&#xff0c;并且起服务的命名非常规范&#xff0c;使用包名.类名.方法名进行描述。 而http调用通常都是使用httpclient等相关类库&#xff0c;这些在使用上并没有问题&am…

18.2 【Linux】rsylog.service:记录登录文件的服务

rsyslogd 可以负责主机产生的各个信息的登录&#xff0c;而这些信息本身是有“严重等级”之分的。每个 Linux distributions 放置的登录文件文件名可能会有所差异。 基本上&#xff0c; rsyslogd 针对各种服务与讯息记录在某些文件的配置文件就是 /etc/rsyslog.conf&#xff0…

工厂人员作业行为动作识别检测算法

工厂人员作业行为动作识别检测算法通过yolov7python深度学习算法框架模型&#xff0c;工厂人员作业行为动作识别检测算法实时识别并分析现场人员操作动作行为是否符合SOP安全规范流程作业标准&#xff0c;如果不符合则立即抓拍告警提醒。Python是一种由Guido van Rossum开发的通…

【Docker】网络

文章目录 Docker 网络基础Docker网络管理Docker网络架构CNMLibnetwork驱动 常见的网络类型 Docker 网络管理命令docker network createdocker network inspectdocker network connectdocker network disconnectdocker network prunedocker network rmdocker network ls docker …

机器学习和数据挖掘02-Gaussian Naive Bayes

概念 贝叶斯定理&#xff1a; 贝叶斯定理是概率中的基本定理&#xff0c;描述了如何根据更多证据或信息更新假设的概率。在分类的上下文中&#xff0c;它用于计算给定特征集的类别的后验概率。 特征独立性假设&#xff1a; 高斯朴素贝叶斯中的“朴素”假设是&#xff0c;给定…

一个简单的vim例子

一.欢迎来到我的酒馆 在本章节介绍vim工具。 目录 一.欢迎来到我的酒馆二.什么是vim三.开始使用vim 二.什么是vim 2.1什么是vim vim是一种Linux命令行类型的文本编辑器。vim指的是"vi improved"&#xff0c;意思是vi工具的升级版。vim是基于vi实现的&#x…

Redis问题集合(三)在Redis容器里设置键值对

前言 前提是已经拉取了Redis镜像并创建了对应的容器做个记录&#xff0c;方便后续查看 步骤 查看Redis容器的ID&#xff1a;docker ps -a 进入容器&#xff1a;docker exec -it 容器ID /bin/bash进入redis命令行&#xff1a;redis-cli输入密码&#xff1a;auth 配置密码 查看…

(笔记六)利用opencv进行图像滤波

&#xff08;1&#xff09;自定义卷积核图像滤波 import numpy as np import matplotlib.pyplot as plt import cv2 as cvimg_path r"D:\data\test6-6.png" img cv.imread(img_path)# 图像滤波 ker np.ones((6, 6), np.float32)/36 # 构建滤波器&#xff08;卷积…

jq插件:jqgrid和validform的二次封装

做久了vue和react框架项目&#xff0c;偶尔也需要做做原生的项目。不可否认vue的双向绑定机制确实很香&#xff0c;但是也是建立在原生js基础上。所以&#xff0c;只有做更多的原生js项目&#xff0c;才能更加了解vue框架的底层原理。在日常开发中&#xff0c;也会不可避免的会…