網(wǎng)絡驅(qū)動數(shù)據(jù)傳輸有兩個隊列:接收隊列和發(fā)送隊列王悍;每個隊列都對應一個virtqueue,兩個隊列之間是互不影響的。
當兩個queue都需要客戶機填充buffer贷岸,ReceiveQueue需要客戶機 driver提前填充分配好的空buffer,然后記錄到availRing,并在恰當?shù)臅r機通知后端,當外部網(wǎng)絡有數(shù)據(jù)包到達時疆液,qemu后端就從availRing 中獲取一個buffer,然后填充數(shù)據(jù)陕贮,完事后記錄buffer head index到usedRing.最后在恰當?shù)臅r機通知客戶機(向客戶機注入中斷)堕油,客戶機接收到信號便知道有數(shù)據(jù)包到達,這里只需要從usedRing 中獲取到index肮之,然后取data數(shù)組的第i個元素即可掉缺。因為在客戶機填充buffer的時候把邏輯buffer的指針保存在data數(shù)組中。
而SendQueue同樣需要客戶機去填充戈擒,只不過這里是當客戶機需要發(fā)送數(shù)據(jù)包時眶明,把數(shù)據(jù)包構造成邏輯buffer,然后填充到send Queue,并在恰當?shù)臅r機通知后端筐高,qemu后端收到通知就知道那個隊列有請求到達搜囱,如果當前沒有處理其他數(shù)據(jù)包就著手處理這個數(shù)據(jù)包。具體就同樣是從AvailRing中取出buffer head index柑土,然后從描述符表中get到buffer蜀肘,這時就需要從buffer中copy數(shù)據(jù)了,因為要把數(shù)據(jù)包從host發(fā)送出去冰单,然后更新usedRing幌缝。最后同樣要在恰當?shù)臅r機通知客戶機。注意這里客戶機同樣需要從usedRing 中get index诫欠,但是這里主要是用于delay notify,因為數(shù)據(jù)包由客戶機構造涵卵,其占用的buffer并不能重復使用,只是每次有數(shù)據(jù)包就把其構造成buffer而已荒叼。
以上便是基本的使用sendqueue和receive的原理轿偎。