Fuchsia技術(shù)架構(gòu)設(shè)計(jì)解讀課件_第1頁
Fuchsia技術(shù)架構(gòu)設(shè)計(jì)解讀課件_第2頁
Fuchsia技術(shù)架構(gòu)設(shè)計(jì)解讀課件_第3頁
Fuchsia技術(shù)架構(gòu)設(shè)計(jì)解讀課件_第4頁
Fuchsia技術(shù)架構(gòu)設(shè)計(jì)解讀課件_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、技術(shù)創(chuàng)新,變革未來Fuchsia 技術(shù)架構(gòu)設(shè)計(jì)解讀第1頁,共47頁。多年的 Android, ChromeOS 開發(fā)經(jīng)驗(yàn)一方面讓 Google 在操作系統(tǒng)方面積累了足 夠多的人才和組件,另一方面也充分認(rèn)識(shí)到了 Linux kernel 很多的局限性Fuchsia 是一個(gè)全新的操作系統(tǒng)的統(tǒng)稱。Google 挑選了一系列它認(rèn)為合適的技術(shù)和 組件進(jìn)入這個(gè)操作系統(tǒng),比如:微內(nèi)核,基于能力的訪問控制,Vulkan 圖形接口,3D 桌面渲染 Scenic,F(xiàn)lutter 應(yīng)用開發(fā)框架。目前支持的編程語言是:C/C+, Go, Rust, DartGoogle 2016 年中放出了所有的代碼,但是沒有正式宣

2、布這個(gè)項(xiàng)目的目標(biāo),開發(fā)社 區(qū)目前有一個(gè) IRC 頻道進(jìn)行交流支持的架構(gòu)是 X86-64 和 ARM 64,支持的設(shè)備從 IoT 到服務(wù)器Fuchsia 的基本情況第2頁,共47頁。為什么不在 Android 上改進(jìn),塞入各種新技術(shù)/aerospace/aviation/how-the-boeing-737-max- disaster-looks-to-a-software-developer737 的問題:機(jī)翼下空間太小,放不下大引擎。改動(dòng)機(jī)翼相當(dāng)于重新設(shè)計(jì)一架飛機(jī)所以,改變發(fā)動(dòng)機(jī)位置強(qiáng)行放進(jìn)去,后果是改變了空氣動(dòng)力學(xué)特性,機(jī)頭容易上揚(yáng)解決方案是通過修改飛控軟件來彌補(bǔ),飛控認(rèn)為飛機(jī)在上揚(yáng),強(qiáng)行

3、下壓,造成失控當(dāng)總體設(shè)計(jì)出現(xiàn)問題的時(shí)候,用再多的技巧去彌補(bǔ),也只會(huì)造成最終的災(zāi)難Google 為什么要從頭設(shè)計(jì)全新的操作系統(tǒng)第3頁,共47頁。上游硬件廠商下游應(yīng)用開發(fā)者設(shè)備友商用戶黑客現(xiàn)代通用、開放 OS 需要面對(duì)的方面第4頁,共47頁。原生進(jìn)程沙箱,解決應(yīng)用安全和分發(fā)問題(黑客)Linux: Namespace, Control group, Unionfs = Docker穩(wěn)定的驅(qū)動(dòng)接口,硬件廠商可獨(dú)立維護(hù)硬件驅(qū)動(dòng)(硬件)系統(tǒng)模塊化,分層,設(shè)備廠商可以靈活定制專有系統(tǒng)(友商)基于 Vulkan 和物理渲染的純 3D UI,全局光照(用戶)Flutter 應(yīng)用開發(fā)框架(開發(fā)者)Fuchsia

