編寫實(shí)模式多任務(wù)操作系統(tǒng)模型之一_第1頁
編寫實(shí)模式多任務(wù)操作系統(tǒng)模型之一_第2頁
編寫實(shí)模式多任務(wù)操作系統(tǒng)模型之一_第3頁
編寫實(shí)模式多任務(wù)操作系統(tǒng)模型之一_第4頁
編寫實(shí)模式多任務(wù)操作系統(tǒng)模型之一_第5頁
已閱讀5頁,還剩18頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、操作系統(tǒng)是計(jì)算機(jī)軟件系統(tǒng)的重要組成部分,它起著管理計(jì)算機(jī)軟硬件資源、控制計(jì)算機(jī)的正常運(yùn)行及為各類用戶提供使用接口等諸多功能,是其它各類應(yīng)用軟件賴以存在的基礎(chǔ)。 由于操作系統(tǒng)軟件多數(shù)以公司模式集體開發(fā),并以成品軟件的形式進(jìn)行發(fā)售,使得用戶只能局限于操作系統(tǒng)所提供的使用界面及系統(tǒng)功能調(diào)用上,對(duì)于系統(tǒng)底層的運(yùn)行機(jī)制的理解只能局限于一些表面現(xiàn)象上,不能深入把握操作系統(tǒng)內(nèi)部的運(yùn)作機(jī)理,即使以源碼形式提供的,也由于其規(guī)模龐大、特征繁多,使得用戶不可能在短時(shí)間內(nèi)完全掌握運(yùn)行機(jī)制。為了能充分了解操作系統(tǒng)的功能實(shí)現(xiàn),自己親自動(dòng)手編寫一個(gè)小型的,或是實(shí)現(xiàn)部分功能的操作系統(tǒng)模型,而后逐步完善不失為一種好方法。本文所

2、述的這一操作系統(tǒng)模型即是在這方面的一次嘗試。 功能及特點(diǎn)1.實(shí)現(xiàn)在x86實(shí)模式下分時(shí)的多任務(wù)功能。 2.PC機(jī)自檢完成后可以完成機(jī)器的引導(dǎo)。 3.引導(dǎo)成功后可以使3個(gè)進(jìn)程并行運(yùn)行,分別運(yùn)行于自身的程序空間內(nèi),完成自身計(jì)數(shù)器的計(jì)值工作,并采用直接寫屏方式輸出到屏幕上。 4.有一個(gè)內(nèi)核級(jí)鍵盤中斷處理程序。 5.軟件規(guī)模小巧,易于研讀、理解和實(shí)踐,以及進(jìn)行功能的增強(qiáng)和拓展。 6.程序分模塊編寫,功能明確,界限清晰。 7.對(duì)于機(jī)器的配置要求極低,以Intel 80x86 處理器為CPU的PC機(jī)、VGA彩色顯示器、3英寸軟驅(qū)即可。 運(yùn)行機(jī)制眾所周知,Intel 80386以上的CPU具有實(shí)模式和保護(hù)模式

3、兩種工作方式,處于保護(hù)模式的CPU在硬件上支持存儲(chǔ)器管理、虛擬地址、分頁、保護(hù)等功能,具有多任務(wù)切換機(jī)制,是現(xiàn)今的多用戶多任務(wù)操作系統(tǒng)如Windows、Linux、FreeBSD 等所采用的工作方式。而工作于實(shí)模式80386 及以上的CPU相當(dāng)于高性能的8086 CPU ,本身在硬件上不具備多任務(wù)的切換機(jī)制,那末,在x86的實(shí)模式下是否可以實(shí)現(xiàn)現(xiàn)多任務(wù)功能呢?答案是肯定的,利用軟件進(jìn)行模擬。 本程序在系統(tǒng)時(shí)鐘中斷的驅(qū)動(dòng)下,利用軟件方式在x86 CPU實(shí)模式下實(shí)現(xiàn)了一個(gè)多任務(wù)操作系統(tǒng)模型,可以啟動(dòng)機(jī)器,并在屏幕上顯示由3個(gè)并行進(jìn)程輸出的各自程序計(jì)數(shù)器。 在宏觀上,3個(gè)進(jìn)程在并行運(yùn)行。在微觀實(shí)現(xiàn)上

