USB/IP项目总结
青云最近推出了云桌面功能,用户可以像使用本地计算机一样访问远程主机,支持USB重定向,不禁让我想起了2年前调试的一个开源项目USB/IP,当时还用英文写了一个总结性文档,放在这里方便以后查看。
USB/IP Summary
Abstract
The USB/IP project aims to provide users with the ability to access remote USB devices via IP network.
From a user’s perspective, there is no difference from accessing USB devices those plugged into your
local machine physically. The project is opened source and could be built into newer Linux kernel by
proper configuration. The shortage is that there is no official document demonstrating the architecture
and overall structure of it. This is part of the reason for the coming of this document.
Client/Server Model
The machine which a USB device physically attached is the server with a Linux system running upon, and the
machine from where a user access USB resource is the client, it can either be a Linux or a Windows box.
In the following section we will describe the structure of this project, how client talks to server and vice versa.
For simplicity, we will omit case that using a Linux box as the client side machine, and only discuss the topic
according to the following diagram.
Windows Client
There are two parts in client side, the user space tool and the underlying virtual bus driver; within this document
we will refer them to usbip.exe and USBIPEnum.sys, respectively. Firstly, a user launch usbip.exe to query exported
USB devices from a server, and he or she might decide to import a device if there is one available. If the import
request succeeded, usbip.exe would send an IRP to USBIPEnum.sys informing it to create a physical device object
which representing a real USB device plugged into the client machine. Certainly, there is no real device attached to
the client machine, but our system will treat it as a real one without aware. The system will then send many IRPs to
our virtual bus driver for querying purpose, such as device capability querying, device hardware ID querying and so
on. Some queries have nothing to do with the actual device on server side, and our virtual bus driver will finish them
immediately. But when the user access the data store on the remote USB device, our bus driver would receive IRPs
those associated with URBs (USB request block), the bus driver could not give her back the data required immediately.
In this case, USBIPEnum.sys will look up whether there is a pending read request from usbip.exe, and if
(1):
There is indeed one pending read request; USBIPEnum.sys will feed the read quest with a URB properly, the IRP is
enqueued and set to pending state. Till this time, the read operation from usbip.exe will successfully returned,
usbip.exe will then imbed the URB in a package according to the protocol between client and server and send this
package to the server. Usbip.exe always waits on a socket, when it receives a package from the server, it will call
WriteFile() API to write the package to our virtual USB device. Upon receiving the write IRP, USBIPEnum.sys gets
data from this write IRP and feeds the former pending IRP with appropriate data, and then that pending IRP would
be completed successfully, it would be de-queued subsequently.
(2):
There is no pending read request; the IRP will be enqueued and set to pending state. If there comes
a read request from usbip.exe some times later, USBIPEnum.sys will search through the queue to get
an IRP which has not been sent to the server. When it finds one, it will feed the read operation with info
from that found IRP, and all subsequent behaviors will be exactly the same as (1) above.
Linux Server
Similar to the client side, there are also two parts in server side, the user space tool usbipd and the driver part. Here
we will omit the discussion of usbip tool which used to list USB devices in the system or bind the USB device to our
driver. Usbipd is a tool to meet the requirement from the client side, for example exported devices querying and import
requesting.After usbipd exported a device to a client, a TCP connection would be established between them. Usbipd
will then send this TCP connection information to the underlying usbiphost driver, the latter will then start two threads
for receiving and sending purposes, respectively. The receiving thread will then wait on the established TCP connection
port to get request from client side. When the receiving thread gets a submit command from the client, it extract info
from the package and allocate an URB, set info into this URB appropriately and submit it to the USBCore. When the
system finish handling this URB, the sending thread in usbip-
host driver will be awaked, it will package the result of this URB and send to the client. There is also another driver named
usbip-core, which maintains an event handler loop. The event handler loop is started by usbip-host driver by invoking a
method exported by usbip-core. Before starting the event handler, usbip-host driver set some procedures for usbip
core for calling back purpose. For example, when a shutdown event happens, usbip-host will set the event bit, and usbip-
core will be noticed latterly, it then invokes the shutdown event handler which defined in usbip-host driver.
Kernel Debugging
Client: VMWare+Windbg
Windbg runs on your host machine, it connects to Windows client (XP, Win7) runs on virtual machine via named pipe.
System that runs on virtual machine imports USB device from remote Linux server.
Server: VMWare+KGDB
Both systems can run on a virtual machine, one is a debugger that run GDB and the other is a debug gee which act as
a server.Your physical USB device attached to the latter one. The debug gee must be built with kernel debugging switch
enabled and some other switch enabled if needed. One might encounter some configuration problems while playing with
this stuff, and there are many web sites you could go for help.
Prerequisite Knowledge
The developer should be familiar with these concepts: Windows Driver Model, IRP, URB, Pending state, etc.
USB/IP项目总结的更多相关文章
- Nginx 实现 IP+项目名 访问
参考: https://blog.csdn.net/csdn1152789046/article/details/51362735 修改前 项目放在Tomcat的webapps/ROOT/ 目录下面 ...
- 免费开源的获取代理ip项目
地址:https://github.com/awolfly9/IPProxyTool 根据教程获取ip,项目使用Python语言写的,正好可以让前些日子学了点Python皮毛的我长长见识: ip都是会 ...
- Tomcat不需要输入项目名便可访问项目(直接用域名或者ip)
一般需要输入项目名访问项目是怎么个方法呢? 直接将项目放在 tomcat 安装目录的 webapps 目录下, 然后在域名或者ip后面 域名(ip)/项目目录, 这样会显得比较麻烦. 那么应该怎么才可 ...
- 如何在tomcat部署项目(用ip访问)
找了好长时间的错误,server.xml中一点错误也没有,但就是访问不到,最终发现就是服务器没有开放80端口的缘故. 服务器是Windows系统 1.控制面板=>系统和安全=>Window ...
- Linux usb 5. usbip (USB Over IP) 使用实例
文章目录 0. 简介 1. Server 配置 2. Client 配置 参考资料 0. 简介 USB Over IP 是一种应用很多的场景,目前已经有现成的解决方案 usbip.linux 和 wi ...
- STM32 USB虚拟串口(转)
源:STM32 USB虚拟串口 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片 ...
- STM32 USB虚拟串口
串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片上的USB虚拟串口的移植.在官方 ...
- [转]C,C++开源项目中的100个Bugs
[转]C,C++开源项目中的100个Bugs http://tonybai.com/2013/04/10/100-bugs-in-c-cpp-opensource-projects/ 俄罗斯OOO P ...
- C,C++开源项目中的100个Bugs
俄罗斯OOO Program Verification Systems公司用自己的静态源码分析产品PVS-Studio对一些知名的C/C++开源项目,诸如Apache Http Server.Chro ...
随机推荐
- ORA-02437 违反主键
在给study用户下的semp表建立主键的时候,出现以下错误:SQL> alter table semp add constraint pk_emp primary key(empno);alt ...
- Educational Codeforces Round 26
Educational Codeforces Round 26 困到不行的场,等着中午显示器到了就可以美滋滋了 A. Text Volume time limit per test 1 second ...
- 【UML】9种图+包图
导读:在UML的学习中,介绍了9种图,外加一个包图.这9种图和4大关系,可以说是UML的一个核心内容.我根据自己的笔记,以及查阅的一些资料,对这9种图和包图,做一个总结. 一.基本定义 1.1 总体 ...
- Azure Storage Blob文件重命名
Azure Storage的SDK并没有提供文件重命名的方法,而且从StorageExplorer管理工具里操作修改文件名的时候也有明确提示: 是通过复制当前文件并命名为新文件名再删除旧文件,不保存快 ...
- ios sqlite 简单使用
// // ViewController.m // sqlitedemo // // Created by lam_TT on 15-4-11. // Copyright (c) 2015年 lam_ ...
- 【Luogu】P1593因子和(唯一分解定理,约数和公式)
题目链接 首先介绍两个定理. 整数唯一分解定理:任意正整数都有且只有一种方式写出素数因子的乘积表达式. \(A=(p1k1 p2k2 ...... pnkn \) 求这些因子的代码如下 ;i*i< ...
- [UOJ#219][BZOJ4650][Noi2016]优秀的拆分
[UOJ#219][BZOJ4650][Noi2016]优秀的拆分 试题描述 如果一个字符串可以被拆分为 AABBAABB 的形式,其中 A 和 B 是任意非空字符串,则我们称该字符串的这种拆分是优秀 ...
- [BZOJ4992] [Usaco2017 Feb]Why Did the Cow Cross the Road(spfa)
传送门 把每个点和曼哈顿距离距离它3步或1步的点连一条边,边权为3 * t + a[x][y] 因为,走3步,有可能是3步,也有可能是1步(其中一步拐了回来) 最后,把终点和曼哈顿距离距离它1步和2布 ...
- 洛谷P2498 [SDOI2012]拯救小云公主 【二分 + 并查集】
题目 英雄又即将踏上拯救公主的道路-- 这次的拯救目标是--爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等级1 ...
- 【CCF】棋局评估
博弈论极小极大搜索,记忆化+状压 #include<iostream> #include<cstdio> #include<string> #include< ...