4、 解決現(xiàn)代 OS 痛點(diǎn)第5頁,共47頁。全局文件系統(tǒng)用戶進(jìn)程的創(chuàng)建系統(tǒng)調(diào)用Fuchsia 重新思考四個(gè)Unix 的基礎(chǔ)抽象機(jī)制第6頁,共47頁。在 Unix 里,存在一個(gè)全局的根文件系統(tǒng)它是每個(gè)進(jìn)程共享的基礎(chǔ)資源文件系統(tǒng)涵蓋了非文件資源:/proc, /sys, 網(wǎng)絡(luò)是例外在 Fuchsia 里,沒有全局根文件系統(tǒng)文件和文件系統(tǒng)成為一個(gè)局部概念(局限在每個(gè)文件系統(tǒng)進(jìn)程里),從而在進(jìn)程內(nèi)核數(shù)據(jù)結(jié)構(gòu)里沒有 file用 namespace 來定義一個(gè)進(jìn)程能夠訪問的資源每個(gè) name(路徑)對(duì)應(yīng)一個(gè)資源進(jìn)程 channel 的 handle“/“ - root vfs service handle,

5、“/dev” - dev fs service handle, “/net/dns” - DNS service handle全局文件系統(tǒng)第7頁,共47頁。在 Unix 中,User 本來是用作不同的用戶登錄共享服務(wù)器的機(jī)制User 是真正的用戶后來主要用作權(quán)限控制,弱化的沙箱機(jī)制在 Fuchsia 中,在底層(Zircon, Garnet)沒有用戶的概念用 namespace 來控制進(jìn)程能夠訪問的資源Capability-based access control從而在進(jìn)程里沒有 uidUser第8頁,共47頁。在 Unix 中,新的進(jìn)程由老的進(jìn)程 fork 而來新的進(jìn)程繼承父進(jìn)程的全部資源一

6、種偷懶的設(shè)計(jì)Andrew Baumann, A fork() in the road, ACM Hot Topics in OS, May 2019在 Fuchsia 中,新進(jìn)程的創(chuàng)建需要從頭開始創(chuàng)建 process, thread父進(jìn)程建立初始的 namespace 到資源 channel handle 的映射調(diào)用 process_start 顯式地告訴內(nèi)核新的進(jìn)程可以跑了在 Fuchsia 內(nèi)核的 process 數(shù)據(jù)結(jié)構(gòu)里,沒有 file 和 uid進(jìn)程的創(chuàng)建第9頁,共47頁。Unix/Linux 里,通過中斷調(diào)用內(nèi)核服務(wù): int 0 x80, syscall, sysenter 系統(tǒng)

7、調(diào)用的方式是確定 的,直接的內(nèi)核接口不能變可以被任意注入的代碼調(diào)用Zircon 里系統(tǒng)調(diào)用通過 vDSO 進(jìn)行,意圖是防止用戶代碼直接通過固定的中斷代碼調(diào)用 system call,達(dá)到內(nèi)核詳細(xì)接口的隔離。保持 C 層面的接口穩(wěn)定:名字+參數(shù)。而不是內(nèi)核 入口匯編指令層面的穩(wěn)定注入的代碼無法直接調(diào)用 vDSO 里的接口,雖然加載地址固定,但是計(jì)算出入口地址很難,如果不是不可能的話內(nèi)核會(huì)驗(yàn)證調(diào)用指令的地址,而 vDSO 的加載地址是固定的。并且在編譯的時(shí)候會(huì)驗(yàn)證有限的入口符號(hào),這些符號(hào)在編譯時(shí)唯一生成, 防止用戶進(jìn)程繞過 vDSO這里主要的目的是隔離 system call 的調(diào)用方式,不是絕對(duì)

8、意義上的不可注入調(diào)用/zircon/+/master/docs/vdso.md系統(tǒng)調(diào)用第10頁,共47頁。典型的漏洞利用步驟通過系統(tǒng)調(diào)用 fork()/exec() 直接創(chuàng)建反向 shell繼承 uid(或者通過獲得 root uid 進(jìn)行提權(quán))獲得泛在授權(quán)訪問全局文件系統(tǒng)在 Fuchsia 里,以上機(jī)制全都不存在沒有固定的系統(tǒng)調(diào)用入口,必須動(dòng)態(tài)鏈接創(chuàng)建進(jìn)程時(shí)顯式建立 root namespace沒有 user,從而沒有 ambient authority (DAC/MAC)Capability-based access control能訪問的資源是父進(jìn)程賦予的 namespace看不到初始

