佛山科學(xué)技術(shù)學(xué)院-操作系統(tǒng)-虛擬存儲(chǔ)器-實(shí)驗(yàn)報(bào)告_第1頁
佛山科學(xué)技術(shù)學(xué)院-操作系統(tǒng)-虛擬存儲(chǔ)器-實(shí)驗(yàn)報(bào)告_第2頁
佛山科學(xué)技術(shù)學(xué)院-操作系統(tǒng)-虛擬存儲(chǔ)器-實(shí)驗(yàn)報(bào)告_第3頁
佛山科學(xué)技術(shù)學(xué)院-操作系統(tǒng)-虛擬存儲(chǔ)器-實(shí)驗(yàn)報(bào)告_第4頁
佛山科學(xué)技術(shù)學(xué)院-操作系統(tǒng)-虛擬存儲(chǔ)器-實(shí)驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(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í)驗(yàn)三虛擬存儲(chǔ)器3.1背景知識(shí)在Windows2000環(huán)境下,4GB的虛擬地址空間被劃分成兩個(gè)部分:低端2GB提供給進(jìn)程使用,高端2GB提供給系統(tǒng)使用。這意味著用戶的應(yīng)用程序代碼,包括DLL以及進(jìn)程使用的各種數(shù)據(jù)等,都裝在用戶進(jìn)程地址空間內(nèi)(低端2GB)。用戶過程的虛擬地址空間也被分成三部分:1)虛擬內(nèi)存的已調(diào)配區(qū)(committed):具有備用的物理內(nèi)存,根據(jù)該區(qū)域設(shè)定的訪問權(quán)限,用戶可以進(jìn)行寫、讀或在其中執(zhí)行程序等操作。2)虛擬內(nèi)存的保留區(qū)(reserved):沒有備用的物理內(nèi)存,但有一定的訪問權(quán)限。3)虛擬內(nèi)存的自由區(qū)(free):不限定其用途,有相應(yīng)的PAGE_NOACCESS權(quán)限。與

2、虛擬內(nèi)存區(qū)相關(guān)的訪問權(quán)限告知系統(tǒng)進(jìn)程可在內(nèi)存中進(jìn)行何種類型的操作。例如,用戶不能在只有PAGE_READONLY權(quán)限的區(qū)域上進(jìn)行寫操作或執(zhí)行程序;也不能在只有PAGE_EXECUTE權(quán)限的區(qū)域里進(jìn)行讀、寫操作。而具有PAGE_NOACCESS權(quán)限的特殊區(qū)域,則意味著不允許進(jìn)程對(duì)其地址進(jìn)行任何操作。在進(jìn)程裝入之前,整個(gè)虛擬內(nèi)存的地址空間都被設(shè)置為只有PAGE_NOACCESS權(quán)限的自由區(qū)域。當(dāng)系統(tǒng)裝入進(jìn)程代碼和數(shù)據(jù)后,才將內(nèi)存地址的空間標(biāo)記為已調(diào)配區(qū)或保留區(qū),并將諸如EXECUTE、READWRITE和READONLY的權(quán)限與這些區(qū)域相關(guān)聯(lián)。如表3-2所示,給出了MEMORY_BASIC_INF

3、ORMAITON的結(jié)構(gòu),此數(shù)據(jù)描述了進(jìn)程虛擬內(nèi)存空間中的一組虛擬內(nèi)存頁面的當(dāng)前狀態(tài),期中State項(xiàng)表明這些區(qū)域是否為自由區(qū)、已調(diào)配區(qū)或保留區(qū);Protect項(xiàng)則包含了windows系統(tǒng)為這些區(qū)域添加了何種訪問保護(hù);type項(xiàng)則表明這些區(qū)域是課執(zhí)行圖像、內(nèi)存映射文件還是簡(jiǎn)單的私有內(nèi)存。VirsualQueryEX()API能讓用戶在指定的進(jìn)程中,對(duì)虛擬內(nèi)存地址的大小和屬性進(jìn)行檢測(cè)。Windows還提供了一整套能使用戶精確控制應(yīng)用程序的虛擬地址空間的虛擬內(nèi)存API。一些用于虛擬內(nèi)存操作及檢測(cè)的API如表3-2所示。表3-1MEMORY_BASIC_INFORMAITON結(jié)構(gòu)的成員成員名稱目的PV

