USB/IP 总结
 
一、概要:
  USB/IP项目的目标是为用户提供通过网络远程访问usb设备的能力。在用户看来,访问usb设备和访问插入到本地电脑的设备没什么区别,该项目是开源的,可以用过适当的配置构建到更新的linux内核中。
  
二、客户端/服务器模型:
  usb设备物理连接的机器运行的是linux系统,作为服务器。用户访问usb资源的机器作为客户端,可以使linux或者windows系统。在下一节中,将讨论客户机与服务器是如何交互的,在此将省略linux客户端的情况,只根据下图进行讨论。

三、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:(一)初识的更多相关文章

  1. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  2. 初识Hadoop

    第一部分:              初识Hadoop 一.             谁说大象不能跳舞 业务数据越来越多,用关系型数据库来存储和处理数据越来越感觉吃力,一个查询或者一个导出,要执行很长 ...

  3. python学习笔记(基础四:模块初识、pyc和PyCodeObject是什么)

    一.模块初识(一) 模块,也叫库.库有标准库第三方库. 注意事项:文件名不能和导入的模块名相同 1. sys模块 import sys print(sys.path) #打印环境变量 print(sy ...

  4. 初识IOS,Label控件的应用。

    初识IOS,Label控件的应用. // // ViewController.m // Gua.test // // Created by 郭美男 on 16/5/31. // Copyright © ...

  5. UI篇(初识君面)

    我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...

  6. Python导出Excel为Lua/Json/Xml实例教程(一):初识Python

    Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...

  7. 初识SpringMvc

    初识SpringMvc springMvc简介:SpringMVC也叫Spring Web mvc,属于表现层的框架.Spring MVC是Spring框架的一部分,是在Spring3.0后发布的 s ...

  8. 初识redis数据类型

    初识redis数据类型 1.String(字符串) string是redis最基本的类型,一个key对应一个value. string类型是二进制安全的.意思是redis的string可以包含任何数据 ...

  9. Redis初识、设计思想与一些学习资源推荐

    一.Redis简介 1.什么是Redis Redis 是一个开源的使用ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.从2010 年 ...

  10. MongoDB【第一篇】MongodDB初识

    NoSQL介绍 一.NoSQL简介 NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ...

随机推荐

  1. 针对单一key加读写锁

    一.什么是读写锁 读写锁是JDK1.5提供的一个工具锁,适用于读多写少的场景,将读写分离,从而提高并发性. 二.读写锁的特点 读锁是共享锁,写锁是排他锁,读锁和写锁不能同时存在: 读锁不能升级为写锁: ...

  2. file、blob、base64相互转换

    blob blob转file const blob = '.....' const file = new File([blob], 'name.wav', {type: 'audio/wav'}); ...

  3. 自定义注解获取请求Header中的值

    前言 这几天开发一个项目,为了方便,前台将当前登陆人的ID和名称放在每个请求的Header中(这里不考虑安全性之类的),这样后台只要需要用到,就直接从Header中get出来就可以了. 后台实现方法 ...

  4. 「postOI」Colouring Game

    题意 有 \(n\) 个格子排成一行,一开始每个格子上涂了蓝色或红色. Alice 和 Bob 用这些格子做游戏.Alice 先手,两人轮流操作: Alice 操作时,选择两个相邻的格子,其中至少要有 ...

  5. PyQt5模块说明

    pyqt5的类别分为几个模块,包括以下: QtCoreQtGuiQtWidgetsQtMultimediaQtBluetoothQtNetworkQtPositioningEnginioQtWebSo ...

  6. KingbaseES V8R6集群运维案例之---repmgr standby promote应用案例

    案例说明: 在容灾环境中,跨区域部署的异地备节点不会自主提升为主节点,在主节点发生故障或者人为需要切换时需要手动执行切换操作.若主节点已经失效,希望将异地备机提升为主节点. $bin/repmgr s ...

  7. js match方法

    1.用法 match()方法可以字符串中检索指定的值,或者是匹配一个或多个正则表达式 2.返回值 该方法类似于indexOf()/lastIndexOf(),区别就是返回值不一样 indexOf()/ ...

  8. iis发布后设置文件夹用户安全权限

    发布iis后异常截图: 401 - Unauthorized: Access is denied due to invalid credentials.You do not have permissi ...

  9. SQL_TIP_JOIN_x

    没有条件的JOIN会导致数据数量变为两表的数据量的乘积结果. 用ON来在这些结果里进行筛选 on T1.A = T2.A的时候,如果T1的A是不重复的,则实际上是在对T2现有数据做筛选,结果数据量&l ...

  10. JAVA学习笔记-06

    多态:可以理解为事物存在的多种体现形态 1.多态的基本体现 父类的引用指向了自己的子类对象 父类的引用也可以接收自己的子类对象 2.多态的前提 必须是类与类之间有关系,要么继承,要么实现 通常还有一个 ...