9、namespace 之外的任何資源仿佛是專門針對(duì)漏洞利用作出的設(shè)計(jì)第11頁,共47頁。Kernel 的本質(zhì)是什么第12頁,共47頁。管理硬件執(zhí)行特權(quán)指令引導(dǎo)啟動(dòng)過程處理中斷Kernel 的本質(zhì)不是:第13頁,共47頁。不同進(jìn)程唯一共享內(nèi)存地址空間的場(chǎng)合切換地址空間是進(jìn)入內(nèi)核的標(biāo)志不同的進(jìn)程通過共享內(nèi)核地址空間來交換信息切換地址空間是切換進(jìn)程的關(guān)鍵步驟Kernel 的本質(zhì)是:地址空間切換第14頁,共47頁。虛擬內(nèi)存和物理內(nèi)存管理VMO: Virtual Memory Object: 包含物理頁進(jìn)程和線程管理進(jìn)程間通信channelZircon 主要內(nèi)核態(tài)功能第15頁,共47頁。Virtual M

10、emory Object(VMO)代表一個(gè)內(nèi)存對(duì)象,懶分配VMO 通過向 channel 發(fā)送 handle 在進(jìn)程之間傳遞進(jìn)程拿到 VMO handle,把 VMO 重新映射到自己的地址空間里Unix 是以文件為中心的設(shè)計(jì)以內(nèi)存為中心的設(shè)計(jì)第16頁,共47頁。channel 是進(jìn)程間通信的(唯一)機(jī)制一個(gè) channel 有 2 個(gè) handle,h1, h2,從一頭寫入消息,從另一頭讀出消息一個(gè)進(jìn)程在創(chuàng)建時(shí)有一些初始 channel handle要與一個(gè)服務(wù)x建立通信,進(jìn)程創(chuàng)建一個(gè) channel,自己拿 h1,把 h2 通過已有的channel(root_svc) 發(fā)送給相應(yīng)的服務(wù),服務(wù)

11、拿到 h2,將其放到自己的事件監(jiān)聽循環(huán)里示意 API:connectToService(root_svc, “x”, h2)比如 open(),在 Linux 里會(huì)在進(jìn)程的內(nèi)核數(shù)據(jù)結(jié)構(gòu)里增加打開的文件描述符,不涉及到其他進(jìn)程;在Fuchsia 里則是創(chuàng)建一個(gè) channel, 把遠(yuǎn)端發(fā)送給相應(yīng)的服務(wù),建立通信通道channel_write() 把消息寫到另一個(gè)進(jìn)程能看到的地方。進(jìn)程間是不共享內(nèi)存地址空間的。只 有內(nèi)核的地址空間是進(jìn)程共享的。所以 channel_write() 必須是一個(gè)系統(tǒng)調(diào)用,切換到內(nèi)核地 址空間里進(jìn)行消息寫入。一旦切換到內(nèi)核地址空間里,就能看到另一個(gè) handle 了。寫

12、到那個(gè)handle 的消息隊(duì)列里,等另外一個(gè)進(jìn)程切換到內(nèi)核地址空間里,就能看到消息了channel第17頁,共47頁。channel 的實(shí)現(xiàn)Kernelhandle 1 peer handle msg listProcess AhandleIndex 1Process B handleIndex 2handle 2 peer handle msg list第18頁,共47頁。內(nèi)核映像還嵌入了一個(gè) vDSO,包含了系統(tǒng)調(diào)用入口這個(gè) vDSO 被映射到每個(gè)進(jìn)程的內(nèi)存地址空間里它本身是 ELF shared object 文件格式,但是又不是以文件形態(tài)存在,所以叫做vDSOLinux kernel

