7.块设备驱动的I/O请求处理(2)

2023-11-19

不适用请求队列
使用请求队列对于一个机械磁盘设备而言的确有助于提高系统的性能,但是对于RAMDISKZRAM(Compressed RAM Block Device)等完全可真正随机访问的设备而言,无法从高级的请求队列逻辑中获益。对于这些设备,块层支持“无队列”的操作模式,为使用这个模式,驱动必须提供一个“制造请求”函数,而不是一个请求处理函数,“制造请求`”函数的原型:

static void xxx_make_request(struct request_queue *queue,struct bio *bio);

块设备驱动初始化的时候不再调用blk_init_queue(),而是调用blk_alloc_queue()blk_queue_make_request()xxx_make_request则会成为blk_queue_make_request()的第二个参数。
xxx_make_request()函数的第一个参数仍然是“请求队列”,但是这个请求队列不包含任何请求,因为快层没有必要将bio调整为请求。因此"制造请求"函数的的主要参数是bio结构体。代码清单13.12所示为一个“制造请求”函数的例子,它取材于drivers/block/zram/zram_drv.c

static void zarm_make_request(struct request_queue *queue,struct bio *bio)
{
	......
	__zram_make_request(zram,bio);
	......
}
static void __zram_make_request(struct zram *zram,struct bio *bio)
{
	int offset;
	u32 index;
	struct bio_vec bvec;
	struct bvec_iter iter;
	
	index = bio->bio_iter.bi_sector >> SECTORS_PER_PAGE_SHIFT;
	offset = (bio->bi_iter.bi_sector &(SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT;
	if(unlikely(bio->bi_rw & REQ_DISCARD))
	{
		zram_bio_discard(zram,index,offset,bio);
		bio_endio(bio,0);
		return;
	}
	bio_for_each_segment(bvec,bio,iter)
	{
		struct bio_vec bv = bvec;
		unsigned int unwritten = bvec.bv_len;
		do
		{
			bv.bv_len = min_t(unsigned int,PAGE_SIZE - offset,unwritten);
			if(zram_bvec_rw(zram,&bv,index,offset,bio_op(bio),bio)<0)
			{
				goto out;
			}
			bv.bv_offset += bv.bv_len;
			unwritten -= bv.bv_len;
			
			update_position(&index,&offset,&bv);
		}while(unwritten);
	}
	bio_endio(bio);
	return;
out:
	bio_io_error(bio);
}

上述代码通过bio_for_each_segment();迭代bio中的每个segment,最终调用zram_bvec_rw()完成内存的压缩,解压,读取和写入。
zram是Linux的一种内存优化技术,他划定一片内存区域作为swap的交换分区,但是它本身具备自动压缩功能,从而可以达到辅助Linux匿名页的交换效果,变相增大了内存。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

7.块设备驱动的I/O请求处理(2) 的相关文章

  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 何时使用 pthread 条件变量?

    线程问题 看来 只有在其他线程调用 pthread cond notify 之前调用 pthread cond wait 时 条件变量才起作用 如果在等待之前发生通知 那么等待将被卡住 我的问题是 什么时候应该使用条件变量 调度程序可以抢占
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • fopen 不返回

    我在 C 程序中使用 fopen 以只读模式 r 打开文件 但就我而言 我观察到 fopen 调用没有返回 它不返回 NULL 或有效指针 执行在 fopen 调用时被阻止 文件补丁绝对正确 我已经验证过 并且不存在与权限相关的问题 任何人
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两

随机推荐

  • LLM大语言模型-MOSS解读

    原始blog在 notion 中 这里帖一个 notion的链接吧 LLM大语言模型 MOSS解读
  • VsFTP离线安装

    vsftp离线安装 安装包链接 https pan baidu com s 1qNmXWh3Ks5bzc rn1ytchQ 提取码 397i 1 查看服务器是否安装FTP 如图则表示没有安装 Shell gt rpm qa grep vsf
  • 云端开发加速是否可持续?

    云是否已经崛起还有待讨论 但是 目前 大多数开发项目都是在云端进行的 无论是纯云还是混合云 2022 年 Pluralsight 的一项研究表明 75 的组织都在云上构建新产品 云的优势显而易见 几乎无限的容量以及几秒内即可实现的按需扩展
  • C++用两个栈实现队列

    1 基础 队列 先进先出 即插入数据在队尾进行 删除数据在队头进行 栈 后进先出 即插入与删除数据均在栈顶进行 2 思路 两个栈实现一个队列的思想 用pushStack栈作为push数据的栈 用popStack栈作为pop数据的栈 只要是对
  • 如何解决项目管理中遇到的困难?

    其实是四个点 时间 成本 资源 范围 质量 1 这在四个点中 最重要的是质量 唯一不可变的也是质量 因此是一个以质量为中心的 三个点围绕的三角 2 基于第一点 在质量不变的情况下 考虑其它的三个点 时间 成本 范围 平衡也是在这三点之间平衡
  • 【毕业设计源码】基于Uniapp、Vue、Node的校园预约小程序系统(前后分离)

    功能描述 此系统包含小程序端和管理员后台端 小程序端是给用户预约操作的 具有以下模块 1 预约教室 2 取消预约 3 查看教室信息 4 收藏信息 包括新闻 教师 5 查看新闻 6 注册与登录PC管理后台是给后台管理员操作的 具有以下模块 1
  • Java数组笔记及算法练习

    Java数组笔记及算法练习 本文档创作于代码随想录算法训练营一期 参考文献链接 代码随想录 Java数组完全解析 java数组 超详细 文章目录 Java数组笔记及算法练习 1 数组基础 1 1一些基本说明 1 2数组的初始化 1 3数组的
  • 游戏修改器制作教程七:注入DLL的各种姿势

    教程面向有C C 基础的人 最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译 如果你还在用VC6请趁早丢掉它 写这个教程只是为了让玩家更好地体验所爱的单机游戏 顺便学到些逆向知识 我不会用网络游戏做示
  • 数据结构——哈希排序

    哈希排序 就是用空间换取时间的一种排序方式 空间利用率达O n 算法思想 如果一个元素序列a里没有重复的元素 而我们需要找最大值或者前几个最大值时 怎么办呢 1 将这个a序列排序 然后直接选出目标值 2 开辟一个b数组 a里的每一个元素对应
  • WDK李宏毅学习笔记第八周01_Point Network

    文章目录 摘要 一 Pointer Network 1 1 目的 1 2 原理 1 3 优点 二 Applications Summarization 2 1 原理 2 2 优点 三 Applications Translation and
  • TensorFlow实战练习

    TensorFlow实战1 TensorFlow实现手写数字识别 前言 MNIST数据集 学习心得 全代码如下 TensorFlow实现手写数字识别 前言 本人正在学习TensorFlow的使用 使用的书籍是 TensorFlow实战 黄文
  • U-net源码讲解(Keras)

    更新 这个项目是2018 8月份写的 时间过得真快 现在都快一年了 其实深度学习这方面各种软硬件更新很快 如果你是新手学Unet 那么用keras版的也是蛮好的 但是到最后有自己的一点需求后再在此基础上搭自己的模块后Keras就显得很麻烦了
  • 浅谈HTTP中Get、Post、Put与Delete请求方式的区别

    1 GET请求会向数据库发索取数据的请求 从而来获取信息 该请求就像数据库的select操作一样 只是用来查询一下数据 不会修改 增加数据 不会影响资源的内容 即该请求不会产生副作用 无论进行多少次操作 结果都是一样的 2 与GET不同的是
  • 房价预测回归模型--tensorflow2.0学习笔记--tf.keras使用实例

    import tensorflow as tf import matplotlib as mpl import matplotlib pyplot as plt matplotlib inline import numpy as np im
  • Netty框架之概述及基本组件介绍

    概述 Netty是由JBOSS提供的一个java开源框架 是一个高性能 高可扩展性的异步事件 驱动的 网络应用程序框架 它极大地简化了TCP和UDP客户端和服务器开发等网络编 程 NIO有下面的缺点 JDK 的 NIO 底层由 epoll
  • 计算机文件及文件夹管理软件,常用管家(电脑文件夹管理工具)V1.1 免费版

    常用管家 电脑文件夹管理工具 是一款很优秀好用的文件夹管理助手 如果你需要一款好用的文件夹管理工具 不妨试试小编带来的这款常用管家软件 功能强大全面 使用后可以帮助用户更轻松便捷的管理文件夹 软件能够快速收藏和打开常用的文件夹 网站 并且能
  • 决策树实战:california房价预测

    Python3 7 决策树实战 california房价预测 网上有好多2 版本的代码 但是本地安装的是python3 7版本 在学习中遇到很多问题 有很多地方和2 版本的不一样 所以记录下来方便参考 侵权必删 导入模块 import pa
  • CISCN2018-WP

    MISC 验证码 用token登录 输入好验证码就可以得到flag Picture 图片隐写 一下就想到binwalk或者winhex打开试试 binwalk打开无果 将这段数据ctrl shift c复制出来 用下面python脚本生成z
  • HTML标签及浮动

  • 7.块设备驱动的I/O请求处理(2)

    不适用请求队列 使用请求队列对于一个机械磁盘设备而言的确有助于提高系统的性能 但是对于RAMDISK ZRAM Compressed RAM Block Device 等完全可真正随机访问的设备而言 无法从高级的请求队列逻辑中获益 对于这些