4、OIDBaseAddress虛擬內(nèi)存區(qū)域開始處的指針PVOIDAllocationBase如果這個(gè)特定的區(qū)域?yàn)樽臃峙鋮^(qū)的話,則為虛擬內(nèi)存外面區(qū)域的指針;否則此值與BaseAddress相同DWORDAllocationProtect虛擬內(nèi)存最初分配區(qū)域的保護(hù)屬性。其可能值包括:PAGE_NOACCESS,PAGE_READONLY,PAGE_READWRITE和PAGE_EXECUTE_READDWORDRegionSize虛擬內(nèi)存區(qū)域的字節(jié)數(shù)DWORDState區(qū)域的當(dāng)前分配狀態(tài)。其可能值為MEM_COMMIT,MEM_PREE和MEM_RESERVEDWORDProtect虛擬內(nèi)存當(dāng)前的保

5、護(hù)屬性??赡苤蹬cAllocationProtect成員的相同DWORDType虛擬內(nèi)存區(qū)域中出現(xiàn)的頁面類型??赡苤禐镸EM_IMAGE,MEM_MAPPED和MEM_PRIVATE表3-2虛擬內(nèi)存的APIAPI名稱描述VisualQueryEX()通過填充MEMORY_BASIC_INFORMATION結(jié)構(gòu)檢測(cè)進(jìn)程內(nèi)虛擬內(nèi)存的區(qū)域VisualAlloc()保留或調(diào)配進(jìn)程的部分虛擬內(nèi)存,設(shè)置分配和保護(hù)標(biāo)志VirsualFree()釋放或收回應(yīng)用程序使用的部分虛擬地址VirsualProtect()改變虛擬內(nèi)存區(qū)域保護(hù)規(guī)范VirsualLock()防止系統(tǒng)將虛擬內(nèi)存區(qū)域通過系統(tǒng)交換到頁面文件中Vi

6、rsualUnlock()釋放虛擬內(nèi)存的鎖定區(qū)域,必要時(shí),允許系統(tǒng)將其交換到頁面文件中提供虛擬內(nèi)存分配功能的是VirtualAlloc()API。該API支持用戶向系統(tǒng)要求新的虛擬內(nèi)存或改變已分配內(nèi)存的當(dāng)前狀態(tài)。用戶若想通過VirtualAlloc()函數(shù)使用虛擬內(nèi)存,可以采用兩種方式通知系統(tǒng):1)簡(jiǎn)單地將內(nèi)存內(nèi)容保存在地址空間內(nèi)2)請(qǐng)求系統(tǒng)返回帶有物理存儲(chǔ)區(qū)(RAM的空間或換頁文件)的部分地址空間用戶可以用flAllocationType參數(shù)(commit和reserve)來定義這些方式,用戶可以通知Windows按只讀、讀寫、不可讀寫、執(zhí)行或特殊方式來處理新的虛擬內(nèi)存。與VirtualAl

7、loc()函數(shù)對(duì)應(yīng)的是VirtualFree()函數(shù),其作用是釋放虛擬內(nèi)存中的已調(diào)配頁或保留頁。用戶可利用dwFreeType參數(shù)將已調(diào)配頁修改成保留頁屬性。VirtualProtect()是VirtualAlloc()的一個(gè)輔助函數(shù),利用它可以改變虛擬內(nèi)存區(qū)的保護(hù)規(guī)范。實(shí)驗(yàn)?zāi)康拇鎯?chǔ)管理的主要功能之一是合理的分配空間。請(qǐng)求頁式管理是一種常用的虛擬存儲(chǔ)管理技術(shù)。本實(shí)驗(yàn)的目的是請(qǐng)求頁式存儲(chǔ)管理中頁面置換算法模擬設(shè)計(jì),了解虛擬存儲(chǔ)技術(shù)的特點(diǎn),掌握請(qǐng)求頁式存儲(chǔ)管理的頁面置換方法。1)通過實(shí)驗(yàn)了解Windows2000內(nèi)存的使用,學(xué)習(xí)如何在應(yīng)用程序中管理內(nèi)存,體會(huì)Windows應(yīng)用程序內(nèi)存的簡(jiǎn)單性和自我