13、也用這種方式實(shí)現(xiàn)了一些簡(jiǎn)單的系統(tǒng)調(diào)用,比如 getdaytime()。但是Zircon 并不是為了避免切換內(nèi)核態(tài),而是把系統(tǒng)調(diào)用的接口用 vDSO 進(jìn)行隔離系統(tǒng)調(diào)用 vDSO第19頁,共47頁。vDSO 最大的優(yōu)勢(shì)在于保證二進(jìn)制接口(ABI)兼容性的同時(shí),不干擾升級(jí)系統(tǒng)調(diào)用的實(shí)現(xiàn)。Linux 的系統(tǒng)調(diào)用 ABI 是基于 處理器中斷的,每個(gè)系統(tǒng)調(diào)用都有自己的系統(tǒng)調(diào)用編號(hào),這么多年來除了 syscall/sysenter 并沒有本質(zhì)上的升級(jí)。這是因?yàn)?相當(dāng)多的預(yù)編譯好的程序會(huì)不管三七二十一去調(diào)用中斷。一旦 Linux 不再支持基于中斷的系統(tǒng)調(diào)用接口,那這些現(xiàn)有的應(yīng)用 程序除非返回源代碼重新編譯,否

14、則無法正常運(yùn)行。Fuchsia 非常重視 ABI 兼容性,但同時(shí)也不希望放棄將來優(yōu)化系統(tǒng)調(diào)用 的機(jī)會(huì)。這類問題可以通過多加一層間接調(diào)用來解決(Fundamental theorem of software engineering)。Fuchsia 里所有的系統(tǒng)調(diào)用都必須由 vDSO 發(fā)起。用戶代碼要想調(diào)用系統(tǒng)函數(shù)就要先動(dòng)態(tài)鏈接上 vDSO,再呼叫 vDSO 中 的某個(gè)函數(shù),再由那個(gè)函數(shù)去調(diào)用系統(tǒng)。這樣一來用戶程序跟內(nèi)核接口完全解耦。下一版,F(xiàn)uchsia 無論是要改變系統(tǒng)調(diào)用 的寄存器順序,還是改換效率更高的調(diào)用約定,都可以通過更新 vDSO 來無縫兼容現(xiàn)有的一切應(yīng)用。另外,在 Linux 里

15、遇到緩沖區(qū)溢出 bug,攻擊者能夠注射一段調(diào)用系統(tǒng)函數(shù)的代碼,從而拿到 shell。但是在 Fuchsia 里因 為系統(tǒng)調(diào)用來源強(qiáng)制限制為 vDSO,而 vDSO 所在的內(nèi)存頁面永遠(yuǎn)是只讀頁面,注入的代碼并不能調(diào)用任何系統(tǒng)函數(shù),形 成了 0-day 漏洞前方的最后一道防線(內(nèi)核會(huì)檢查入口指令的地址,而vDSO映射的地址是固定的)。vDSO 的好處第20頁,共47頁。Linus vs Tanenbaum 的論戰(zhàn)Tanenbaum: Linux 是七十年代的技術(shù)。在 1991 年寫宏內(nèi)核是錯(cuò)誤的。爭(zhēng)論早就結(jié)束了,微內(nèi)核已經(jīng)贏了。 我是教授,Minix 只是我的 hobby,所以別拿 Minix 說

16、事。Linus: Linux 比你寫的 Minix 強(qiáng)多了。微內(nèi)核只是你們學(xué)術(shù)界的玩具,我看過所有的關(guān)于微內(nèi)核效率優(yōu)化的 論文,它們實(shí)際上只是在重復(fù)宏內(nèi)核早就用過的技巧。Mach, HurdPerformance overheadContext switching (user space kernel space)Thread scheduling微內(nèi)核第21頁,共47頁。Monolithic kernelMicrokernelapplicationapplicationVFSext2VFS|ext2device driver_|device driverIPCkernelkerneldisk

17、|disk第22頁,共47頁。MonolithicCPU0Context switching: 2MicroCPU0Context switching: 8Thread scheduling: 4Overhead: single core case第23頁,共47頁。CPU0CPU0CUP1CUP2CUP3第24頁,共47頁。MonolithicCPU0Context switching: 2Overhead: multicore caseMicroCPU0Context switching: 2CPU1Context switching: 2CPU2Context switching: 2C

