”吐槽“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.块设备可以随机访问,字符设备只能顺序访问. 块设备的访问:当 ...
随机推荐
- Couchbase V(管理任务)
Couchbase V(管理任务) 多读写 在Couchbase2.1中支持硬盘多读些(Multi- Readers and Writers),一般双核4G服务默认3个thread 4核16G内存一个 ...
- prototype 和function关系等总结
js提供了一些内置类,如Array String Function等,只要有类就有原型. 1,function ,属性包括 arguments, caller,length,name ,prototy ...
- Junit中Assert.assertEquals()和Assert.assertSame方法有什么异同
1)提供的接口数量不完全相同.assertEquals支持boolean,long,int等等java primitiveType变量.assertSame只支持Object. 2)比较的逻辑不同,结 ...
- zookeeper一二三
1.zookeeper介绍 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅. ...
- powerDigner使用
PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...
- html5 拖拽元素
利用html5实现元素的拖拽,让拖动元素在指定的容器中拖动. 注意点:1.被拖元素要设置拖动属性.draggable="true" 2.容器元素要设置阻止默认事件处理 实现效果图如 ...
- xml文件的schema也是经过jdk编译器编译的,如果xsd没引入完整,而xml中又用到了这些标签,就会编译不通过啊。
1.xml文件的schema也是经过jdk编译器编译的,如果xsd没引入完整,而xml中又用到了这些标签,就会编译不通过啊. 2.java编译器会下载xsd的指定链接文件,加在代码里,一起编译
- eclipse工程设置项目jre
Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.当我们导入已经存在项目或者通过svn引入项目时经常出现红叉叉的情 ...
- datatable使用介绍
Datatables是一款jquery表格插件.它是一个高度灵活的工具,可以将任何HTML表格添加高级的交互功能. 1.支持分页:前台分页和后台分页 前台分页:后台一次把数据传过来,交给前端渲染.缺点 ...
- CentOS里route命令详解
Route 功能简述:linux系统中的route命令能够用于IP路由表的显示和操作.它的主要作用是创建一个静态路由让指定一个主机或者一个网络通过一个网络接口,如eth0.当使用"add&q ...