4、,通過時(shí)鐘中斷的控制,3個(gè)進(jìn)程依次輪流占用CPU完成各自的工作,即每當(dāng)發(fā)生時(shí)鐘中斷,Kernel內(nèi)的調(diào)度程序被激活,順序?qū)⑾乱粋€(gè)先前被剝奪運(yùn)行權(quán)的進(jìn)程賦予運(yùn)行權(quán),使其可以占用CPU運(yùn)行,當(dāng)再次發(fā)生時(shí)鐘中斷時(shí),當(dāng)前運(yùn)行的進(jìn)程被強(qiáng)行中斷運(yùn)行,調(diào)度程序?qū)⑵鋽帱c(diǎn)信息保存到該進(jìn)程的堆棧區(qū),待下次運(yùn)行時(shí)再將其恢復(fù),而后調(diào)度程序選擇下一進(jìn)程,使其轉(zhuǎn)入運(yùn)行狀態(tài)。整個(gè)系統(tǒng)循環(huán)往復(fù),直到關(guān)機(jī)。 相關(guān)背景知識(shí)本程序全部利用匯編語言在x86實(shí)模式下編程,為能深入理解程序的工作原理,必須了解PC機(jī)相關(guān)軟硬件知識(shí)。下面對(duì)相關(guān)內(nèi)容進(jìn)行簡(jiǎn)單敘述。 1.PC機(jī)自舉過程簡(jiǎn)述 PC機(jī)在通電后至操作系統(tǒng)接管控制前,要進(jìn)行一系列的自檢

5、及初始化過程,包括對(duì)內(nèi)存、外設(shè)等硬件的檢測(cè)。在檢測(cè)過程中若存在嚴(yán)重錯(cuò)誤則停機(jī)。若無則試圖根據(jù)CMOS內(nèi)的配置信息讀取啟動(dòng)盤上的引導(dǎo)記錄bootsector。通常先從軟盤啟動(dòng)(本文默認(rèn)從軟盤啟動(dòng)),將軟盤上0面0道1扇區(qū)的512字節(jié)讀入到內(nèi)存0000:7c00h地址處,而后跳到該地址處執(zhí)行,這時(shí)機(jī)器便由軟件接管控制。 通常操作系統(tǒng)都由一個(gè)引導(dǎo)程序進(jìn)行引導(dǎo),引導(dǎo)程序的主要作用在于將操作系統(tǒng)的內(nèi)核讀入內(nèi)存,而后轉(zhuǎn)到內(nèi)核去執(zhí)行,由內(nèi)核接管機(jī)器的所有控制,包括內(nèi)存管理、進(jìn)程管理、設(shè)備管理、處理機(jī)管理等。上述啟動(dòng)盤上的引導(dǎo)記錄就是一個(gè)引導(dǎo)程序,在該操作系統(tǒng)模型的實(shí)現(xiàn)中,boot.asm程序即起到這樣功能的

6、程序,后面將結(jié)合具體代碼進(jìn)行詳細(xì)介紹。 2.PC機(jī)的中斷向量表結(jié)構(gòu) 中斷是改變程序運(yùn)行環(huán)境的一種機(jī)制,它可以使CPU暫停當(dāng)前程序的執(zhí)行,轉(zhuǎn)去執(zhí)行引發(fā)中斷的中斷源的中斷服務(wù)程序。在中斷服務(wù)程序執(zhí)行完畢后,再接著原來的程序執(zhí)行。中斷可以通過中斷指令int xx或由外部的硬件設(shè)備產(chǎn)生。中斷向量表即提供當(dāng)中斷發(fā)生時(shí),如何轉(zhuǎn)向中斷服務(wù)程序的方法。在中斷向量表中存放了相應(yīng)中斷服務(wù)程序的入口地址,這一入口地址稱為中斷向量,它由段地址和偏移組成,即CS:IP。 PC機(jī)中的中斷向量表位于低端內(nèi)存區(qū)的1KB存儲(chǔ)器中,絕對(duì)地址為:00000H003FFH, 其中的每個(gè)中斷向量占4個(gè)字節(jié),CS占2個(gè)字節(jié)(占高地址區(qū))