18、PU3Context switching: 2第25頁,共47頁。Fuchsia 架構(gòu)HardwareKernel (process, IPC,mm)Flutter Frameworkdevmgr(/dev)devhostdevhost(/dev/x)devhostdevhost(gpu driver)appmgr(/hub)sysmgrscenic (Vulkan)Applicationsfshost(/)svchost(/svc)第26頁,共47頁。在服務(wù)器平臺(tái)上,原生的進(jìn)程沙箱機(jī)制將帶來新的安全特性和容器機(jī)制在桌面平臺(tái)上,類似于游戲 3D 引擎 pipeline 的圖形棧以及毫無遺產(chǎn)負(fù)擔(dān)

19、的實(shí)現(xiàn)將使電子娛樂應(yīng)用變得更為高效;無縫兼容龐大的 Android 生態(tài)在移動(dòng)平臺(tái)上,系統(tǒng)的模塊化方便第三方設(shè)備廠商的全面定制,驅(qū)動(dòng)框架方便硬件廠 商編寫和維護(hù)私有驅(qū)動(dòng)Fuchsia 在各個(gè)平臺(tái)上的可能的優(yōu)勢(shì)第27頁,共47頁。Ubuntu 18.10 很精致,X + OpenGL/Vulkan + QT 比較穩(wěn)定可靠了X Window 誕生于 1984 年,越來越多的功能被加入到 X stack 里隨著技術(shù)的發(fā)展,越來越多的功能從X中移到內(nèi)核或者是其他專門的庫(kù)中:kms, cairo, opengl/vulkan DRI2, fontconfig/freetypeX 的問題:window m

20、anager 也作為一個(gè) client,導(dǎo)致效率低,容易出 bug,如果不遵循 ICCCM 的話Wayland 是一個(gè)融合了 compositor 的 display server, 去掉了 X 里的過時(shí)功能,比如繪制但是 Nvidia 和其余廠商還沒有就 Wayland 里的 buffer 管理達(dá)成一致,導(dǎo)致 nv 還不支持 wayland注:在 X 里,OpenGL/Vulkan 是嵌在 Window 里的;在 Fuchsia 里,整個(gè)桌面的繪制是交給 Vulkan 的Linux 桌面的現(xiàn)狀第28頁,共47頁。第29頁,共47頁。Fuchsia 是一個(gè)像 Lego 玩具一樣組裝起來的操作系

21、統(tǒng)谷歌在設(shè)計(jì)時(shí)已經(jīng)考慮了其他廠商可能會(huì)深度定制適配自己產(chǎn)品的操作系統(tǒng),所以模塊化做得比 Android 徹 底很多廠商的深度定制可以從以下任意一層開始Zircon: 微內(nèi)核,基礎(chǔ)服務(wù)進(jìn)程(設(shè)備管理器,核心設(shè)備驅(qū)動(dòng),libc, 進(jìn)程間通信接口 庫(kù)fidl)Garnet: 設(shè)備層面的系統(tǒng)服務(wù):軟件安裝,通信,媒體,圖形,包管理,更新系統(tǒng)等Peridot: 用戶體驗(yàn)的基礎(chǔ)設(shè)施層:模塊,用戶,存儲(chǔ)服務(wù),等等Topaz: 系統(tǒng)的基礎(chǔ)應(yīng)用,Web, Dart, Flutter這些名字來自于 Steven UniverseFuchsia 分層第30頁,共47頁。Fuchsia 啟動(dòng)流程設(shè)置各種控 制寄存器,

