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. linux下启动rabbitmq,redis,nginx

    这只是其中一种启动方法,也是我自己安装好后试过多次可以用的, 1,启动rabbitmq rabbitmqctl start_app rabbitmq程序端口是5672,可视化界面入口端口是15672, ...

  2. 5. nginx跨域配置

    1.跨域问题处理:在nginx相关接口上配置如下: 如接口有自己的请求头,则加上:如接口自带请求头pubacc-buid if ($request_method = "OPTIONS&quo ...

  3. ScrollView里面不能嵌套一个FlatList,这个需要如何通过FlatList自己单独实现

    1. 组件结构 2. 实现的效果图 3. 重点解释一些方法 (1)stickyHeaderIndices ,这个属性在ScrollView里面,FlatList也继承了该属性,其主要作用,会让第一个成 ...

  4. [Vue warn]: Do not use built-in or reserved HTML elements as component id: text 错误的解决办法

    引入的text 没用,要么注释掉,要么引用

  5. 软件工程日报八——AlertDiatog的使用

    今天学习了AlertDiatog的相关内容 AlertDialog可以在当前的界面上显示一个对话框,这个对话框是置顶于所有界面元素之上的,能够屏蔽掉其他控件的交互能力,因此AlertDialog一般是 ...

  6. [Javascript摸鱼记录] 关于js简单字符删减替换增加插入追加前中后处理

    以前总是怕死js如其名,能让我入坑润不出来,然后最近被迫写点静态html,又要用到数值运算处理, 于是又开启了「好几十个标签栏解决一个问题」的"探索路程",顺便记录一下摸鱼结果希望 ...

  7. 把pyecharts动图导入到PPT中

    如何把echarts 动图导入PPT 置顶 且听风来 2019-05-22 14:54:17 3347 收藏 6展开 首先看PPT是否开启插件,开启后 此处就有标志,然后就在你想插入的幻灯片处插入两个 ...

  8. Element--->>>最新骨架屏Skeleton使用

    首先,Element在最近的一次更新中(时间:2021-06-29) 新增了Skeleton骨架屏组件.Empty空状态组件. 那么在使用其自带组件Skeleton时,应将按照如下步骤使用: Ⅰ:如果 ...

  9. flutter Color和colors

    "Color(颜色)"是我们在设置应用程序界面样式时最常用到的属性. Flutter 中颜色设置的方式有很多种,其中最常用的有下列几种: Color c1 = Color(0xFF ...

  10. OC基础 - iOS在枚举赋值时为何采用左移格式

    枚举值 1 - iOS 枚举成员在赋值时往往是如下模式:左移对齐 2 - 为何这般设计 ?其一提高了阅读性:其二便于计算,能够更好的表达枚举值的含义 1 #import "ViewContr ...