0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

virtio I/O通信流程及設(shè)備框架的實(shí)現(xiàn)

openEuler ? 來源:openEuler ? 作者:openEuler ? 2022-03-10 13:37 ? 次閱讀

virtio 是一種通用的半虛擬化的 I/O 通信協(xié)議,提供了一套前后端 I/O 通信的的框架協(xié)議和編程接口。根據(jù)該協(xié)議實(shí)現(xiàn)的設(shè)備通過前后端的配合,相比全模擬設(shè)備可以大幅減少陷入陷出以及內(nèi)存拷貝的次數(shù),使 guest 獲得高效的 I/O 性能。作為目前虛擬化標(biāo)準(zhǔn)的通用協(xié)議規(guī)范,經(jīng)歷了 0.95、1.0、1.1 三個(gè)版本的演進(jìn)。根據(jù) 0.95 版本實(shí)現(xiàn)的稱為傳統(tǒng) virtio 設(shè)備,1.0 版本修改了一些 PCI 配置空間的訪問方式和 virtioqueue 的優(yōu)化和特定設(shè)備的約定,1.1 版本則增加了 packed virtqueue 的支持,詳細(xì)可以參考官方發(fā)布的 virtio 協(xié)議規(guī)范。

之所以稱 virtio 是一種半虛擬化的解決方案,是因?yàn)槠涫紫刃枰谥鳈C(jī)側(cè)通過軟件創(chuàng)建 virito 的后端設(shè)備,其次在 Guest 要有對(duì)應(yīng)的設(shè)備前端驅(qū)動(dòng),前后端通過共享內(nèi)存進(jìn)行通信。virtio 規(guī)范定義了設(shè)備的控制和數(shù)據(jù)面接口,控制面接口包括設(shè)備狀態(tài)、feature 的協(xié)商等,數(shù)據(jù)面則包括共享內(nèi)存的數(shù)據(jù)布局定義以及前后端的通知方式?;?virtio 協(xié)議,目前已衍生出了 virtio-blk、virtio-net、virtio-scsi、virtio-mem 等各種各樣的半虛擬化設(shè)備。virtio 設(shè)備可以支持多種傳輸層協(xié)議,既可以掛載到 MMIO 總線,也可以作為 PCI 設(shè)備,另外還可以支持基于標(biāo)準(zhǔn) I/O 通道機(jī)制的 S/390 設(shè)備。

4963ac88-a026-11ec-952b-dac502259ad0.png

鑒于 virtio 設(shè)備具備較好的性能及通用性,StratoVirt 自然也支持,StratoVirt 中 virtio 設(shè)備的實(shí)現(xiàn)架構(gòu)以及 I/O 通信流程如上圖所示。下面就基于目前最新的代碼,探究一下 StratoVirt 中 virtio 設(shè)備的代碼實(shí)現(xiàn)框架。

VirtioDevice Trait

StratoVirt 的 virtio crate 提供了 virtio 設(shè)備的通用接口以及所有 virtio 設(shè)備的相關(guān)實(shí)現(xiàn)。其中,lib.rs 中定義了為所有 virtio 設(shè)備定義的 VirtioDevice Trait。每種 virtio 設(shè)備都需要實(shí)現(xiàn)自定義的 VirtioDevice 接口。

