花点时间来总结一下前阵子的工作。

  qemu的底层块设备无疑是我所见过的最复杂的模块了,说得好像我很精通很多模块一样(大雾)。

  它的raw镜像格式文件的驱动的核心代码主要都是在raw-posix.c文件下面了看看那里的各种API吧哈哈哈。名字也起的特别的显眼,很容易就让人清楚那个API究竟是干啥用的。

  目前阅读代码所能认知到那群维护者所用到的技术有 异步IO(AIO),多线程,协程(couroutine)。

  对于异步IO的内容,不想在这里说太多,读者有空可以看看《UNP》卷一,那里有一章节对于各种各样的IO总结的很棒。

    qemu对于异步IO有两种的选择方式,你可以在guest的启动脚本里对其进行设置,实际上就是aio的选项,aio=native的话,那么你就要为你的linux安装好libaio库,这样子你的linux机器才能跑得动异步io的程序,这样子qemu才能在块设备驱动的读写当中用到异步IO的接口。如果aio=threads的话,那么qemu就会使用自己创建的线程池来模拟这么一个异步IO。。。哈哈哈真是太吊了。。。这部分的代码真是神才能写的出来。。。。那些神究竟要对这些玩意儿脑子里多清楚才能写得出来啊。。这两个选择我们可以在这里看到

  

  CONFIG_LINUX_AIO就是针对于linux本地的aio库的一个宏,如果没有定义(host上没有libaio库),这段红色的代码就会被忽略过去而跑去执行paio_submit,也就是用线程池模拟的异步IO

  咱们现在来跳到handle_aiocb_rw这里,这个接口主要就是针对快设备数据((RawPosixAIOData )的读写的一个接口,没错,qemu就是这么的叼炸天,读和写都放在同一个接口里面处理!

  总体来说,qemu貌似很喜欢使用io向量来处理数据(或许效率更高)?妈蛋,那要我们怎么拦截读写请求的数据嘛,没关系,qemu的作者很细心,似乎考虑到总有想我们这一群qemu hacker,也或许是防止qemu的io向量的处理机制出问题了

 /*
* We have more than one iovec, and all are properly aligned.
*
* Try preadv/pwritev first and fall back to linearizing the
* buffer if it's not supported.
*/

如果处理io向量出问题了,

那么后面就会有相应的处理机制,将所有的io向量对其到一个linear buffer里面

利用这一纯天然没有任何防腐添加剂的方法,我们可以通过这个步骤来讲所有的数据转换成linear buffer形式的,那我们就可以将这些数据进行拦截并扔到缓存里面咯~

很简单,只要将preadv_present从true改写成false,那么他就无法正确读取io向量的数据咯~拦截下来扔到缓存里面就ok了。

  缓存的实现目前还不适合公开,因为性能还远未达到我们的要求,还在处于不断地优化调试当中,不过已经可以正常地跑起来了,并且我相信最终会有性能提高的,因为我们现在将线程池里面线程的数目设置为1,原先的是64个线程,主要遇到了多个io线程同步的问题不得不先将线程的数目设置为1。不过这几个月总算没有白费,收获还是不少滴~

”吐槽“qemu的块设备驱动的更多相关文章

  1. linux块设备驱动之实例

    1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major  =  register_blkdev(sbull_major, "sbull&quo ...

  2. FLASH驱动之-块设备驱动系统构架

    一.  块设备是只能以块为单位进行访问的设备,块的大小一般是512个字节的整数倍,常见的块设备包括硬件,SD卡,光盘,flash等.驱动程序是块的整数倍从设备读写得到数据.块设备的最小访单位为块,不同 ...

  3. Linux 块设备驱动 (一)

    1.块设备的I/O操作特点 字符设备与块设备的区别: 块设备只能以块为单位接受输入和返回输出,而字符设备则以字符为单位. 块设备对于I/O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设 ...

  4. linux下的块设备驱动(二)

    上一章主要讲了请求队列的一系列问题.下面主要说一下请求函数.首先来说一下硬盘类块设备的请求函数. 请求函数可以在没有完成请求队列的中的所有请求的情况下就返回,也可以在一个请求都不完成的情况下就返回. ...

  5. Linux块设备驱动(一) _驱动模型

    块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备,本文以3.14为蓝本,探讨内核中的块设备驱动模型 框架 下图是Linux中的块设备模型示意图,应用层程序有两种方式访问一 ...

  6. Linux块设备驱动(二) _MTD驱动及其用户空间编程

    MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...

  7. 【转】 bio 与块设备驱动

    原文地址: bio 与块设备驱动      系统中能够随机访问固定大小数据片(chunk)的设备被称作块设备,这些数据片就称作块.块设备文件都是以安装文件系统的方式使用,此也是块设备通常的访问方式.块 ...

  8. 乾坤合一~Linux设备驱动之块设备驱动

    1. 题外话 在蜕变成蝶的一系列学习当中,我们已经掌握了大部分Linux驱动的知识,在乾坤合一的分享当中,以综合实例为主要讲解,在一个月的蜕茧成蝶的学习探索当中,觉得数据结构,指针,链表等等占据了代码 ...

  9. linux块设备驱动

    块设备驱动程序<1>.块设备和字符设备的区别1.读取数据的单元不同,块设备读写数据的基本单元是块,字符设备的基本单元是字节.2.块设备可以随机访问,字符设备只能顺序访问. 块设备的访问:当 ...

随机推荐

  1. 《TC训练赛一》题解!

    以下题目标题就是此题题目链接,题目内容为了节省篇幅就不粘上去了.整套题的链接:https://acm.bnu.edu.cn/v3/contest_show.php?cid=8679#info 密码:7 ...

  2. 搭建nexus私服,无法下载相关jar包,报错Repository proxy-mode is BLOCKED_AUTO

    在搭建nexus私服的时候,之前没直接用来下载maven的相关插件jar包,一直可以使用, 结果今天要编译hadoop的时候,在linux上新用maven就报错了,无法下载maven的相关插件(如下) ...

  3. oc温习七:结构体与枚举

    结构体和枚举都是一种存储复杂的数据.结构体是用户自定义的一种类型,不同类型的集合. 1.结构体的创建及使用 定义结构体类型 struct MyDate { int year; int month; i ...

  4. Java使用IText(VM模版)导出PDF

    Java使用IText(VM模版)导出PDF: public String createPDF(ProjectManageBase projectManageBase) { Map map = new ...

  5. django学习之- Cookie

    cookie:客户端游览器上的一个文件,以键值对进行保存,类似字典{'k':'sfs'},与服务器端没有关系,当游览器访问服务器时候,服务器会生成一个随机字符串保存在cookie中返回给客户端,这样当 ...

  6. loj6157 A^B Problem (并查集)

    题目: https://loj.ac/problem/6157 分析: 这种树上异或,一般是采用分位考虑,但是这题即使分位,也会发现非常不好处理 这里考虑维护一个点到其根的路径的异或值 用并查集去检测 ...

  7. java面向对象day01

    前言: 1.首先我们要明白:万物皆对象.现实中存在的事物都是对象.而面向对象技术就是对客观事物进行抽象.2.而java语言是纯面向对象的的语言,它具有描述对象及其相互之间关系的语言成分.3.定义类和建 ...

  8. 109.Convert sorted list to BST

    /* * 109.Convert sorted list to BST * 2016.12.24 by Mingyang * 这里的问题是对于一个链表我们是不能常量时间访问它的中间元素的. * 这时候 ...

  9. NodeJS+MongoDB+AngularJS+Bootstrap书店示例

    目录 一.Bootstrap 1.1.添加引用 1.2.在页面中使用BootStrap 1.3.可视化布局 二.使用MongoDB创建数据库 2.1.启动MongoDB数据库 2.2.启动数据库GUI ...

  10. Linux 下使用 Sar 简介

    Linux 下使用 Sar 简介 提交 我的留言 加载中 已留言 介绍 Sar 最早是实现在 Salaris Unix 系统里,后来移植到了大部分其他的 Unix 系统(如AIX,HP-UX等).Li ...