7、,IP占2個(gè)字節(jié)(占低地址區(qū))。給定一個(gè)中斷類型號(hào),即可通過如下的方式取得中斷向量的段地址及偏移: CS=中斷類型號(hào)*4 IP=中斷類型號(hào)*4+2 3.PC機(jī)屏蔽中斷的內(nèi)部處理過程 PC機(jī)中斷發(fā)生時(shí),若中斷標(biāo)志I=1(中斷允許),則有如下的內(nèi)部動(dòng)作: a.將中斷類型號(hào)*4,得到中斷向量表的指針; b.將CPU的標(biāo)志寄存器Flag入棧; c.將中斷標(biāo)志I和陷阱標(biāo)志T清0; d.將主程序斷點(diǎn)處的CS及IP分別壓入堆棧保存; e.從中斷向量表中取得中斷服務(wù)程序的入口地址,分別送到CS 和IP中; f.轉(zhuǎn)到中斷服務(wù)程序去執(zhí)行。 對(duì)于軟件中斷,則不判斷中斷標(biāo)志的狀態(tài),直接執(zhí)行af的處理過程。 在用戶所寫

8、的中斷服務(wù)程序的末尾,要有一條中斷返回指令iret,控制程序流由中斷服務(wù)程序返回到主程序中,它所完成的內(nèi)部處理如下: 將先前壓棧保存的端點(diǎn)從堆棧彈出,送到CS和IP中; 執(zhí)行popf操作,恢復(fù)標(biāo)志寄存器Flag; 從主程序的端點(diǎn)處繼續(xù)運(yùn)行。 4.PC機(jī)的過程調(diào)用 PC機(jī)的過程調(diào)用通過call指令產(chǎn)生,它的處理過程與中斷過程相似,但無標(biāo)志寄存器的處理,具體如下所示。 遠(yuǎn)過程調(diào)用:call far farentry 將返回地址(call指令的下一指令)的CS及IP壓棧; 以farentry的偏移及段地址送入IP及CS; 轉(zhuǎn)到farentry去執(zhí)行。 遠(yuǎn)過程調(diào)用返回:RETF 將返回地址彈出到IP及

9、CS; 從返回地址處繼續(xù)執(zhí)行程序。 對(duì)于近過程調(diào)用,則調(diào)用時(shí)只保存返回地址的IP,過程結(jié)束時(shí)只恢復(fù)IP。 5.匯編語言相關(guān)知識(shí) 本程序在Linux下用nasm進(jìn)行編譯。nasm是一個(gè)功能強(qiáng)大的開源代碼的匯編語言編譯程序,其語法與Intel語法相似,可以產(chǎn)生純二進(jìn)制的指令代碼,也可以產(chǎn)生a.out及ELF格式的目標(biāo)代碼,通過連接器連接便可生成直接由操作系統(tǒng)運(yùn)行的程序。這里用它產(chǎn)生二進(jìn)制格式的指令代碼,這是一種內(nèi)存映像,加載到內(nèi)存便可直接運(yùn)行。關(guān)于NASM編譯器的詳細(xì)信息可參考相關(guān)資料。程序模塊分析本操作系統(tǒng)模型由兩個(gè)程序組成,一個(gè)為引導(dǎo)程序boot.asm,另一個(gè)為內(nèi)核程序kernel.asm。