///Thetraitforvirtiodeviceoperations.
pubtraitVirtioDevice:Send{
///Realizelowleveldevice.
fnrealize(&mutself)->Result<()>;

///Unrealizelowleveldevice
fnunrealize(&mutself)->Result<()>{
bail!("Unrealizeofthevirtiodeviceisnotimplemented");
}

///Getthevirtiodevicetype,refertoVirtioSpec.
fndevice_type(&self)->u32;

///Getthecountofvirtiodevicequeues.
fnqueue_num(&self)->usize;

///Getthequeuesizeofvirtiodevice.
fnqueue_size(&self)->u16;

///Getdevicefeaturesfromhost.
fnget_device_features(&self,features_select:u32)->u32;

///Setdriverfeaturesbyguest.
fnset_driver_features(&mutself,page:u32,value:u32);

///Readdataofconfigfromguest.
fnread_config(&self,offset:u64,data:&mut[u8])->Result<()>;

///Writedatatoconfigfromguest.
fnwrite_config(&mutself,offset:u64,data:&[u8])->Result<()>;

///Activatethevirtiodevice,thisfunctioniscalledbyvcputhreadwhenfrontend
///virtiodriverisreadyandwrite`DRIVER_OK`tobackend.
///
///#Arguments
///
///*`mem_space`-Systemmem.
///*`interrupt_evt`-Theeventfdusedtosendinterrupttoguest.
///*`interrupt_status`-Theinterruptstatuspresenttoguest.
///*`queues`-Thevirtioqueues.
///*`queue_evts`-Thenotifiereventsfromguest.
fnactivate(
&mutself,
mem_space:Arc,
interrupt_cb:Arc,
queues:&[Arc>],
queue_evts:Vec,
)->Result<()>;

///Deactivatevirtiodevice,thisfunctionremoveeventfd
///ofdeviceoutoftheeventloop.
fndeactivate(&mutself)->Result<()>{
bail!(
"Resetthisdeviceisnotsupported,virtiodevtypeis{}",
self.device_type()
);
}

///Resetvirtiodevice.
fnreset(&mutself)->Result<()>{
Ok(())
}

///UpdatethelowlevelconfigofMMIOdevice,
///forexample:updatetheimagesfilefdofvirtioblockdevice.
///
///#Arguments
///
///*`_file_path`-Therelatedbackendfilepath.
fnupdate_config(&mutself,_dev_config:OptiondynConfigCheck>>)->Result<()>{
bail!("Unsupportedtoupdateconfiguration")
}
}
  • realize()/unrealize(): 這一組接口用于具現(xiàn)化/去具現(xiàn)化具體的 virtio 設(shè)備。具現(xiàn)化做的一些具體操作包括設(shè)置支持的 features、設(shè)備特有的屬性(如網(wǎng)卡的 mac)、初始化連接 Host 后端設(shè)備等。
  • set_driver_features():將前端驅(qū)動(dòng)支持的 features 與后端模擬設(shè)備支持的 features 進(jìn)行協(xié)商后,設(shè)置最終實(shí)現(xiàn)的 features。
  • read_config()/write_config():virtio 協(xié)議規(guī)范為每種 virtio 設(shè)備定義了自定義的配置空間,這組接口就是用來讀寫這部分配置數(shù)據(jù)。
  • activate()/deactivate(): 激活/去激活設(shè)備,負(fù)責(zé)綁定/解綁后端、加入/移除 I/O 循環(huán)。
  • reset():虛擬機(jī)重啟時(shí)某些設(shè)備需要重置。
  • update_config():支持輕量機(jī)型下的 virtio-mmio 設(shè)備動(dòng)態(tài)綁定/解綁后端,實(shí)現(xiàn) virtio-mmio 設(shè)備的模擬熱插拔。

virtqueue

499e7368-a026-11ec-952b-dac502259ad0.png

virtio 設(shè)備可以有一個(gè)或多個(gè)隊(duì)列,每個(gè)隊(duì)列有描述符表、available ring、used ring 三個(gè)部分。當(dāng)前 StratoVirt 的 virtio 設(shè)備均遵循 1.0 規(guī)范,隊(duì)列的內(nèi)存布局僅支持 Split Vring 的方式。queue.rs 中定義了一系列針對(duì)隊(duì)列操作及查詢的接口。所有的 I/O 請(qǐng)求數(shù)據(jù)信息以描述符的形式存放在描述符表中,前端準(zhǔn)備好數(shù)據(jù)后更新 available ring 告訴后端還有哪些 I/O 待發(fā)送,后端執(zhí)行完 I/O 更新 used ring 通知前端。不同設(shè)備的 I/O 處理不盡相同,但是核心的 virtqueue 操作是一樣的。

