chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

StratoVirt中vCPU管理模塊的組成及位置

openEuler ? 來(lái)源:openEuler ? 作者:openEuler ? 2021-12-20 15:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

StratoVirt是開(kāi)源在openEuler社區(qū)的輕量級(jí)虛擬化平臺(tái),具備輕量低噪、強(qiáng)安全性的行業(yè)競(jìng)爭(zhēng)力。 StratoVirt進(jìn)程運(yùn)行在用戶(hù)態(tài),在虛擬機(jī)啟動(dòng)之前,StratoVirt會(huì)完成啟動(dòng)之前的準(zhǔn)備工作,包括虛擬機(jī)內(nèi)存的初始化、CPU寄存器初始化、設(shè)備初始化等,啟動(dòng),CPU寄存器初始化和虛擬機(jī)在運(yùn)行過(guò)程中vCPU陷出事件的處理,都是由StratoVirt的vCPU管理模塊CPU完成。如下是StratoVirt中vCPU管理模塊的組成,以及其在StratoVirt中的位置。

stratovirt
├──acpi
├──address_space
├──boot_loader
├──Cargo.lock
├──Cargo.toml
├──cpu
│├──Cargo.toml
│└──src
│├──aarch64
││├──caps.rs
││├──core_regs.rs
││└──mod.rs
│├──lib.rs
│└──x86_64
│├──caps.rs
│├──cpuid.rs
│└──mod.rs
├──devices
├──hypervisor
├──machine
├──machine_manager
├──migration
├──migration_derive
├──ozone
├──pci
├──src
│└──main.rs
├──sysbus
├──util
├──vfio
└──virtio

StratoVirt vCPU模塊的整體設(shè)計(jì)

StratoVirt的虛擬化解決方案也是一套軟硬結(jié)合的硬件輔助虛擬化解決方案,它的運(yùn)作依賴(lài)于硬件輔助虛擬化的能力(如VT-X或Kunpeng-V)。vCPU模塊的實(shí)現(xiàn)也是緊密依賴(lài)于這一套硬件輔助虛擬化的解決方案的。 對(duì)于物理機(jī)的CPU而言,硬件輔助虛擬化為CPU增加了一種新的模式:Non-Root模式,在該模式下,CPU執(zhí)行的并不是物理機(jī)的指令,而是虛擬機(jī)的指令。這種指令執(zhí)行方式消除了大部分性能開(kāi)銷(xiāo),非常高效。但是特權(quán)指令(如I/O指令)不能通過(guò)這種方式執(zhí)行,還是會(huì)強(qiáng)制將CPU退出到普通模式(即ROOT模式)下交給內(nèi)核KVM模塊和用戶(hù)態(tài)StratoVirt去處理,處理完再重新回到Non-Root模式下執(zhí)行下一條指令。 而StratoVirt中的vCPU模塊主要圍繞著KVM模塊中對(duì)vCPU的模擬來(lái)實(shí)現(xiàn),為了支持KVM模塊中對(duì)CPU的模擬,CPU子系統(tǒng)主要負(fù)責(zé)處理退出到普通模式的事件,以及根據(jù)在GuestOS內(nèi)核開(kāi)始運(yùn)行前對(duì)vCPU寄存器等虛擬硬件狀態(tài)的初始化。整個(gè)vCPU模塊的設(shè)計(jì)模型如下圖所示:

StratoVirt通過(guò)第三方庫(kù)kvm_ioctls來(lái)完成和KVM模塊的交互,通過(guò)匹配vcpu_fd.run()函數(shù)的返回值來(lái)處理退出到ROOT模式的事件,該函數(shù)的返回值是一個(gè)名為VcpuExit的枚舉,定義了退出到ROOT模式的事件類(lèi)型,包括I/O的下發(fā)、系統(tǒng)關(guān)機(jī)事件、系統(tǒng)異常事件等,根據(jù)事件的類(lèi)型vCPU將對(duì)不同的事件作出各自的處理。以上的整個(gè)過(guò)程都被包含在一個(gè)獨(dú)立的vCPU線程中,用戶(hù)可以自己通過(guò)對(duì)vCPU線程進(jìn)行綁核等方式讓虛擬機(jī)的vCPU獲取物理機(jī)CPU近似百分之百的性能。 同時(shí),對(duì)vCPU寄存器虛擬硬件狀態(tài)信息的初始化則是和StratoVirt的另一個(gè)模塊BootLoader相互結(jié)合,在BootLoader中實(shí)現(xiàn)了一種根據(jù)Linux啟動(dòng)協(xié)議快速引導(dǎo)啟動(dòng)Linux內(nèi)核鏡像的方法,在這套啟動(dòng)流程中,BootLoader將主動(dòng)完成傳統(tǒng)BIOS對(duì)一些硬件信息的獲取,將對(duì)應(yīng)的硬件表保存在虛擬機(jī)內(nèi)存中,同時(shí)將提供一定的寄存器設(shè)置信息,這些寄存器設(shè)置信息將傳輸給vCPU模塊,通過(guò)設(shè)置vCPU結(jié)構(gòu)中的寄存器值,讓虛擬機(jī)CPU跳過(guò)實(shí)模式直接進(jìn)入保護(hù)模式運(yùn)行,這樣Linux內(nèi)核就能直接從保護(hù)模式的入口開(kāi)始運(yùn)行,這種方式讓StratoVirt的啟動(dòng)流程變得輕量快速。 在整個(gè)vCPU模塊中,因?yàn)樯婕暗絻?nèi)核的KVM模塊,少不了與C語(yǔ)言代碼做交互。作為系統(tǒng)編程語(yǔ)言,Rust對(duì)FFI有非常完善的支持,讓vCPU中和KVM模塊交互的部分高效且安全。

vCPU線程模型同步

vCPU模塊還有一大職責(zé)就是管理vCPU的生命周期,包括new(創(chuàng)建),realize(使能),run(運(yùn)行),pause(暫停),resume(恢復(fù)),destroy(銷(xiāo)毀)。New和realize的過(guò)程就是結(jié)構(gòu)體創(chuàng)建和寄存器初始化的流程,run的過(guò)程即是實(shí)現(xiàn)KVM中vCPU運(yùn)作和VCPU_EXIT退出事件處理的流程。 另外的三種生命周期的實(shí)現(xiàn)則涉及到對(duì)線程同步的精密控制,例如在虛擬機(jī)destroy的過(guò)程中,一般只有某一個(gè)vCPU接收到VCPU_EXIT中的SHUTDOWN事件,該vCPU線程需要把該事件傳遞到所有的vCPU線程,同步所有vCPU線程的狀態(tài),完成虛擬機(jī)的優(yōu)雅關(guān)機(jī)。在這種場(chǎng)景下,我們就需要考慮在Rust中如何實(shí)現(xiàn)在多線程中進(jìn)行狀態(tài)同步。

Rust中通過(guò)條件變量來(lái)實(shí)現(xiàn)同步

Rust多線程編程中,有一類(lèi)用于同步的機(jī)制叫做屏障(Barrier),用于讓多線程來(lái)同步一些流程開(kāi)始的位置,它相當(dāng)于一個(gè)閘口,使用wait方法,將該線程放進(jìn)臨界區(qū)并阻塞住,只有每個(gè)Barrier都到達(dá)wait方法調(diào)用的點(diǎn),閘口才會(huì)打開(kāi),所有的線程同步往下運(yùn)行。 而在比較復(fù)雜的同步場(chǎng)景中,Rust還提供了另一個(gè)同步機(jī)制條件變量(Condition Variable)來(lái)支持更復(fù)雜的同步場(chǎng)景,它和屏障的功能類(lèi)似,但是它并不阻塞全部進(jìn)程,而是在滿(mǎn)足指定的條件之前阻塞某個(gè)得到互斥鎖的進(jìn)程。也就是說(shuō),通過(guò)條件變量,我們可以在達(dá)到某種條件之前阻塞某個(gè)線程,這個(gè)特性可以讓我們很好得對(duì)線程進(jìn)行同步。 為了支持各種場(chǎng)景的同步控制,條件變量還提供了三個(gè)方法:

notify_one(): 用來(lái)通知一次阻塞線程,如果有復(fù)數(shù)個(gè)線程被阻塞住,notify_one會(huì)被一個(gè)阻塞的線程所消耗,不會(huì)傳遞到別的阻塞線程去。

notify_all(): 用來(lái)通知所有的阻塞線程。

wait_timeout(): 將當(dāng)前線程置入臨界區(qū)阻塞住并等待通知,可以設(shè)定一個(gè)timeout來(lái)設(shè)置阻塞的最大時(shí)間,以免造成永久的阻塞導(dǎo)致程序卡死。

需要注意的一點(diǎn)是條件變量需要和鎖一起使用,而在程序運(yùn)行中,每個(gè)條件變量每次只能和一個(gè)互斥體(被Mutex等鎖包裹都可稱(chēng)為互斥體)進(jìn)行使用。

vCPU生命周期控制和線程同步

在CPU數(shù)據(jù)結(jié)構(gòu)初始化時(shí),創(chuàng)建一個(gè)互斥的生命周期枚舉(CpuLifecycleState)和一個(gè)條件變量。

pubfnnew(
vcpu_fd:Arc,
id:u8,
arch_cpu:Arc>,
vm:Arc>,
)->Self{
CPU{
id,
fd:vcpu_fd,
arch_cpu,
state:Arc::Created),Condvar::new())),
work_queue:Arc::new(0),Condvar::new())),
task:Arc::new(None)),
tid:Arc::new(None)),
vm:Arc::downgrade(&vm),
}
}
以destory生命周期為例,在x86_64架構(gòu)下,當(dāng)某個(gè)vCPU線程接收到VcpuExit::Shutdown事件后,會(huì)將該線程的CpuLifecycleState修改為Stopped,并調(diào)用保存在CPU數(shù)據(jù)結(jié)構(gòu)中一個(gè)指向上層結(jié)構(gòu)的虛擬機(jī)destroy方法,該方法能遍歷一個(gè)保存著所有CPU數(shù)據(jù)結(jié)構(gòu)的數(shù)組,執(zhí)行數(shù)組中每一個(gè)CPU的destory()方法,該函數(shù)的實(shí)現(xiàn)如下:
fndestory(&self)->Result<()>{
let(cpu_state,cvar)=&*self.state;
if*cpu_state.lock().unwrap()==CpuLifecycleState::Running{
*cpu_state.lock().unwrap()=CpuLifecycleState::Stopping;
}else{
*cpu_state.lock().unwrap()=CpuLifecycleState::Stopped;
}

/*省略具體的關(guān)機(jī)邏輯*/

letmutcpu_state=cpu_state.lock().unwrap();
cpu_state=cvar
.wait_timeout(cpu_state,Duration::from_millis(32))
.unwrap()
.0;

if*cpu_state==CpuLifecycleState::Stopped{
*cpu_state=CpuLifecycleState::Nothing;
Ok(())
}else{
Err(ErrorKind::DestroyVcpu(format!("VCPUstillin{:?}state",*cpu_state)).into())
}
}
作為CPU的成員方法,destory函數(shù)能獲取到每個(gè)CPU數(shù)據(jù)結(jié)構(gòu)的互斥狀態(tài)和條件變量,此時(shí)將除觸發(fā)vCPU外所有的CPU數(shù)據(jù)的互斥狀態(tài)解鎖,并將狀態(tài)從運(yùn)行時(shí)的Running修改為vCPU關(guān)機(jī)時(shí)的Stopping。這里要注意一點(diǎn),此時(shí)所有CPU的destroy函數(shù)都是在觸發(fā)關(guān)機(jī)事件的vCPU進(jìn)程中進(jìn)行的,而不是在每個(gè)vCPU各自的進(jìn)程中進(jìn)行。 緊接著進(jìn)入Stopping狀態(tài)后,destroy函數(shù)會(huì)執(zhí)行每個(gè)vCPU各自的關(guān)機(jī)邏輯,包括觸發(fā)vCPU,這部分主要還是與KVM模塊進(jìn)行交互,進(jìn)行一些退出狀態(tài)的變更等。在執(zhí)行完vCPU的關(guān)機(jī)邏輯后,條件變量會(huì)進(jìn)入到wait_timeout的等待狀態(tài),它的參數(shù)為每個(gè)vCPU的CpuLifecycleState生命周期狀態(tài)枚舉和等待超時(shí)時(shí)間,也就是說(shuō)在該生命周期枚舉狀態(tài)變化前,該線程都會(huì)進(jìn)入阻塞狀態(tài)。 此時(shí)除觸發(fā)vCPU外的vCPU線程中,CpuLifecycleState都已經(jīng)進(jìn)入了Stopping狀態(tài),在所有vCPU線程中,vCPU的指令模擬函數(shù)kvm_vcpu_exec()都運(yùn)行在一個(gè)循環(huán)中,對(duì)于每次循環(huán)的入口,都會(huì)執(zhí)行ready_for_running()函數(shù)進(jìn)入是否繼續(xù)模擬的判斷,在該函數(shù)中會(huì)對(duì)每個(gè)vCPU對(duì)應(yīng)的CpuLifecycleState進(jìn)行監(jiān)控,當(dāng)發(fā)現(xiàn)CpuLifecycleState已經(jīng)變成Stopping時(shí),vCPU將會(huì)退出循環(huán),不繼續(xù)進(jìn)行vCPU的模擬,退出模擬的循環(huán)后,將會(huì)修改CpuLifecycleState為Stopped:
//Thevcputhreadisabouttoexit,markingthestateoftheCPUstateasStopped.
let(cpu_state,_)=&*self.thread_cpu.state;
*cpu_state.lock().unwrap()=CpuLifecycleState::Stopped;
修改vCPU線程中互斥的生命周期狀態(tài)枚舉后,將會(huì)觸發(fā)阻塞線程中對(duì)應(yīng)的wait_timeout()函數(shù),同時(shí),該vCPU線程的生命周期結(jié)束。而對(duì)于阻塞線程,當(dāng)其余vCPU線程的狀態(tài)都已經(jīng)變成Stopped后,阻塞解除,此時(shí),所有的vCPU線程都已經(jīng)狀態(tài)都已經(jīng)同步到了Stopped,線程狀態(tài)同步成功。 用類(lèi)似思路也可以實(shí)現(xiàn)pause(暫停)和resume(恢復(fù))的生命周期控制。