10、其中引導(dǎo)程序位于軟盤的引導(dǎo)扇區(qū),主要功能為將Kernel從盤上讀入內(nèi)存,讓其運(yùn)行;Kernel則依次使3個(gè)進(jìn)程占用CPU,完成各自的工作。 引導(dǎo)程序boot.asm 引導(dǎo)程序boot.asm位于引導(dǎo)軟盤的0面0道1扇區(qū),共計(jì)512個(gè)字節(jié)長度。該段程序在系統(tǒng)通電自檢完成后,將由ROMBIOS讀到內(nèi)存的0000:7c00h地址處,并從該地址開始執(zhí)行。該程序運(yùn)行后將首先將自身移動(dòng)到高端內(nèi)存區(qū)9000:7c00h,留出低端內(nèi)存區(qū)以備功能擴(kuò)展時(shí)使用,而后轉(zhuǎn)到高端內(nèi)存區(qū)執(zhí)行。接著對(duì)引導(dǎo)驅(qū)動(dòng)器復(fù)位,利用int 13h的物理讀盤功能,將位于0頭0道2扇區(qū)及3扇區(qū)的kernel程序讀入內(nèi)存 8000:0000h

11、地址處。若讀盤失敗,則進(jìn)行3次嘗試;若仍未讀出,則顯示“kernel Loading failed ! Any key to reboot.” 信息,而后重新啟動(dòng);若讀盤成功,則跳到kernel程序的入口點(diǎn)8000:0000h地址處執(zhí)行。程序流程如圖1所示。 boot.asm執(zhí)行后的內(nèi)存布局如圖2所示。由于在實(shí)模式下編程,程序可訪問的內(nèi)存空間為1MB,絕對(duì)地址從00000HFFFFFH,其中低端內(nèi)存及高端內(nèi)存的部分區(qū)域已經(jīng)被系統(tǒng)占用,程序可用的內(nèi)存區(qū)為位于高端及低端的中間部分。由于本程序規(guī)模較小,內(nèi)存空間足夠用。對(duì)于本程序,高端97C00H97DFFH為引導(dǎo)程序自搬移后的位置,80000H80

12、3FFH為成功讀入的內(nèi)核代碼所占的內(nèi)存空間。 boot.asm的程序代碼及詳細(xì)注釋如下: ; boot.asm - OS 引導(dǎo)扇區(qū)程序Bootloader; 功能: 將自身移動(dòng)至內(nèi)存高端,而后將啟動(dòng)盤上的kernel讀到內(nèi)存,; 接著跳轉(zhuǎn)到kernel.;BITS 16 ;實(shí)模式 16bit 代碼結(jié)構(gòu) ; 標(biāo)號(hào)等價(jià)偽定義INITSEG EQU 0x07c0 ; 啟動(dòng)扇區(qū)段地址 NEWSEG EQU 0x9000 ; 引導(dǎo)程序移動(dòng)到的高端段地址 KERNELSEG EQU 0x8000 ; kernel段地址 KERNELOFFSET EQU 0x0000 ; kernel偏移地址 REBOOT

13、SEG EQU 0XFFFF ; 重啟動(dòng)段地址 REBOOTOFFSET EQU 0X0000 ; 重啟動(dòng)偏移地址 org 0x7c00 ; 匯編起始地址 start:jmp short bootup ;跳轉(zhuǎn)到啟動(dòng)代碼 ; 數(shù)據(jù)區(qū) ; 變量定義 bootdrv db 0 ;bootdrv用于保存啟動(dòng)驅(qū)動(dòng)器號(hào) retries db 3 ;重復(fù)讀盤次數(shù) ;系統(tǒng)啟動(dòng)信息 bootmsg db System bootup . ,0dh,0ah,00h ; kernel loading 信息 loadknlmsg db Loading kernel . ,0dh,0ah,00h ; kernel loa

14、ding 錯(cuò)誤信息 loadknlerrmsg db Kernel loading failed !,0dh,0ah,Any key to reboot.,0dh,0ah,00hbootup: mov bootdrv, dl ; 保存啟動(dòng)驅(qū)動(dòng)器號(hào) ; 顯示啟動(dòng)信息 mov si, bootmsg call dispstr ; 將自身的所有程序及數(shù)據(jù)由 0000:7c00h 移動(dòng)到 ; 內(nèi)存高端 9000:7c00h,總計(jì) 512 字節(jié)長度cld ; 方向標(biāo)志置 0, mov ax, NEWSEG ; ax=0x9000mov es, ax ; 附加段寄存器es設(shè)為 0x9000,所移數(shù)據(jù)的目的

