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. getClassLoader

    类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编 ...

  2. Android自动化用例编写

    java -jar appcrawler.jar<路径> --demo java -jar  appcrawler.jar<路径> \ -c example.yml \ --c ...

  3. Flink RocksDB参数调优说明

    参数名 说明 state.backend.rocksdb.block.blocksize block 的大小,默认值为4KB.在生产环境中总是会适当调大一些,一般32KB比较合适,对于机械硬盘可以再增 ...

  4. [Swift]Xcode格式化代码快捷键

    写代码最常用的快捷键莫过于格式化代码了,最近玩Swift,百度上没有找到简单明了的内容,特意记录一下. Control + I     自动调整缩进 可以选中相应的代码 或 Command + A全选 ...

  5. C - Perform the Combo

    C - Perform the Combo 思路:当读到这个题的时候,第一反应就是枚举,但是,无线超时,没办法,那就变,利用前缀和,减少时间. 代码: #include<iostream> ...

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

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

  7. linux中大括号、小括号、中括号的区别和用法

    大括号 {  } 1.用于取多个变量 可以进行取变量和字符串拼接,假设:var='1234'       echo  ${var}abcd    输出为:1234abcd 2.正则表达式,用于大括号内 ...

  8. eNSP报错41解决方法

    1.点击右上角的菜单 2.工具>>注册设备,全部勾选,然后注册,就行了.

  9. 谷歌Chrome浏览器网页中看视频出现绿屏、闪烁和花屏等显示问题解决方法

    方法一(推荐): 1.在chrome地址栏输入chrome://flags/2.搜索Hardware-accelerated video encode把Enabled改成Disabled 3.搜索Ha ...

  10. vue项目运行出现warnings potentially fixable with the `--fix` option的报错问题

    vue-cil3 运行报错 warnings potentially fixable with the `--fix` option. 解决办法:"lint": "vue ...