8、防護(hù)能力。2)學(xué)習(xí)檢查虛擬內(nèi)存空間或?qū)ζ溥M(jìn)行操作。3)了解Windows2000的內(nèi)存結(jié)構(gòu)和虛擬內(nèi)存的管理,進(jìn)而了解進(jìn)程堆和Windows為使用內(nèi)存而提供的一些擴(kuò)展功能。實(shí)驗(yàn)內(nèi)容與步驟1、工具/準(zhǔn)備工作在開始本實(shí)驗(yàn)之前,請(qǐng)回顧教科書的相關(guān)內(nèi)容。您需要做以下準(zhǔn)備:一臺(tái)運(yùn)行Windows2000Professional操作系統(tǒng)的計(jì)算機(jī)。2)計(jì)算機(jī)中需安裝VisualC+6.0專業(yè)版或企業(yè)版。2、虛擬內(nèi)存的檢測(cè)清單3-2所示的程序使用VirtualQueryEX()函數(shù)來檢查虛擬內(nèi)存空間。步驟1:登錄進(jìn)入Windows2000Professional。步驟2:在“開始”菜單中單擊“程序”-Micro

9、softVisualStudio6.0”“MicrosoftVisualC+6.0”命令,進(jìn)入VisualC+窗口。步驟3:在工具欄單擊“打開”按鈕,在“打開”對(duì)話框中找到并打開實(shí)驗(yàn)源程序3-12.cpp。清單3-1檢測(cè)進(jìn)程的虛擬地址空間/工程vmwalker#include#include#include#include#pragmacomment(lib,Shlwapi.lib)/以可讀方式對(duì)用戶顯示保護(hù)的輔助方法。/保護(hù)標(biāo)記表示允許應(yīng)用程序?qū)?nèi)存進(jìn)行訪問的類型/以及操作系統(tǒng)強(qiáng)制訪問的類型inlineboolTestSet(DWORDdwTarget,DWORDdwMask)return(

10、dwTarget&dwMask)=dwMask);#defineSHOWMASK(dwTarget,type)if(TestSet(dwTarget,PAGE_#type)std:cout,#type;voidShowProtection(DWORDdwTarget)SHOWMASK(dwTarget,READONLY);SHOWMASK(dwTarget,GUARD);SHOWMASK(dwTarget,NOCACHE);SHOWMASK(dwTarget,READWRITE);SHOWMASK(dwTarget,WRITECOPY);SHOWMASK(dwTarget,EXECUTE);S