pubstructSplitVring{
///Regioncacheinformation.
pubcache:Option,
///Guestphysicaladdressofthedescriptortable.
///Thetableiscomposedofdescriptors(SplitVringDesc).
pubdesc_table:GuestAddress,

///Guestphysicaladdressoftheavailablering.
///Theringiscomposedofflags(u16),idx(u16),ring[size](u16)andused_event(u16).
pubavail_ring:GuestAddress,

///Guestphysicaladdressoftheusedring.
///Theringiscomposedofflags(u16),idx(u16),used_ring[size](UsedElem)andavail_event(u16).
pubused_ring:GuestAddress,

///Hostaddresscache.
pubaddr_cache:VirtioAddrCache,

///Indicatewhetherthequeueconfigurationisfinished.
pubready:bool,

///Themaximalsizeinelementsofferedbythedevice.
pubmax_size:u16,

///Thequeuesizesetbyfrontend.
pubsize:u16,

///Interruptvectorindexofthequeueformsix
pubvector:u16,

///Thenextindexwhichcanbepoppedintheavailablevring.
next_avail:Wrapping<u16>,

///Thenextindexwhichcanbepushedintheusedvring.
next_used:Wrapping<u16>,

///Theindexoflastdescriptorusedwhichhastriggeredinterrupt.
last_signal_used:Wrapping<u16>,
}

virtio-mmio 設(shè)備

StratoVirt 目前提供兩種機(jī)型:輕量機(jī)型和標(biāo)準(zhǔn)機(jī)型。輕量機(jī)型由于需要追求極致的啟動(dòng)速度以及內(nèi)存底噪開銷,因此只支持掛載數(shù)量有限的 virtio-mmio 設(shè)備。而標(biāo)準(zhǔn)機(jī)型面向傳統(tǒng)的標(biāo)準(zhǔn)云化場(chǎng)景,對(duì)于 I/O 設(shè)備的性能要求較高,且需要支持熱插拔滿足資源彈性,因此標(biāo)準(zhǔn)機(jī)型支持將 virtio 設(shè)備以 PCI 設(shè)備掛載在模擬的 PCI 總線上。目前標(biāo)準(zhǔn)機(jī)型只支持配置 virtio-pci 設(shè)備,不支持 virtio-mmio 設(shè)備。

結(jié)構(gòu)體 VirtioMmioDevice 定義了一個(gè)通用的 virtio-mmio 設(shè)備,其中的 device 即為實(shí)現(xiàn)了 VirtioDevice 這個(gè) trait 的具體的 virtio 設(shè)備結(jié)構(gòu),可以是網(wǎng)卡、磁盤等。VirtioMmioState 結(jié)構(gòu)體中存放了 virtio-mmio 設(shè)備的控制寄存器,并且為其實(shí)現(xiàn)了對(duì)應(yīng)的讀寫接口 read_common_config()/write_common_config()。virtio-mmio 設(shè)備的配置空間布局如下圖所示:

49b533a0-a026-11ec-952b-dac502259ad0.png

interrupt_evt 通過 irqfd 向虛擬機(jī)注入中斷,host_notify_info 則為每個(gè)隊(duì)列創(chuàng)建了一個(gè) eventfd,虛擬機(jī)利用 ioeventfd 機(jī)制陷出到 StratoVirt 執(zhí)行后端的 I/O 處理。

pubstructVirtioMmioDevice{
//Theentityoflowleveldevice.
pubdevice:ArcdynVirtioDevice>>,
//EventFdusedtosendinterrupttoVM
interrupt_evt:EventFd,
//Interruptstatus.
interrupt_status:Arc,
//HostNotifyInfousedforguestnotifier
host_notify_info:HostNotifyInfo,
//Thestateofvirtiommiodevice.
state:VirtioMmioState,
//Systemaddressspace.
mem_space:Arc,
//Virtioqueues.
queues:Vec>>,
//SystemResourceofdevice.
res:SysRes,
}

VirtioMmioDevice 實(shí)現(xiàn)了 realize 接口完成設(shè)備的具現(xiàn)化:

  1. 調(diào)用各設(shè)備實(shí)現(xiàn)的 VirtioDevice trait 的具現(xiàn)化接口。
  2. virtio-mmio 設(shè)備掛載在了系統(tǒng)總線上,StratoVirt 為每個(gè)設(shè)備分配 512 字節(jié)的配置空間。除此之外,需要為其注冊(cè) irqfd 以便后續(xù) I/O 完成后向虛擬機(jī)注入中斷。這些信息都保存在 SysRes 數(shù)據(jù)結(jié)構(gòu)中。
  3. 添加內(nèi)核啟動(dòng)參數(shù),通過內(nèi)核啟動(dòng)參數(shù)將設(shè)備的內(nèi)存區(qū)間及中斷號(hào)信息直接告訴 Guest。