原文標(biāo)題:StratoVirt vCPU管理Rust線程同步的實(shí)現(xiàn)

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

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

    關(guān)注

    31

    文章

    5609

    瀏覽量

    130019
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11281

    瀏覽量

    225118
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    972

    瀏覽量

    30493

原文標(biāo)題:StratoVirt vCPU管理Rust線程同步的實(shí)現(xiàn)

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    RDMA設(shè)計(jì)26:隊(duì)列管理模塊設(shè)計(jì)之接收隊(duì)列模塊詳細(xì)分析

    發(fā)送隊(duì)列表單不同的是,用戶(hù)接收隊(duì)列表單只包含了隊(duì)列 ID、會(huì)話 ID、遠(yuǎn)程主機(jī) IP 地址。 當(dāng)接收隊(duì)列管理單元接收到來(lái)自 RoCE v2 接收模塊的接收隊(duì)列條目時(shí),根據(jù)其中的隊(duì)列 ID 尋找相應(yīng)
    發(fā)表于 01-22 09:03

    RDMA設(shè)計(jì)24:隊(duì)列管理模塊設(shè)計(jì)

    隊(duì)列管理模塊采用管理與存儲(chǔ)分離的結(jié)構(gòu)進(jìn)行設(shè)計(jì),由發(fā)送隊(duì)列存儲(chǔ)、發(fā)送隊(duì)列管理、接收隊(duì)列管理、完成條目解析、異常完成條目處理和 Round-Ro
    的頭像 發(fā)表于 01-20 11:45 ?1389次閱讀
    RDMA設(shè)計(jì)24:隊(duì)列<b class='flag-5'>管理</b><b class='flag-5'>模塊</b>設(shè)計(jì)

    RDMA設(shè)計(jì)21:連接管理模塊設(shè)計(jì)

    管理組成。連接信息緩存存放由系統(tǒng)控制模塊寫(xiě)入的待處理連接指令信息;連接管理狀態(tài)機(jī)獲取連接指令信息,并進(jìn)行連接建立或連接斷開(kāi)流程;會(huì)話
    發(fā)表于 01-12 11:03

    RDMA設(shè)計(jì)18:隊(duì)列管理模塊設(shè)計(jì)3

    處理單元組成。完成條目解析單元只設(shè)置了一個(gè)虛擬完成隊(duì)列,使用這樣的結(jié)構(gòu)設(shè)計(jì)原因有三。 一是當(dāng)完成條目狀態(tài)為正常完成時(shí),只需要通知接受接收隊(duì)列管理單元釋放對(duì)應(yīng)的發(fā)送隊(duì)列資源即可。當(dāng)完成條目狀態(tài)異常
    發(fā)表于 01-05 09:04

    RDMA設(shè)計(jì)17:隊(duì)列管理模塊設(shè)計(jì)2

    v2 接收模塊的接收隊(duì)列條目時(shí),根據(jù)其中的隊(duì)列 ID 尋找相應(yīng)表單,并通知發(fā)送隊(duì)列管理單元釋放對(duì)應(yīng)表單的發(fā)送隊(duì)列條目。同時(shí)接收隊(duì)列管理單元也不再處理遠(yuǎn)程主機(jī)發(fā)送過(guò)來(lái)的數(shù)據(jù),而是直接
    發(fā)表于 01-04 14:54

    RDMA設(shè)計(jì)14:連接管理模塊設(shè)計(jì)

    管理組成。連接信息緩存存放由系統(tǒng)控制模塊寫(xiě)入的待處理連接指令信息;連接管理狀態(tài)機(jī)獲取連接指令信息,并進(jìn)行連接建立或連接斷開(kāi)流程;會(huì)話
    發(fā)表于 12-30 16:51

    `lv_obj_tree.h` 在 **LVGL v9** 位置和作用

    )已經(jīng)封裝了這些邏輯,無(wú)需直接包含 lv_obj_tree.h。 總結(jié) lv_obj_tree.h 是 LVGL 內(nèi)部管理對(duì)象樹(shù)結(jié)構(gòu)的核心頭文件,位于 src/core/ 目錄,主要供 LVGL 自身模塊調(diào)用,上層應(yīng)用開(kāi)發(fā)較少
    發(fā)表于 11-13 15:49

    智慧工地管理系統(tǒng)正在公路建設(shè)逐漸被廣泛應(yīng)用

    、費(fèi)用管理、合同管理和資料管理等方面,為工地管理者提供了全方位的支持和幫助。 ???????1、質(zhì)量管理 ???????智慧工地
    的頭像 發(fā)表于 08-28 08:48 ?580次閱讀
    智慧工地<b class='flag-5'>管理</b>系統(tǒng)正在公路建設(shè)<b class='flag-5'>中</b>逐漸被廣泛應(yīng)用

    RFID標(biāo)簽在服裝供應(yīng)鏈管理的應(yīng)用

    二、RFID標(biāo)簽在服裝供應(yīng)鏈管理的優(yōu)勢(shì)高效率:RFID可以快速批量讀取服裝信息,大幅縮短操作時(shí)間,提高供應(yīng)鏈管理效率。準(zhǔn)確性:RFID減少了人工操作的錯(cuò)誤率,提高了服裝供應(yīng)鏈管理的準(zhǔn)
    的頭像 發(fā)表于 07-14 17:02 ?719次閱讀
    RFID標(biāo)簽在服裝供應(yīng)鏈<b class='flag-5'>管理</b><b class='flag-5'>中</b>的應(yīng)用

    NVME控制器之隊(duì)列管理模塊

    如圖1所示。 圖1 隊(duì)列管理模塊框圖 在NVMe協(xié)議,使用隊(duì)列來(lái)傳輸、緩存和處理命令條目,以實(shí)現(xiàn)Host端和NVMe SSD端之間的通信。在CPU上運(yùn)行NVMe軟件協(xié)議棧,其Host端生成提交命令
    發(fā)表于 05-03 20:19

    NVME控制器之隊(duì)列管理模塊

    隊(duì)列管理模塊是整個(gè)NVMe Host控制器的核心模塊,該模塊實(shí)現(xiàn)了提交隊(duì)列與完成隊(duì)列的管理,多隊(duì)列請(qǐng)求的仲裁判決等功能。隊(duì)列
    的頭像 發(fā)表于 05-03 15:32 ?668次閱讀
    NVME控制器之隊(duì)列<b class='flag-5'>管理</b><b class='flag-5'>模塊</b>

    智能倉(cāng)儲(chǔ)管理解決方案NRF5832

    應(yīng)對(duì)企業(yè)倉(cāng)庫(kù)和車(chē)間物資管理的各種挑戰(zhàn)。 這套解決方案具備許多優(yōu)點(diǎn),主要集中在物品出入庫(kù)時(shí)間和位置信息的準(zhǔn)確管理方面。通過(guò)藍(lán)牙信標(biāo)發(fā)出的信號(hào),定位器能夠精準(zhǔn)接收并控制標(biāo)簽發(fā)射信號(hào)的功率
    發(fā)表于 04-10 14:10

    可以在MCUXpressoIDE哪些位置管理工具鏈?

    \'} arm-gnu-toolchain-12.3.rel1-mingw-w64-i686-arm-none-eabiarm-none-eabiinclude/sys/types.h:107:25: error: conflicting types for \'clock_t\'; have \'long unsigned int\' 我應(yīng)該使用
    發(fā)表于 04-10 07:37

    RFID標(biāo)簽在倉(cāng)儲(chǔ)管理的應(yīng)用

    RFID標(biāo)簽在倉(cāng)儲(chǔ)管理中發(fā)揮著重要作用,其高效、精準(zhǔn)和自動(dòng)化的特性顯著提升了倉(cāng)儲(chǔ)管理的效率和準(zhǔn)確性。以下是RFID標(biāo)簽在倉(cāng)儲(chǔ)管理的主要應(yīng)用及其優(yōu)勢(shì):1.貨物追蹤與庫(kù)存
    的頭像 發(fā)表于 03-21 13:58 ?1360次閱讀
    RFID標(biāo)簽在倉(cāng)儲(chǔ)<b class='flag-5'>管理</b><b class='flag-5'>中</b>的應(yīng)用

    RFID標(biāo)簽在資產(chǎn)管理的應(yīng)用管理

    ,這些信息是準(zhǔn)確識(shí)別資產(chǎn)的基礎(chǔ)。購(gòu)置時(shí)間、購(gòu)置價(jià)格等財(cái)務(wù)信息也被完整記錄,方便企業(yè)進(jìn)行成本核算和資產(chǎn)價(jià)值評(píng)估。存放位置信息則能讓管理人員隨時(shí)了解資產(chǎn)的實(shí)際所在,便于快
    的頭像 發(fā)表于 03-12 17:50 ?778次閱讀
    RFID標(biāo)簽在資產(chǎn)<b class='flag-5'>管理</b><b class='flag-5'>中</b>的應(yīng)用<b class='flag-5'>管理</b>