15、段 mov di, start ; 目的變址寄存器 =7c00hmov si, start ; 源變址寄存器 = 7c00hmov cx, 0x200 ; 移動(dòng)總字節(jié)長度 512 Bytescli ; 禁止中斷 rep movsb ; 執(zhí)行移動(dòng)操作 ; 跳轉(zhuǎn)到移動(dòng)后的新段,從 there 地址開始執(zhí)行.JMP NEWSEG:therethere: ;這里是新的執(zhí)行起始點(diǎn).sti ;開中斷 ;下一步,將kernel 程序從啟動(dòng)驅(qū)動(dòng)器的讀到內(nèi)存中,而后由kernel接管控制.mov si,loadknlmsgcall dispstr ;顯示kernel 加載信息kernel loading.rea

16、dagain:mov ah, 0 mov dl, bootdrv int 0x13 ; 復(fù)位啟動(dòng)驅(qū)動(dòng)器 ; 將位于從物理2扇區(qū)開始的2個(gè)扇區(qū)的kernel 程序從啟動(dòng)驅(qū)動(dòng)器的讀到內(nèi)存中 ; KERNELSEG:0000hcld ; 方向標(biāo)志置 0 mov bx, KERNELOFFSET ; kernel 地址偏移mov ax, KERNELSEG ; kernel 段地址 0x8000mov es, axmov ax, 0x0202 ; AH = 02 (讀扇區(qū)功能號(hào)), AL=2 (扇區(qū)數(shù))mov cx, 0x0002 ; CH - 磁道號(hào), CL - 邏輯扇區(qū)號(hào) mov dh, 0 ;

17、DH - 磁頭號(hào) mov dl, bootdrv ; DL - 驅(qū)動(dòng)器號(hào) int 0x13 ; 讀扇區(qū) BIOS 調(diào)用 jnc gotoknl ; 無錯(cuò)誤則進(jìn)入kernel執(zhí)行dec byte retries ; 讀盤計(jì)數(shù)器減1jnz readagain ; 未到最大讀盤次數(shù),則繼續(xù)讀mov si,loadknlerrmsg ; 到達(dá)最大讀盤次數(shù)仍然讀盤有錯(cuò),call dispstr ; 則顯示錯(cuò)誤信息mov ah,0int 16h ; 等待用戶輸入任一鍵jmp REBOOTSEG:REBOOTOFFSET ; 重新啟動(dòng)gotoknl: jmp KERNELSEG:KERNELOFFSET ;

18、 跳到內(nèi)核代碼去執(zhí)行,啟動(dòng)扇區(qū)引導(dǎo)程序結(jié)束. ;字符串顯示子程序 dispstr;參數(shù):si=字符串首地址,字符串以00h作為結(jié)束標(biāo)記;dispstr: push ax mov ah, 0ehdispnext: lodsb cmp al,0 jz quit int 10h jmp dispnext quit: pop ax ret times 510-($-$) db 0 ; 將空閑的程序區(qū)域填充為 00h dw 0xaa55 ; 由BIOS檢測(cè)的有效的啟動(dòng)扇區(qū)標(biāo)志;boot.asm結(jié)束 內(nèi)核程序kernel.asm kernel.asm是系統(tǒng)的核心程序,主要由任務(wù)初始化子程序taskinit