pubfnrealize(
mutself,
sysbus:&mutSysBus,
region_base:u64,
region_size:u64,
#[cfg(target_arch="x86_64")]bs:&Arc>,
)->ResultSelf>>>{
self.device
.lock()
.unwrap()
.realize()
.chain_err(||"Failedtorealizevirtio.")?;

ifregion_base>=sysbus.mmio_region.1{
bail!("Mmioregionspaceexhausted.");
}
self.set_sys_resource(sysbus,region_base,region_size)?;
letdev=Arc::new(self));
sysbus.attach_device(&dev,region_base,region_size)?;

#[cfg(target_arch="x86_64")]
bs.lock().unwrap().kernel_cmdline.push(Param{
param_type:"virtio_mmio.device".to_string(),
value:format!(
"{}@0x{:08x}:{}",
region_size,
region_base,
dev.lock().unwrap().res.irq
),
});
Ok(dev)
}

前端驅(qū)動(dòng)加載過程中會(huì)讀寫設(shè)備的配置空間,前后端完成 feature 的協(xié)商,一切 OK 后前端驅(qū)動(dòng)將向配置空間寫狀態(tài),后端設(shè)備將會(huì)調(diào)用 activate 方法激活設(shè)備。當(dāng)觸發(fā)激活時(shí),前端已為這三個(gè)部分分配了內(nèi)存空間,Guest 物理地址(GPA)已寫入設(shè)備的配置空間,后端需要將 GPA 地址轉(zhuǎn)化為 Host 虛擬地址(HVA)。隨后,就可以根據(jù)隊(duì)列配置創(chuàng)建隊(duì)列,并將 I/O 的 eventfd 加入事件循環(huán)激活設(shè)備開始 I/O 通信。

virtio-pci 設(shè)備

如上所述,virtio 設(shè)備也可以作為一個(gè) PCI 類設(shè)備掛載到 PCI 總線上。類似的,在 StratoVirt 中用結(jié)構(gòu)體 VirtioPciDevice 來表示一個(gè) virtio-pci 設(shè)備。既然是作為一個(gè) PCI 設(shè)備,virtio-pci 就需要擁有符合 PCI 規(guī)范擁有 PCI 設(shè)備的配置空間,Guest 啟動(dòng)后通過 PCI 設(shè)備樹枚舉來發(fā)現(xiàn)設(shè)備,而不是像 virtio-mmio 設(shè)備一樣直接通過內(nèi)核啟動(dòng)參數(shù)告訴 Guest。

pubstructVirtioPciDevice{
///Nameofthisdevice
name:String,
///Theentityofvirtiodevice
device:ArcdynVirtioDevice>>,
///Deviceid
dev_id:Arc,
///Devfn
devfn:u8,
///Ifthisdeviceisactivatedornot.
device_activated:Arc,
///MemoryAddressSpace
sys_mem:Arc,
///Pciconfigspace.
config:PciConfig,
///VirtiocommonconfigrefertoVirtioSpec.
common_config:Arc>,
///PrimaryBus
parent_bus:Weak>,
///Eventfdsusedfornotifyingtheguest.
notify_eventfds:NotifyEventFds,
///Thefunctionforinterrupttriggering
interrupt_cb:Option>,
///Virtioqueues.ThevectorandQueuewillbesharedacrossingthread,soallwithArc>wrapper.
queues:ArcVec>>>>,
///Multi-Functionflag.
multi_func:bool,
}

VirtioPciDevice 通過實(shí)現(xiàn) PciDevOps trait 的 realize()方法完成設(shè)備的具現(xiàn)化:

  1. 初始化 PCI 配置寄存器。
  2. 將 virtio 協(xié)議規(guī)定的 common configuration、notifications、ISR status、Device-specific configuration 作為四個(gè) PCI 設(shè)備的 capability, 對(duì)應(yīng)數(shù)據(jù)的內(nèi)存空間則映射到第 3 個(gè) BAR 空間的不同部分。配置空間布局如下圖所示:

49ca4dda-a026-11ec-952b-dac502259ad0.png

  1. 前端驅(qū)動(dòng)對(duì)于各空間的訪問的回調(diào)函數(shù)由 modern_mem_region_init()注冊(cè),當(dāng)前端讀寫這部分內(nèi)存區(qū)間時(shí)會(huì)陷出到 StratoVirt 執(zhí)行注冊(cè)的回調(diào)接口。每個(gè)隊(duì)列在 notification cap 指向的空間中占據(jù) 4 個(gè)字節(jié),StratoVirt 為每個(gè)隊(duì)列的 4 個(gè)字節(jié)空間注冊(cè) ioeventfd。前端驅(qū)動(dòng)準(zhǔn)備好某個(gè)隊(duì)列后,就會(huì)寫對(duì)應(yīng)隊(duì)列的這 4 個(gè)字節(jié)的地址空間,后端借助 ioeventfd 機(jī)制收到通知后陷出進(jìn)行 host 側(cè)的 I/O 下發(fā)。
  2. 中斷機(jī)制采用 MSI-X,向量表和 pending 位圖則位于第 2 個(gè) BAR 空間。

審核編輯:郭婷
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • PCI
    PCI
    +關(guān)注

    關(guān)注

    4

    文章

    662

    瀏覽量

    130141
  • 虛擬化
    +關(guān)注

    關(guān)注

    1

    文章

    363

    瀏覽量

    29756

原文標(biāo)題:StratoVirt 的 virtio 設(shè)備模擬是如何實(shí)現(xiàn)的

