”吐槽“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。不过这几个月总算没有白费,收获还是不少滴~
”吐槽“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.块设备可以随机访问,字符设备只能顺序访问. 块设备的访问:当 ...
随机推荐
- 记第一次开发安卓应用——IT之家RSS阅读器
这个学期学校开了安卓的课程,因为自己一直学习wp的开发,一直用的是.net和Silverlight这一套,也着实没有太多时间投入安卓的方向去,因为想着毕业也不从事安卓的工作,所以也一直没有怎么研究.但 ...
- Android渐变GradientDrawable叠加组合环ring
Android渐变GradientDrawable叠加组合环ring 写一个Android环形shape之间的叠加组合形成新图像的例子.代码: <?xml version="1. ...
- CodeForce 448C 木片填涂问题
题目大意:有多片木片需要填涂,可以每次横着涂一行,也可以一次涂一列,当然你涂一行时遇到中间长度不够高的木片,填涂到此中断 这题目运用dfs能更容易的解出,虽然还是十分不容易理解 #include &l ...
- hdu1059(背包dp二进制优化)
Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- hibernate保存oracle日期时间
用java生成一个带年月日时分秒的时间,通过hibernate对象保存到oracle中的Date字段中, 第一种方法: java实体类的createDate属性,类型为java.util.Date h ...
- [NOIP2003] 提高组 洛谷P1038 神经网络
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- linux service命令解析(重要)
我们平时都会用service xxx start来启动某个进程,那么它背后究竟执行了什么? 其实service的绝对路径为/sbin/service ,打开这个文件cat /sbin/service, ...
- Java线程的5种状态及切换(透彻讲解)
http://blog.csdn.net/pange1991/article/details/53860651
- Python学习之-- IO 操作
阻塞IO / 非阻塞IO /IO多路复用 / 异步IO 说明:同步IO包含(阻塞IO / 非阻塞IO /IO多路复用),因为他们有个共同特性就是都需要内核态到用户态的一个等待. 基本概念解释,环境限定 ...
- redis连接数据库进行操作
该项目需要的类目录 1.首先我们需要创建我们的实体类 2.放置我们的dao层,在里面写入方法 3.配置类Appconfig需要加入我们的JdbcTemplate方法,因为我们用的是spring,所以需 ...