11、HOWMASK(dwTarget,EXECUTE_READ);SHOWMASK(dwTarget,EXECUTE_READWRITE);SHOWMASK(dwTarget,EXECUTE_WRITECOPY);SHOWMASK(dwTarget,NOACCESS);/遍歷整個(gè)虛擬內(nèi)存并對(duì)用戶顯示其屬性的工作程序的方法voidWalkVM(HANDLEhProcess)/首先,獲得系統(tǒng)信息SYSTEM_INFOsi;:ZeroMemory(&si,sizeof(si);:GetSystemInfo(&si);/分配要存放信息的緩沖區(qū)MEMORY_BASIC_INFORMATIONmbi;:Zer

12、oMemory(&mbi,sizeof(mbi);/循環(huán)整個(gè)應(yīng)用程序地址空間LPCVOIDpBlock=(LPVOID)si.lpMinimumApplicationAddress;while(pBlocksi.lpMaximumApplicationAddress)/獲得下一個(gè)虛擬內(nèi)存塊的信息/相關(guān)的進(jìn)程if(:VirtualQueryEx(hProcess,/實(shí)際虛擬內(nèi)存的模塊句柄pBlock,&mbi,sizeof(mbi)=sizeof(mbi)/開始位置/緩沖區(qū)/大小的確認(rèn)/計(jì)算塊的結(jié)尾及其大小LPCVOIDpEnd=(PBYTE)pBlock+mbi.RegionSize;TCHA

13、RszSizeMAX_PATH;:StrFormatByteSize(mbi.RegionSize,szSize,MAX_PATH);/顯示塊地址和大小std:cout.fill(0);std:coutstd:hexstd:setw(8)(DWORD)pBlock-std:hexstd:setw(8)(DWORD)pEnd(:strlen(szSize)=7?(:()szSize);/顯示塊的狀態(tài)switch(mbi.State)caseMEM_COMMIT:std:coutCommitted;break;caseMEM_FREE:std:coutFree;break;caseMEM_RESE

14、RVE:std:coutReserved;break;/顯示保護(hù)if(mbi.Protect=0&mbi.State!=MEM_FREE)mbi.Protect=PAGE_READONLY;ShowProtection(mbi.Protect);/顯示類型switch(mbi.Type)caseMEM_IMAGE:std:cout,Image;break;caseMEM_MAPPED:std:cout,Mapped;break;caseMEM_PRIVATE:std:cout0)/實(shí)際使用的緩沖區(qū)大小/除去路徑并顯示:PathStripPath(szFilename);std:cout,Mod

15、ule:szFilename;std:coutstd:endl;/移動(dòng)塊指針以獲得下一下個(gè)塊pBlock=pEnd;voidmain()/遍歷當(dāng)前進(jìn)程的虛擬內(nèi)存:WalkVM(:GetCurrentProcess();清單3-2中顯示一個(gè)walkVM()函數(shù)開始于某個(gè)進(jìn)程可訪問的最低端虛擬地址處,并在其中顯示各塊虛擬內(nèi)存的特性。虛擬內(nèi)存中的塊由VirsualQueryEX()API定義成連續(xù)快或具有相同狀態(tài)(自由區(qū),已調(diào)配區(qū)等)的內(nèi)存,并分配以一組統(tǒng)一的保護(hù)標(biāo)志(只讀、可執(zhí)行等)。步驟4:?jiǎn)螕簟癇uild”菜單中的“Compile5-2.cpp”命令,并單擊“是”按鈕確認(rèn)。系統(tǒng)對(duì)5-2.CPP

16、進(jìn)行編譯。步驟5:編譯完成后,單擊“Build”菜單中的“Build3-2.exe”命令,建立3-2.exe可執(zhí)行文件。操作能否正常進(jìn)行?如果不行,則可能的原因是什么?操作能正常運(yùn)行。步驟6:在工具欄單擊“ExecuteProgram(執(zhí)行程序)按鈕,執(zhí)行3-2.exe程序。1)分析運(yùn)行結(jié)果(如果運(yùn)行不成功,則可能的原因是什么)按committed,reserved,free等三種虛擬地址空間分別記錄實(shí)驗(yàn)數(shù)據(jù),其中“描述”是對(duì)該組數(shù)據(jù)的簡(jiǎn)單描述,例如,對(duì)下列一組數(shù)據(jù):00010000-00012000Committed,READWRITE,Private可描述為:具有READWRITE權(quán)限的已

17、調(diào)配私有內(nèi)存區(qū)。將系統(tǒng)當(dāng)前的自由區(qū)。)虛擬地址空間填入表3-3中。表3-3實(shí)驗(yàn)記錄地址大小虛擬空間類型訪問權(quán)限描述00012000-0002000056.0KBfreeNOACCESS沒有任何權(quán)限的已調(diào)配的共有內(nèi)存區(qū)00021000-0003000060.0KBfreeNOACCESS沒有任何權(quán)限的已調(diào)配的共有內(nèi)存區(qū)00135000-0014000044.0KBfreeNOACCESS沒有任何權(quán)限的已調(diào)配的共有內(nèi)存區(qū)00266000-0027000040.0KBfreeNOACCESS沒有任何權(quán)限的已調(diào)配的共有內(nèi)存區(qū)002b1000-002c000060.0KBfreeNOACCESS沒有任何

18、權(quán)限的已調(diào)配的共有內(nèi)存區(qū)00301000-0031000060.0KBfreeNOACCESS沒有任何權(quán)限的已調(diào)配的共有內(nèi)存區(qū)00316000-0032000040.0KBfreeNOACCESS沒有任何權(quán)限的已調(diào)配的共有內(nèi)存區(qū)將系統(tǒng)當(dāng)前的已調(diào)配區(qū)(Committed)虛擬地址空間填入表3-4中。表3-4實(shí)驗(yàn)記錄地址大小虛擬空間類型訪問權(quán)限描述00010000-000120008.00KBCommittedPrivate只有具有READWRITE權(quán)限的已調(diào)配私有內(nèi)存區(qū)00020000-000210004.00KBCommittedPrivate只有具有READWRITE權(quán)限的已調(diào)配私有內(nèi)存區(qū)0

19、012c000-0012d0004.00KBCommittedPrivate具有GUARD,READEWRITE權(quán)限的已調(diào)配私有內(nèi)存區(qū)0012d000-0013000012.0KBCommittedPrivate只有具有READWRITE權(quán)限的已調(diào)配私有內(nèi)存區(qū)00130000-0013500020.0KBCommittedMapped只有具有READONLY權(quán)限的已調(diào)配映射內(nèi)存區(qū)00140000-0014700028.0KBCommittedPrivate只有具有READWRITE權(quán)限的已調(diào)配私有內(nèi)存區(qū)00240000-0024300012.0KBCommittedMapped只有具有READ

20、WRITE權(quán)限的已調(diào)配映射內(nèi)存區(qū)將系統(tǒng)當(dāng)前的保留區(qū)(Reserved)虛擬地址空間填入表3-5中。表3-5實(shí)驗(yàn)記錄地址大小虛擬空間類型訪問權(quán)限描述00030000-0012c0000.98MBReservedPrivate只有具有READONLY權(quán)限的已調(diào)配私有內(nèi)存區(qū)00147000-00240000996KBReservedPrivate只有具有READONLY權(quán)限的已調(diào)配私有內(nèi)存區(qū)00243000-0025000052.0KBReservedMapped只有具有READONLY權(quán)限的已調(diào)配映射內(nèi)存區(qū)00373000-0038000052.0KBReservedPrivate只有具有READ

21、ONLY權(quán)限的已調(diào)配私有內(nèi)存區(qū)00398000-003a000032.0KBReservedPrivate只有具有READONLY權(quán)限的已調(diào)配私有內(nèi)存區(qū)003c5000-003d000044.0KBReservedPrivate只有具有READONLY權(quán)限的已調(diào)配私有內(nèi)存區(qū)003d6000-003e000040.0KBReservedPrivate只有具有READONLY權(quán)限的已調(diào)配私有內(nèi)存區(qū)2)從上述輸出結(jié)果,對(duì)照分析清單5-2的程序,請(qǐng)簡(jiǎn)單描述程序運(yùn)行的流程:該程序,從主函數(shù)出發(fā),調(diào)用voidWalkVM(HANDLEhProcess)函數(shù),voidWalkVM(HANDLEhProces

22、s)函數(shù)先得系統(tǒng)信息,再分配應(yīng)用程序地址空間,接下來就是做循環(huán)函數(shù)內(nèi)做循環(huán):首先每次獲得下一個(gè)虛擬程序內(nèi)存的信息一計(jì)算塊的結(jié)尾及其大小,然后再顯示塊的大小與位置,及其狀態(tài),顯示保護(hù)方式顯示類型,檢查可執(zhí)行的影像一除去文件名的路徑并將文件名顯示出來一移動(dòng)塊指針以獲得下一個(gè)塊,從新做循環(huán)。3、虛擬內(nèi)存的分配與釋放能正確使用系統(tǒng)函數(shù)GetMeoryStatus()和數(shù)據(jù)結(jié)構(gòu)MEMORY_STATUS了解系統(tǒng)內(nèi)存和虛擬存儲(chǔ)空間使用情況,會(huì)使用VirsualAlloc()函數(shù)和VirsualFree()函數(shù)分配和釋放虛擬內(nèi)存空間。/GetMemoryStatus.cpp:Definestheentryp

23、ointfortheconsoleapplication./#includestdafx.h#includeGetMemoryStatus.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE=_FILE_;#endifvoidGetMemSta(void);/TheoneandonlyapplicationobjectCWinApptheApp;usingnamespacestd;int_tmain(intargc,TCHAR*argv,TCHAR*envp)intnRetCode=0;LPVOIDBaseAdd

24、r;char*str;GetMemSta();printf(NowAllocate32MVirsualMemoryand2MPhysicalMemorynn);BaseAddr=:VirtualAlloc(NULL,1024*1024*32,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);/分配虛擬內(nèi)存if(BaseAddr=NULL)printf(VirsualAllocateFail.n);str=(char*)malloc(1024*1024*2);/分配內(nèi)存GetMemSta();printf(NowRelease32MVirsualMemoryand2M

25、PhysicalMemorynn);if(:VirtualFree(BaseAddr,0,MEM_RELEASE)=0)/釋放虛擬內(nèi)存printf(ReleaseAllocateFail.n);free(str);/釋放內(nèi)存GetMemSta();returnnRetCode;voidGetMemSta(void)MEMORYSTATUSMemInfo;GlobalMemoryStatus(&MemInfo);printf(CurrentMemoryStatusis:n);printf(tTotalPhysicalMemoryis%dMBn,MemInfo.dwTotalPhys/(1024*

26、1024);printf(tAvailablePhysicalMemoryis%dMBn,MemInfo.dwAvailPhys/(1024*1024);printf(tTotalPageFileis%dMBn,MemInfo.dwTotalPageFile/(1024*1024);printf(tAvailablePageFileis%dMBn,MemInfo.dwAvailPageFile/(1024*1024);printf(tTotalVirtualMemoryis%dMBn,MemInfo.dwTotalVirtual/(1024*1024);printf(tAvailableVir

27、sualmemoryis%dMBn,MemInfo.dwAvailVirtual/(1024*1024);printf(tMemoryLoadis%d%nn,MemInfo.dwMemoryLoad);步驟1:在VC6.0環(huán)境下選擇Win32ConsoleApplication建立一個(gè)控制臺(tái)工程文件,選擇AnapplicationthatSupportsMFC。步驟2:編輯并編譯完成后,單擊“Build”菜單中的“BuildGetMemoryStatus.exe”命令,建立GetMemoryStatus.exe可執(zhí)行文件。操作能否正常進(jìn)行?如果不行,則可能的原因是什么?操作能正常進(jìn)行。步驟3:在工具欄單擊“ExecuteProgram”按鈕,執(zhí)行GetMemoryStatus.cpp.exe程序。分析程序GetMemoryStatus.cpp的運(yùn)行結(jié)果1)請(qǐng)描述運(yùn)行結(jié)果(如果運(yùn)行不成功,則可能的原因是什么?):運(yùn)行結(jié)果如下:CurrentMemoryStatusis:TotalPhysicalMemoryis2047MBAvailablePhysicalMemoryis2047MBTotalPageFileis4095MBAvailablePageFileis4095MBTot

溫馨提示

  • 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. 人人文庫網(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)論