文章出處:【微信號(hào):openEulercommunity,微信公眾號(hào):openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    linux設(shè)備virtio組織關(guān)系及設(shè)備初始化調(diào)用流程

    從哪里開始初始化的?要理清這些關(guān)系需要以linux設(shè)備驅(qū)動(dòng)模型為背景展開討論。這篇文章,我們以linux kernel 3.10代碼為例,分析一下virtio的相關(guān)組織關(guān)系,以及設(shè)備
    的頭像 發(fā)表于 09-25 15:47 ?4623次閱讀
    linux<b class='flag-5'>設(shè)備</b>中<b class='flag-5'>virtio</b>組織關(guān)系及<b class='flag-5'>設(shè)備</b>初始化調(diào)用<b class='flag-5'>流程</b>

    請(qǐng)問怎樣設(shè)計(jì)并實(shí)現(xiàn)閃存設(shè)備I/O軟件?

    閃存設(shè)備管理技術(shù)的現(xiàn)狀及存在的問題是什么?閃存設(shè)備I/O軟件的分層結(jié)構(gòu)是怎樣的?怎樣設(shè)計(jì)并實(shí)現(xiàn)閃存設(shè)備
    發(fā)表于 04-27 06:44

    RT-Thread中I2C設(shè)備的驅(qū)動(dòng)框架對(duì)接如何實(shí)現(xiàn)

    GPIO模擬的方式實(shí)現(xiàn)I2C通訊。RT-Thread 提供了一套 I/O 設(shè)備管理框架,它把
    發(fā)表于 05-19 17:11

    StratoVirt 的 virtio-blk 設(shè)備是如何實(shí)現(xiàn)的?

    平臺(tái)下虛擬磁盤的一種實(shí)現(xiàn)方式,本質(zhì)上為一種半模擬技術(shù)。virtio-blk 設(shè)備中采用 io_event_fd 進(jìn)行前端到后端通知,采用中斷注入方式實(shí)現(xiàn)后端到前端的通知,并通過 IO
    發(fā)表于 06-29 10:37

    StratoVirt 中的虛擬網(wǎng)卡是如何實(shí)現(xiàn)的?

    基于 virtio 協(xié)議的半虛擬化框架實(shí)現(xiàn)前后端通信Virtio 協(xié)議是一種在半虛擬化場(chǎng)景中使用的
    發(fā)表于 08-10 11:16

    RT-Tread設(shè)備驅(qū)動(dòng)開發(fā)之I/O設(shè)備框架簡(jiǎn)析

    獲得正確的設(shè)備驅(qū)動(dòng),然后通過這個(gè)設(shè)備驅(qū)動(dòng)與底層I/O硬件設(shè)備進(jìn)行數(shù)據(jù)(或控制)交互。I/
    發(fā)表于 03-15 14:44

    輸入輸出設(shè)備I/O設(shè)備總結(jié)

    I/O設(shè)備又叫輸入輸出設(shè)備。對(duì)于I/O bus 包含數(shù)據(jù)總線、控制總線、地址總線;每一個(gè)
    發(fā)表于 11-24 09:28 ?3579次閱讀
    輸入輸出<b class='flag-5'>設(shè)備</b><b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>設(shè)備</b>總結(jié)

    如何減少器件間通信所用的I/O引腳數(shù)實(shí)現(xiàn)雙向通信

    隨著嵌入式系統(tǒng)的小型化趨勢(shì),市場(chǎng)對(duì)減少器件間通信所用的I/O 引腳數(shù)的需求與日俱增。Microchip 開發(fā)的UNI/O? 總線滿足了這一需求,這一低成本且易于
    發(fā)表于 04-27 16:14 ?8次下載
    如何減少器件間<b class='flag-5'>通信</b>所用的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>引腳數(shù)<b class='flag-5'>實(shí)現(xiàn)</b>雙向<b class='flag-5'>通信</b>

    I/O軟件模擬虛擬化和類虛擬化

    的標(biāo)準(zhǔn)化接口。Virtio成為整個(gè)問題的焦點(diǎn):不管是SPDK/vhost、還是vDPA加速,都是圍繞著Virtio接口展開。 1 I/O設(shè)備
    的頭像 發(fā)表于 10-13 11:09 ?2559次閱讀

    I/O虛擬化及Virtio接口介紹

    I/O虛擬化是計(jì)算機(jī)虛擬化最復(fù)雜的部分,因?yàn)樯婕暗紺PU、操作系統(tǒng)、Hypervisor以及I/O設(shè)備的相互配合。
    的頭像 發(fā)表于 10-26 17:21 ?3949次閱讀

    探究I/O虛擬化及Virtio接口技術(shù)(上)

    I/O虛擬化是SmartNIC/DPU/IPU中最核心的部分,AWS NITRO就是從I/O硬件虛擬化開始,逐漸開啟了DPU這個(gè)新處理器類型的創(chuàng)新。而
    的頭像 發(fā)表于 04-04 16:54 ?3743次閱讀
    探究<b class='flag-5'>I</b>/<b class='flag-5'>O</b>虛擬化及<b class='flag-5'>Virtio</b>接口技術(shù)(上)

    探究I/O虛擬化及Virtio接口技術(shù)(下)

    I/O虛擬化是SmartNIC/DPU/IPU中最核心的部分,AWS NITRO就是從I/O硬件虛擬化開始,逐漸開啟了DPU這個(gè)新處理器類型的創(chuàng)新。而
    的頭像 發(fā)表于 04-04 17:03 ?2606次閱讀
    探究<b class='flag-5'>I</b>/<b class='flag-5'>O</b>虛擬化及<b class='flag-5'>Virtio</b>接口技術(shù)(下)

    VirtIO Networking虛擬網(wǎng)絡(luò)設(shè)備實(shí)現(xiàn)架構(gòu)

    VirtIO 由 Rusty Russell 開發(fā),最初是為了支持自己開發(fā)的 lguest Hypervisor,其設(shè)計(jì)目標(biāo)是在虛擬化環(huán)境下提供與物理設(shè)備相近的 I/O 功能和性能
    的頭像 發(fā)表于 05-08 10:48 ?1071次閱讀
    <b class='flag-5'>VirtIO</b> Networking虛擬網(wǎng)絡(luò)<b class='flag-5'>設(shè)備</b><b class='flag-5'>實(shí)現(xiàn)</b>架構(gòu)

    RT-Thread設(shè)備驅(qū)動(dòng)開發(fā)之二I/O設(shè)備框架

    設(shè)備驅(qū)動(dòng)層是一組驅(qū)使硬件設(shè)備工作的程序,實(shí)現(xiàn)了訪問硬件設(shè)備的功能,它負(fù)責(zé)創(chuàng)建和注冊(cè)I/O
    的頭像 發(fā)表于 10-12 10:26 ?447次閱讀

    Linux I/O 接口的類型及處理流程

    ()、lseek() 等。 網(wǎng)絡(luò) I/O 接口:用于網(wǎng)絡(luò)通信的接口,包括 socket()、connect()、bind()、listen()、accept() 等。 設(shè)備
    的頭像 發(fā)表于 11-08 16:43 ?845次閱讀
    Linux <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 接口的類型及處理<b class='flag-5'>流程</b>