19、、進(jìn)程調(diào)度子程序scheduler、鍵盤中斷子程序keybd、16進(jìn)制數(shù)顯示子程序printhex及3個(gè)參與被調(diào)度程序task1task3等幾部分組成,其中進(jìn)程調(diào)度子程序是多任務(wù)實(shí)現(xiàn)的關(guān)鍵。 內(nèi)核的工作方式是在系統(tǒng)時(shí)鐘中斷的驅(qū)動(dòng)下,依次使3個(gè)進(jìn)程分別得到調(diào)度,使其分時(shí)占用CPU完成各自的工作在屏幕的不同位置分別顯示各自的計(jì)數(shù)器值,即在某一時(shí)刻實(shí)際只有一個(gè)進(jìn)程在運(yùn)行,其余的進(jìn)程都處于掛起狀態(tài)。被掛起進(jìn)程的斷點(diǎn)信息,如斷點(diǎn)地址、斷點(diǎn)處的CPU內(nèi)的各個(gè)寄存器狀態(tài),均被保存在各進(jìn)程的堆棧內(nèi)。這樣當(dāng)掛起進(jìn)程再次被調(diào)度運(yùn)行時(shí),調(diào)度程序?qū)帱c(diǎn)的信息恢復(fù)出來,掛起進(jìn)程便接著斷點(diǎn)繼續(xù)運(yùn)行。內(nèi)核進(jìn)程調(diào)度如圖3所示

20、。 Kernel程序運(yùn)行時(shí)的內(nèi)存布局圖4所示。 圖4是圖2中的Kernel內(nèi)存區(qū)(80000H803FF)的放大顯示,從圖中可見在80000H8FFFFH的64KB內(nèi)存區(qū)中,低端的1KB區(qū)域80000H803FFH為Kernel的所有程序及數(shù)據(jù)區(qū)。Kernel程序區(qū)部分有用于演示目的的3個(gè)進(jìn)程代碼。當(dāng)這3個(gè)進(jìn)程被初始化時(shí),分別給每一個(gè)進(jìn)程分配了各自獨(dú)立的、長度為1KB的3個(gè)堆棧區(qū),如圖4中的文字標(biāo)記所示。分配給進(jìn)程的堆棧區(qū)主要用于保存各自被中斷運(yùn)行時(shí)的斷點(diǎn)及返回信息。在進(jìn)行進(jìn)程切換時(shí),要進(jìn)行進(jìn)程堆??臻g的切換,這些進(jìn)程堆棧區(qū)是實(shí)現(xiàn)多任務(wù)功能的重要內(nèi)存區(qū)。Kernel堆棧區(qū)位于內(nèi)存的高端,足以滿

21、足程序運(yùn)行的需要。 Kernel程序運(yùn)行流程如圖5所示。Kernel在運(yùn)行時(shí),首先做相關(guān)的初始化工作,主要包括數(shù)據(jù)段、堆棧段寄存器初始化,將其均設(shè)定為Kernel的段地址;堆棧指針設(shè)在內(nèi)存的高端;關(guān)軟盤馬達(dá);清屏;初始化3 個(gè)進(jìn)程,使其處于運(yùn)行就緒狀態(tài);重新設(shè)置定時(shí)器及鍵盤中斷向量;而后在時(shí)鐘中斷的驅(qū)動(dòng)下調(diào)度程序運(yùn)行,使3個(gè)進(jìn)程task1task3分別運(yùn)行。 任務(wù)初始化子程序Taskinit Taskinit子程序是用來初始化一個(gè)進(jìn)程的,使一個(gè)進(jìn)程成為運(yùn)行就緒狀態(tài)。其所需要的參數(shù)有兩個(gè):一個(gè)為進(jìn)程的入口地址,另一個(gè)為該進(jìn)程設(shè)定的堆棧指針。這兩個(gè)參數(shù)分別送入ax及dx寄存器,利用call指令調(diào)用該子程序便可初始化一個(gè)進(jìn)程。在kernel中將進(jìn)程的可用堆棧區(qū)設(shè)為絕對(duì)地址為 80600H 以上的內(nèi)存區(qū),每個(gè)進(jìn)程擁有1KB(400H)的堆棧區(qū),這樣第一個(gè)進(jìn)程的堆棧指針就設(shè)為80A00H,因?yàn)?X86 CPU堆棧的增長方向是指向低地址的。如下指令可用來初始化task1: mov dx, 0x0600 ; 進(jìn)程的堆?;刂穉dd dx, STACKSIZE ; 進(jìn)程1的堆棧指針 = 0xa00mov ax, task1 ; 進(jìn)程1入口地址 call taskinit ; 初始化task1進(jìn)入T

溫馨提示

  • 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)論