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”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ...
随机推荐
- PaaS和SaaS的区别是什么?
PaaS是Platform-as-a-Service的缩写,意思是"平台即服务" SaaS是Software-as-a-Service的缩写,意思是"软件即服务" ...
- MYSQL 5.7及以上【ONLY_FULL_GROUP_BY】报错和解决方法
由于同事安装的Docker,就在docker上举例子吧,和非docker的操作方式都一样,只是路径上和重启方式可能不同 1,进入容器 docker exec -it xxxx(你的mysql容器名称) ...
- Mysql之迂回连接术
转载请注明来源:https://www.cnblogs.com/Sherlock-L/p/14932870.html 关键词:OmniDB.Mysql Router 背景:项目的测试数据库放在了生产机 ...
- RBAC(DAC)模型
基于角色的访问控制模型 ⟨ , ,,, , , ,, ,⟩ U:用户集 S:会话集 O:资源集 Op:操作集 R:角色集 PERMS:OxOp:权限集 RH:RXR(是 的偏序,表示角色的层次结构,其 ...
- .Net core 基础 创建及Nlog
一..Net Core 依赖注入 .net core3.1 之前的版本需要手动配置swagger.当前项目.net core5.0版本自动配置完成 跨域配置 1.下载依赖包 2. ...
- 13.java栈实现计算器
更新了代码,能跑通了,昨天果然是太晚了脑子混了,今天一看其实就差一句,在最后while循环的时候忘记把拿到的oper从栈里pop出去了,导致oper栈一直不空就要一直从数据栈中取数据进行计算所以一直在 ...
- JS中立即执行函数和闭包的区别
函数声明规则:必须指定一个函数名字 foo(); function foo() { console.log("函数声明") } 由于函数声明会被提升,所以调用函数可以在之前或之后调 ...
- 尚硅谷大数据技术之Kettle软件介绍与使用方法
ETL(Extract-Transform-Load的缩写,即数据抽取.转换.装载的过程),对于企业或行业应用来说,我们经常会遇到各种数据的处理,转换,迁移,所以了解并掌握一种ETL工具的使用,必不可 ...
- [笔记] 什么是Groovy?什么是Kotlin?
关于Groovy 参考文章 https://www.w3cschool.cn/groovy/ 摘抄如下: Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Jav ...
- QT管理网络状态和网络连接
参考:http://www.cleartechfei.com/2020/07/qt%E4%BD%BF%E7%94%A8http%E5%8D%8F%E8%AE%AE/ 1. 用Qt框架进行应用开发的过程 ...