usbip:(一)初识

三、windows客户端
客户端包括两部分:用户态程序和底层虚拟总线驱动程序,在此,我们将他们分别叫做usbip.exe和USBIPEnum.sys。首先,用户启动usbip.exe,查询当前系统中可用的usb设备,然后决定是否导入可用的设备,如果请求导入成功,usbip.exe将向USBIPEnum.sys发送呢一个IRP,通知它创建一个物理设备对象,该对象标示插入客户机的实际usb设备,当然,并没有真正的设备连接到客户机上,但是会把它当做一个真实的usb设备。然后系统向我们的虚拟总线驱动程序发送很多个IRP,以方便查询,如设备能力,硬件id等。在服务器侧,一些查询什么都没做,以便虚拟总线程序快速完成。当我们访问远程的usb设备的存储时,我们的总线驱动程序将接收与URBs(USB请求快)相关的IRP,并不会立即把数据给URBs。在本例中,使用USBIPEnum,系统将查找是否有来自usbip的挂起或者读取请求。
(1):
确实有一个未处理的读取请求,USBIPEnum会为读取任务提供一个URB,并将IRP入队,并设置为挂起状态,到此,usbip将成功返回,然后usbip将根据客户端和服务器之间的协议将URB追加到一个包中,并发送到服务器。然后,usbip进入等待状态,当接收到服务器的数据时,他会调用WriteFile将包写入到我们的虚拟usb设备,当收到写入IRP后,USBIPEnum从这个IRP获取数据,并向前一个挂起的IRP提供数据,然后挂起的IRP将成功完成,随后取消等待状态。
(2):
没有挂起的读取请求,IRP将排队并设置为挂起状态。如果usbip发出读取请求,几次之后,USBIPEnum将搜索队列以获取尚未发送到服务器的IRP。当她找到一个IRP时,将向读取操作提供未发送的IRP信息,后续行为与(1)完全相同。
四、Linux服务器
与客户端类似,服务器也有两个部分,用户程序usbipd和驱动程序部分。在这里我们省略usbip工具的讨论,该工具用于列出系统中的usb设备或者将usb设备绑定到我们的驱动程序。usbipd是一个查询客户端状态的工具,例如导入设备查询和导入请求,usbipd将设备导出到客户端后,将在他们之间建立tcp连接。然后将这个连接的信息发送到底层的usbiphos驱动程序,后者启动两个线程,分别用户接受和发送,然后,接收线程将在已建立的tcp连接端口上等待,以从客户端获取请求。当接受线程从客户端获取到指令时,它从包中获取信息,并分配一个URB,将信息适当的设置到URB中,然后提交给USBCore。
当系统中处理完这个URB后,usbipHost驱动程序中的发送线程将被唤醒,它将打包这个URB的结果并发送给客户端。还有一个usbip core的程序,它维护一个事件处理。事件处理程序由usbipHost通过调用usbCore导出的方法启动。在启动事件出来之前,usbiphost为usbipcore设置了一些过程,例如关机事件发生时,usbiphost将启动事件,并发送到usbipcore,然后调用usbip主机驱动程序定义的关机事件进行处理。
usbip:(一)初识的更多相关文章
- Android动画效果之初识Property Animation(属性动画)
前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...
- 初识Hadoop
第一部分: 初识Hadoop 一. 谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...
- python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)
一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...
- 初识IOS,Label控件的应用。
初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...
- UI篇(初识君面)
我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- 初识SpringMvc
初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...
- 初识redis数据类型
初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...
- Redis初识、设计思想与一些学习资源推荐
一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...
- MongoDB【第一篇】MongodDB初识
NoSQL介绍 一.NoSQL简介 NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ...
随机推荐
- getClassLoader
类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编 ...
- Android自动化用例编写
java -jar appcrawler.jar<路径> --demo java -jar appcrawler.jar<路径> \ -c example.yml \ --c ...
- Flink RocksDB参数调优说明
参数名 说明 state.backend.rocksdb.block.blocksize block 的大小,默认值为4KB.在生产环境中总是会适当调大一些,一般32KB比较合适,对于机械硬盘可以再增 ...
- [Swift]Xcode格式化代码快捷键
写代码最常用的快捷键莫过于格式化代码了,最近玩Swift,百度上没有找到简单明了的内容,特意记录一下. Control + I 自动调整缩进 可以选中相应的代码 或 Command + A全选 ...
- C - Perform the Combo
C - Perform the Combo 思路:当读到这个题的时候,第一反应就是枚举,但是,无线超时,没办法,那就变,利用前缀和,减少时间. 代码: #include<iostream> ...
- KingbaseES V8R6集群运维案例之---repmgr standby promote应用案例
案例说明: 在容灾环境中,跨区域部署的异地备节点不会自主提升为主节点,在主节点发生故障或者人为需要切换时需要手动执行切换操作.若主节点已经失效,希望将异地备机提升为主节点. $bin/repmgr s ...
- linux中大括号、小括号、中括号的区别和用法
大括号 { } 1.用于取多个变量 可以进行取变量和字符串拼接,假设:var='1234' echo ${var}abcd 输出为:1234abcd 2.正则表达式,用于大括号内 ...
- eNSP报错41解决方法
1.点击右上角的菜单 2.工具>>注册设备,全部勾选,然后注册,就行了.
- 谷歌Chrome浏览器网页中看视频出现绿屏、闪烁和花屏等显示问题解决方法
方法一(推荐): 1.在chrome地址栏输入chrome://flags/2.搜索Hardware-accelerated video encode把Enabled改成Disabled 3.搜索Ha ...
- vue项目运行出现warnings potentially fixable with the `--fix` option的报错问题
vue-cil3 运行报错 warnings potentially fixable with the `--fix` option. 解决办法:"lint": "vue ...