libusb簡要記錄

2021-07-16 21:35:34 字數 2166 閱讀 6160

in libusb-0.1.12:

: :usb_urb_transfer()

usb_urb_transfer() 大致上,僅僅提供了synchronous 的傳送方式(就是呼叫之後就等待它完成)。還有asynchronous 的方式(就是呼叫後就離開,將來urb 收/送完成後,系統會呼叫complete function)。

注意:這是libusb-0.1.12 並沒有提供asynchronous 的函式,但是kernel 的ioctl_usb_submiturb 工作方式卻都是asynchronous 的動作,等下追蹤kernel 的部份時就會知道。

usb_urb_transfer() 用ioctl_usb_submiturb 送出urb 之後,一直重複使用ioctl_usb_reapurbndelay 來收取completed urb ,並且把使用者傳入的timeout 切成1ms 的單位用select() 來等待。結果有幾種:

1. select() 等到了i/o 動作,reapurb 得到了某個completed urb ,返回值是所收送的data 長度。

2. select() 等不到i/o 動作,重複1ms 的select()等待,一直到timeout 了,返回值是-etimedout

繼續往kernel 的devio.c 追蹤. 首先從ioctl_usb_submiturb 開始找線索,因為這個是libusb 定義的i/o control code,kernel 裡相對應的是usbdevfs_submiturb i/o control code,負責處理這個i/o control code 的是proc_submiturb(ps, p); 其中ps 與p 分別是

struct dev_state *ps = file->private_data;

void __user *p = (void __user *)arg;

arg 是user 由ioctl system call 傳入的argument pointer,這裡傳入user urb。

ps是usbdev_open()時allocated得到的,定義為:

struct dev_state ;

可以把這個結構看成process對於這個device的傳送urb的狀態紀錄.其中兩個list分別是urb送出後就把對應的async由async_pending紀錄,等urb complete之後就把對應的async由async_completed紀錄,async是什麼呢?

對於每個urb都有乙個對應的async data structure,是在proc_do_submiturb()時allocate得到的 。

async的資料結構為:

struct async ;

對每個urb都有乙個async紀錄,在proc_do_submiturb()時allocate得到,同時它也會紀錄user urb的位置,將來可以把urb所得的資料copy回user urb。

整個urb的流程為:

proc_submiturb()

:把user's urb(user space)拷貝乙份到我們的uurb (kernel space)

->proc_do_submiturb():根據bulk,interrupt..等type分別initial一些字段,然後allocate async data structure (裡面還包含urb),然後放入ps->async_pending queue做紀錄,接著呼叫usb_submit_urb() (之後就交給usb host controller處理)然後不等結果就返回,所以我們說kernel這裡是以asynchronous的方式處理urb !

等usb host controller把urb處理完後,會呼叫async_complete(),async_complete()將async紀錄從ps->async_pending移到ps->completed.

另一方面user要透過ioctl_usb_reapurbndelay "收割"已完成的urb ,對應到kernel為usbdevfs_reapurbndelay。

這個i/o control會呼叫proc_reapurbnonblock(),它會巡視ps->completed是否有async紀錄,若無則返回-eagain,若有則把找到的urb (kernel space)資料拷貝到user space,並設定ioctl_urb_reapurbndelay時傳入的arg指向user space urb,至此,kernel傳送的部份已經完成。

IDA簡要記錄

name視窗中顯示顯示的名稱採用了顏色和字母編碼。其編碼方案總結如下 f 常規函式。ida認為這些函式不屬於庫函式 l 庫函式。ida通過簽名匹配演算法來識別庫函式。如果某個庫函式的簽名並不存在,則該函式將被標記為常規函式。i 匯入的名稱,通常為共享庫匯入的函式名稱。它與庫函式的區別在於 匯入的名稱...

pyinstaller使用簡要記錄

pip安裝 pip install pyinstallerpyinstaller 命令語法 pyinstaller 附加選項 python原始檔常用附加選項 作用例項 f只產生乙個可執行檔案,無其他過多依賴 pyinstaller f demo.py d除了exe以外 還會在dist中生成很多依賴檔...

Libusb交叉編譯

使用過usb的同學,應該都知道libusb這個庫。這個庫使用起來非常簡單,內部提供了強大的介面,下面我來總結一下 交叉編譯過程。1 編譯 libusb 1.0.9.tar.bz2 庫 1 解壓 tar xvf libusb 1.0.9.tar.bz2 cd libusb 1.0.9 2 使用 gcc...