22、 進(jìn)入 EL1設(shè)置內(nèi)核頁 表,打開虛 擬內(nèi)存為當(dāng)前執(zhí)行 軌跡初始化 為線程結(jié)構(gòu)之后進(jìn)入C 的世界用 psci smccall 啟動(dòng)副cpu進(jìn)行一系列 初始化,包 括各種設(shè)備 構(gòu)造第一個(gè)用戶 態(tài)線程userboot,內(nèi)核 線程進(jìn)入 idle Userboot 從bootfs 中加載 第一個(gè)文件進(jìn)程 devmgr devmgr= svchost, fshost, devhost, appmgr= sysmgrZircon 內(nèi)核線程比較少,主要是 dpc thread (deferred procedure call)第31頁,共47頁。上面的符號(hào)代表虛擬地址(4G之上)o.ode_:s t ar

23、t =-4G,. ;p ode_e叫一血壓 ,n + Pll,厄 t 改kI_s t 叩J!皿E;_團(tuán)衛(wèi)團(tuán)叩。t t _ rt, 畫 110 1 ine_. s pt hr,id)s t 邸K ,!喊叩el l ,.s p (f trs t )_ llooitda t a_f i 胚:_h.細(xì)d 釭kernel叩 (second)hootdatak1田沺l扭yLoad句o.e l:ii 正 也 ,eII、面的符號(hào)代表物理地址(O開始 )第32頁,共47頁。之前的微內(nèi)核一般需要實(shí)現(xiàn)一個(gè)基本的文件系統(tǒng)加載功能在內(nèi)核里,然后加載第一個(gè) 用戶進(jìn)程文件,之后就不再使用內(nèi)核里的文件系統(tǒng)功能Zircon 把

24、第一個(gè)用戶態(tài)進(jìn)程的 ELF 文件嵌入進(jìn)內(nèi)核映像里,這樣就不需要從文件系 統(tǒng)里加載了第一個(gè)用戶態(tài)進(jìn)程的創(chuàng)建第33頁,共47頁。devmgr, devhost, svchost, fshostAppmgrSysmgrFuchsia 定義了一套穩(wěn)定的 DDK 接口,硬件廠商開發(fā)自己的閉源驅(qū)動(dòng)的方便性大大 提高了。因?yàn)?Linux kernel 是拒絕提供穩(wěn)定的內(nèi)核內(nèi)部驅(qū)動(dòng)接口的。要想被官方維 護(hù),就得放進(jìn)內(nèi)核里,否則只能自己跟著內(nèi)核去改接口內(nèi)核不提供 POSIX 支持,用戶層可以模擬一部分 POSIX 接口Zircon 用戶態(tài)第34頁,共47頁。ELF 的加載位置是隨機(jī)的,并不是遵守 ELF pro

25、gram header 里規(guī)定的 v_addr會(huì)在加載時(shí)對(duì)符號(hào)地址進(jìn)行修正Kernel Address Space Layout Randomization第35頁,共47頁。Qemu最方便的環(huán)境,沒有 GUIIntel NUC目前最好的測(cè)試環(huán)境,有 GUIKhadas Vim2Google 內(nèi)部開發(fā)用的板子Fuchsia 目前的運(yùn)行環(huán)境第36頁,共47頁。在 Qemu 中可以直接運(yùn)行Booloader 加載到 0 x40080000內(nèi)核加載到 0 x40090000Ramdisk 加載到 0 x480000000 x40000000-0 x40080000 之間是 FDTflattened

26、device treeQemu第37頁,共47頁。開發(fā)機(jī)啟動(dòng) paving 服務(wù),會(huì)將整個(gè) Fuchsia 操作系統(tǒng)刷到 NUC 上啟動(dòng) Zircon 到 zedboot 模式,會(huì)直接連接開發(fā)機(jī)Intel NUC第38頁,共47頁。Amlogic S912 SoCQuad Core A53Mali-T450MP5 GPU3G DDR464G eMMC storageHDMI, USB-C, USB 2.0, TF Card, Ethernet, WiFi, BluetoothKhadas Vim2 開發(fā)板第39頁,共47頁。Arm Trusted Firmware:BL1 in ROMCustom u-boot: BL2 + BL30 +BL31 + BL32 + u-boot(BL33)其中 bl2,bl30,bl31,bl32 都是 amlogic 提供的 binaryBl33 從 emmc offset 0 x5020

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論