”吐槽“qemu的块设备驱动

花点时间来总结一下前阵子的工作。
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。不过这几个月总算没有白费,收获还是不少滴~
1.png)
1.png)
”吐槽“qemu的块设备驱动的更多相关文章
- linux块设备驱动之实例
1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major = register_blkdev(sbull_major, "sbull&quo ...
- FLASH驱动之-块设备驱动系统构架
一. 块设备是只能以块为单位进行访问的设备,块的大小一般是512个字节的整数倍,常见的块设备包括硬件,SD卡,光盘,flash等.驱动程序是块的整数倍从设备读写得到数据.块设备的最小访单位为块,不同 ...
- Linux 块设备驱动 (一)
1.块设备的I/O操作特点 字符设备与块设备的区别: 块设备只能以块为单位接受输入和返回输出,而字符设备则以字符为单位. 块设备对于I/O请求有对应的缓冲区,因此它们可以选择以什么顺序进行响应,字符设 ...
- linux下的块设备驱动(二)
上一章主要讲了请求队列的一系列问题.下面主要说一下请求函数.首先来说一下硬盘类块设备的请求函数. 请求函数可以在没有完成请求队列的中的所有请求的情况下就返回,也可以在一个请求都不完成的情况下就返回. ...
- Linux块设备驱动(一) _驱动模型
块设备是Linux三大设备之一,其驱动模型主要针对磁盘,Flash等存储类设备,本文以3.14为蓝本,探讨内核中的块设备驱动模型 框架 下图是Linux中的块设备模型示意图,应用层程序有两种方式访问一 ...
- Linux块设备驱动(二) _MTD驱动及其用户空间编程
MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...
- 【转】 bio 与块设备驱动
原文地址: bio 与块设备驱动 系统中能够随机访问固定大小数据片(chunk)的设备被称作块设备,这些数据片就称作块.块设备文件都是以安装文件系统的方式使用,此也是块设备通常的访问方式.块 ...
- 乾坤合一~Linux设备驱动之块设备驱动
1. 题外话 在蜕变成蝶的一系列学习当中,我们已经掌握了大部分Linux驱动的知识,在乾坤合一的分享当中,以综合实例为主要讲解,在一个月的蜕茧成蝶的学习探索当中,觉得数据结构,指针,链表等等占据了代码 ...
- linux块设备驱动
块设备驱动程序<1>.块设备和字符设备的区别1.读取数据的单元不同,块设备读写数据的基本单元是块,字符设备的基本单元是字节.2.块设备可以随机访问,字符设备只能顺序访问. 块设备的访问:当 ...
随机推荐
- jQuery 1.9升级指南
http://www.css88.com/archives/5086 原文地址:http://jquery.com/upgrade-guide/1.9/ 翻译的不对或者不通顺的地方欢迎拍砖留言。 概述 ...
- oracle 恢复中的switch datafile all是什么意思
使用rman进行恢复时,如果使用了set name修改文件路径,那么恢复后,控制文件里面的信息是没有修改该的,如果要同步控制文件的信息那么就需要使用 switch datafile allall这个可 ...
- 【尺取或dp】codeforces C. An impassioned circulation of affection
http://codeforces.com/contest/814/problem/C [题意] 给定一个长度为n的字符串s,一共有q个查询,每个查询给出一个数字m和一个字符ch,你的操作是可以改变字 ...
- vue验证码点击更新
vue验证码点击更新 不说啥,直接贴代码 html: <img class="captcha" @click="editCaptcha" :src=&qu ...
- [NOIP2001] 提高组 洛谷P1025 数的划分
题目描述 将整数n分成k份,且每份不能为空,任意两个方案不相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. 输 ...
- Google SPDY
SPDY(读作“SPeeDY”)是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验.SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强 ...
- HDU 5883 欧拉路径异或值最大 水题
The Best Path Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- 51nod 1907(多项式乘法启发式合并)
题目: 分析: 对于一个确定的生成子图,很明显是在一个连通块上走,走完了再跳到另一个连通块上,假设连通块个数为cnt,那么答案一定是$min(a_{cnt-1},a_cnt,..,a_{n-1})$ ...
- Unable to process request: General SSLEngine problem.Unable to connect to neo4j at `localhost:7687`, because the certificate the server uses has changed.
Exception in thread "main" org.neo4j.driver.v1.exceptions.ClientException: Unable to proce ...
- 【Todo】Java线程面试题 Top 50 (转载)
原文链接:http://www.importnew.com/12773.html 这里有一个排版好看一点的:http://www.cnblogs.com/dolphin0520/p/3958019.h ...