ch1-系統(tǒng)啟動_第1頁
ch1-系統(tǒng)啟動_第2頁
ch1-系統(tǒng)啟動_第3頁
ch1-系統(tǒng)啟動_第4頁
ch1-系統(tǒng)啟動_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、哈工大計算機(jī)科學(xué)與技術(shù)學(xué)院哈工大計算機(jī)科學(xué)與技術(shù)學(xué)院軟件基礎(chǔ)教研室軟件基礎(chǔ)教研室操作系統(tǒng)操作系統(tǒng)Operating System第第1 1章章 系統(tǒng)啟動系統(tǒng)啟動Chapter 1: Power On- 2 -Operating System操作系統(tǒng)課,我們希望學(xué)會什么操作系統(tǒng)課,我們希望學(xué)會什么? ?- 3 -Operating System所有目標(biāo)都要從所有目標(biāo)都要從“明白操作系統(tǒng)明白操作系統(tǒng)”開開始始控制器控制器紙帶紙帶0111010n明白操作系統(tǒng)從明白操作系統(tǒng)從“明白系統(tǒng)啟動明白系統(tǒng)啟動”開始開始打開電源開關(guān)后發(fā)生了什么打開電源開關(guān)后發(fā)生了什么?打開電源打開電源計算機(jī)開始工作計算機(jī)開始工

2、作計算機(jī)怎么工作計算機(jī)怎么工作?又是誰決定了計算機(jī)是那樣工作的又是誰決定了計算機(jī)是那樣工作的?計算模型計算模型1936年,英國數(shù)年,英國數(shù)學(xué)家學(xué)家A.C.圖靈圖靈提提出了一種模型出了一種模型人人筆筆紙紙偉大的創(chuàng)舉往往都是從樸素的想法開始的偉大的創(chuàng)舉往往都是從樸素的想法開始的!- 4 -Operating System從圖靈機(jī)到通用圖靈機(jī)從圖靈機(jī)到通用圖靈機(jī)控制器控制器紙帶紙帶0111010圖靈機(jī)圖靈機(jī)通用圖通用圖靈機(jī)靈機(jī)一個會做一道菜的廚師一個會做一道菜的廚師舀舀2大碗面放入盆中大碗面放入盆中打打6個雞蛋放入盆中個雞蛋放入盆中盆中加入盆中加入500克水克水將盆中的物質(zhì)攪拌均勻?qū)⑴柚械奈镔|(zhì)攪拌均

3、勻做成等厚度的餅狀物做成等厚度的餅狀物大火蒸大火蒸15分鐘分鐘一個能看懂菜譜的廚師一個能看懂菜譜的廚師將這個過程將這個過程描述描述: 菜譜菜譜 廚師廚師菜譜菜譜1菜肴菜肴1菜肴菜肴2菜譜菜譜2這樣的廚師才具這樣的廚師才具有競爭力有競爭力 控制器控制器紙帶紙帶數(shù)據(jù)對象數(shù)據(jù)對象設(shè)置控制器動作設(shè)置控制器動作修改控制器修改控制器控制器狀態(tài)控制器狀態(tài)處理處理- 5 -Operating System從通用圖靈機(jī)到計算機(jī)從通用圖靈機(jī)到計算機(jī)n偉大想法的工程實現(xiàn)偉大想法的工程實現(xiàn)又一個偉大的發(fā)明又一個偉大的發(fā)明: 馮馮諾依曼諾依曼存儲程序思想存儲程序思想 mov ax, 100 100: 0 IPmov a

4、x, 100IRax0存儲器存儲器運算器、控制器運算器、控制器就是那個就是那個讀寫指針讀寫指針1946年提出年提出存儲程序的主要思想:將程序和數(shù)據(jù)存放到計算機(jī)內(nèi)部的存儲存儲程序的主要思想:將程序和數(shù)據(jù)存放到計算機(jī)內(nèi)部的存儲器中,計算機(jī)在程序的控制下一步一步進(jìn)行處理器中,計算機(jī)在程序的控制下一步一步進(jìn)行處理計算機(jī)由五大部件組成計算機(jī)由五大部件組成:輸入設(shè)備、輸出設(shè)備、存儲器、運算器、輸入設(shè)備、輸出設(shè)備、存儲器、運算器、控制器控制器- 6 -Operating System打開電源,計算機(jī)發(fā)生了什么打開電源,計算機(jī)發(fā)生了什么? ?- 7 -Operating System可以打開電源了可以打開電源

5、了n計算模型計算模型我們要我們要關(guān)注關(guān)注指針指針I(yè)P及其及其指向的內(nèi)容指向的內(nèi)容計算機(jī)剛打開電源時,計算機(jī)剛打開電源時,IP=?由硬件設(shè)計者決定由硬件設(shè)計者決定!看看看看x86 PC(1)x86 PC剛開機(jī)時剛開機(jī)時CPU處于實模式處于實模式(2)開機(jī)時,開機(jī)時,CS=0 xFFFF; IP=0 x0000(3)尋址尋址0 xFFFF0(ROM BIOS映射區(qū)映射區(qū))(4)檢查檢查RAM,鍵盤,顯示器,軟硬磁盤,鍵盤,顯示器,軟硬磁盤 (5)將磁盤將磁盤0磁道磁道0扇區(qū)讀入扇區(qū)讀入0 x7c00處處(6)設(shè)置設(shè)置cs=0 x07c0,ip=0 x0000和保護(hù)模式對應(yīng),實模式和保護(hù)模式對應(yīng),實

6、模式的尋址的尋址CS:IP(CS左移左移4位位+IP),和保護(hù)模式不一樣,和保護(hù)模式不一樣!ROM BIOS0 x000000000 xFFFFFFFF0 xF00000 x100000ROM BIOS映射區(qū)映射區(qū)- 8 -Operating System0 x7c00處存放的代碼處存放的代碼n就是從磁盤引導(dǎo)扇區(qū)讀入的那就是從磁盤引導(dǎo)扇區(qū)讀入的那512個字節(jié)個字節(jié)引導(dǎo)扇區(qū)就是引導(dǎo)扇區(qū)就是啟動設(shè)備的第一個扇區(qū)啟動設(shè)備的第一個扇區(qū)啟動設(shè)備信息被設(shè)置在啟動設(shè)備信息被設(shè)置在CMOS中中 開機(jī)時按住開機(jī)時按住del鍵可進(jìn)入鍵可進(jìn)入啟動設(shè)備設(shè)置界面,可啟動設(shè)備設(shè)置界面,可以設(shè)置為光盤啟動以設(shè)置為光盤啟動!

7、CMOS: 互補(bǔ)金屬氧化物半互補(bǔ)金屬氧化物半導(dǎo)體導(dǎo)體(64B-128B)。用來存儲。用來存儲實時鐘和硬件配置信息。實時鐘和硬件配置信息。因此,硬盤的第一個扇區(qū)上存放著開機(jī)后執(zhí)行的第因此,硬盤的第一個扇區(qū)上存放著開機(jī)后執(zhí)行的第一段我們可以控制的程序。一段我們可以控制的程序。操作系統(tǒng)的故事從這里開始操作系統(tǒng)的故事從這里開始- 9 -Operating System引導(dǎo)扇區(qū)代碼引導(dǎo)扇區(qū)代碼: bootsect.s .globl begtext,begdata,begbss,endtext,enddata,endbss.text /文本段文本段begtext:.data /數(shù)據(jù)段數(shù)據(jù)段begdata:

8、.bss /未初始化數(shù)據(jù)段未初始化數(shù)據(jù)段begbss:.textentry start /關(guān)鍵字關(guān)鍵字entry告訴鏈接器告訴鏈接器“程序入口程序入口”start: mov ax, #BOOTSEG mov ds, ax mov ax, #INITSEG mov es, ax mov cx, #256 sub si, si sub di,di rep movw jmpi go, INITSEG.text等是偽操作符,告訴編譯器產(chǎn)生等是偽操作符,告訴編譯器產(chǎn)生文本段,文本段,.text用于標(biāo)識文本段的開始用于標(biāo)識文本段的開始位置。位置。此處的此處的.text、.data、.bss表明這表明這3個

9、個段重疊,不分段段重疊,不分段!此條語句就是此條語句就是0 x7c00處存放的語句處存放的語句!BOOTSEG = 0 x07c0INITSEG = 0 x9000SETUPSEG = 0 x9020將將0 x07c0:0 x0000處的處的256個字個字移動到移動到0 x9000:0 x0000處處- 10 -Operating Systemjmpi go, INITSEG go: mov ax,cs /cs=0 x9000 mov ds,ax mov es,ax mov ss,ax mov sp,#0 xff00load_setup: /載入載入setup模塊模塊 mov dx,#0 x0

10、000 mov cx,#0 x0002 mov bx,#0 x0200 mov ax,#0 x0200+SETUPLEN int 0 x13 /BIOS中斷中斷 jnc ok_load_setup mov dx,#0 x0000 mov ax,#0 x0000 /復(fù)位復(fù)位 int 0 x13 j load_setup /重讀重讀jmpi (jump intersegment段間跳轉(zhuǎn)段間跳轉(zhuǎn)): cs=INITSEG, ip=go為為call做準(zhǔn)備做準(zhǔn)備!啟動盤啟動盤boot扇區(qū)扇區(qū)setup的的4個扇區(qū)個扇區(qū)system模塊模塊(OS代碼代碼)0 x13是是BIOS讀磁盤扇區(qū)的中斷讀磁盤扇區(qū)的

11、中斷: ah=0 x02-讀磁盤,讀磁盤,al=扇區(qū)數(shù)量扇區(qū)數(shù)量(SETUPLEN=4),ch=柱面號,柱面號,cl=開始扇區(qū),開始扇區(qū),dh=磁頭號,磁頭號,dl=驅(qū)動器驅(qū)動器號,號,es:bx=內(nèi)存地址內(nèi)存地址- 11 -Operating System讀入讀入setup模塊后模塊后: ok_load_setup Ok_load_setup: /載入載入setup模塊模塊 mov dl,#0 x00 mov ax,#0 x0800 /ah=8獲得磁盤參數(shù)獲得磁盤參數(shù) int 0 x13 mov ch,#0 x00 mov sectors,cx mov ah,#0 x03 xor bh,bh

12、 int 0 x10 /讀光標(biāo)讀光標(biāo) mov cx,#24 mov bx,#0 x0007 mov bp,#msg1 mov ax,#1301 int 0 x10 /顯示字符顯示字符 mov ax,#SYSSEG /SYSSEG=0 x1000 mov es,ax call read_it /讀入讀入system模塊模塊 jmpi 0,SETUPSEG7是顯示屬性是顯示屬性!bootsect.s中的數(shù)據(jù)中的數(shù)據(jù) /在文件末尾在文件末尾sectors: .word 0 /磁道扇區(qū)數(shù)磁道扇區(qū)數(shù)msg1: .byte 13,10 .ascii “Loading system.” .byte 13,1

13、0,13,10顯示這顯示這24個字符將是個字符將是大家的第一個大家的第一個“創(chuàng)創(chuàng)舉舉”!轉(zhuǎn)入轉(zhuǎn)入0 x9020:0 x0000執(zhí)行執(zhí)行setup.sboot的工作的工作:讀讀setup,讀讀system- 12 -Operating Systemread_it /讀入讀入system模塊模塊 read_it: mov ax,es cmp ax,#ENDSEG jb ok1_read retok1_read: mov ax,sectors sub ax,sread /sread是當(dāng)前磁道已讀扇區(qū)數(shù)是當(dāng)前磁道已讀扇區(qū)數(shù),ax未讀扇區(qū)數(shù)未讀扇區(qū)數(shù) call read_track /讀磁道讀磁道.sy

14、stem模塊可能很大,模塊可能很大,要跨越磁道要跨越磁道!為什么讀入為什么讀入system模塊還需要定義一個函數(shù)模塊還需要定義一個函數(shù)?ENDSEG=SYSSEG+SYSSIZESYSSIZE=0 x8000 /該變量可根據(jù)該變量可根據(jù)Image大小設(shè)定大小設(shè)定(編譯操作系統(tǒng)時編譯操作系統(tǒng)時)引導(dǎo)扇區(qū)的末尾引導(dǎo)扇區(qū)的末尾 /BIOS用以識別引導(dǎo)扇區(qū)用以識別引導(dǎo)扇區(qū).org 510 .word 0 xAA55 /扇區(qū)的最后兩個字節(jié)扇區(qū)的最后兩個字節(jié)否則會打出非引導(dǎo)設(shè)備否則會打出非引導(dǎo)設(shè)備可以轉(zhuǎn)入可以轉(zhuǎn)入setup執(zhí)行了,執(zhí)行了,jmpi 0, SETUPSEG- 13 -Operating Sy

15、stemsetup模塊,即模塊,即setup.s 根據(jù)名字就可以想到根據(jù)名字就可以想到: setup將完成將完成OS啟動前的設(shè)置啟動前的設(shè)置start: mov ax,#INITSEG mov ds,ax mov ah,#0 x03 xor bh,bh int 0 x10/取光標(biāo)位置取光標(biāo)位置dx mov 0,dx mov ah,#0 x88 int 0 x15 mov 2,ax . cli /不允許中斷不允許中斷 mov ax,#0 x0000 clddo_move: mov es,ax add ax,#0 x1000 cmp ax,#0 x9000 jz end_move mov ds,a

16、x sub di,di sub si,si mov cx,#0 x8000 rep movsw jmp do_move 取出光標(biāo)位置取出光標(biāo)位置(包包括其他硬件參數(shù)括其他硬件參數(shù))到到0 x90000處處擴(kuò)展內(nèi)存大小擴(kuò)展內(nèi)存大小內(nèi)存地址內(nèi)存地址長度長度名稱名稱0 x900002光標(biāo)位置光標(biāo)位置0 x900022擴(kuò)展內(nèi)存數(shù)擴(kuò)展內(nèi)存數(shù)0 x901FC2根設(shè)備號根設(shè)備號0 x9000C2顯卡參數(shù)顯卡參數(shù)SYSSEG = 0 x1000將將system模塊模塊移到移到0地址地址- 14 -Operating System將將setup移到移到0地址處地址處.但但0地址處是有重要內(nèi)容的地址處是有重要內(nèi)容

17、的end_move: mov ax,#SETUPSEG mov ds,ax lidt idt_48 lgdt gdt_48/設(shè)置保護(hù)模式下的中斷和尋址設(shè)置保護(hù)模式下的中斷和尋址 進(jìn)入保護(hù)模式的命令進(jìn)入保護(hù)模式的命令.idt_48:.word 0 .word 0,0 /保護(hù)模式的中斷處理函數(shù)表保護(hù)模式的中斷處理函數(shù)表gdt_48:.word 0 x800 .word 512+gdt,0 x9 gdt: .word 0,0,0,0 .word 0 x07FF, 0 x0000, 0 x9A00, 0 x00C0 .word 0 x07FF, 0 x0000, 0 x9200, 0 x00C0 RO

18、M BIOS0 x000000000 xFFFFFFFF0 xF00000 x100000ROM BIOS映射區(qū)映射區(qū)中斷向量表中斷向量表前面的前面的int指令指令才可以使用才可以使用!以后不調(diào)用以后不調(diào)用int指令了嗎指令了嗎?因為操作系統(tǒng)要讓硬件進(jìn)入保護(hù)模式了因為操作系統(tǒng)要讓硬件進(jìn)入保護(hù)模式了保護(hù)模式下保護(hù)模式下int n和和cs:ip解釋不再和實模式一樣解釋不再和實模式一樣又一個函數(shù)表又一個函數(shù)表將將cs:ip變成物變成物理地址理地址- 15 -Operating System保護(hù)模式下的地址翻譯和中斷處理保護(hù)模式下的地址翻譯和中斷處理保護(hù)模式下的地址翻譯保護(hù)模式下的地址翻譯保護(hù)模式下中

19、斷處理函數(shù)入口保護(hù)模式下中斷處理函數(shù)入口即即gdt的作用的作用 t是是table,所以實模式,所以實模式下下:cs左移左移4+ip。保護(hù)模。保護(hù)模式下式下:根據(jù)根據(jù)cs查表查表+ipt仍是仍是table,仿照,仿照gdt,通過通過int n的的n進(jìn)行查表進(jìn)行查表GDTcs:ip物理內(nèi)存地址物理內(nèi)存地址IDTint n中斷處理函數(shù)入口中斷處理函數(shù)入口即即idt的作用的作用 - 16 -Operating System進(jìn)入保護(hù)模式進(jìn)入保護(hù)模式call empty_8042 mov al,#0 xD1 out #0 x64,al /8042是鍵盤控制器,其輸出端口是鍵盤控制器,其輸出端口P2用來控制

20、用來控制A20地址線地址線call empty_8042 mov al,#0 xDF out #0 x60,al /選通選通A20地址線地址線 call empty_8042初始化初始化8259(中斷控制中斷控制) /一段非常機(jī)械化的程序一段非常機(jī)械化的程序mov ax,#0 x0001 mov cr0,axjmpi 0,8 empty_8042: .word 0 x00eb,0 x00eb in al,#0 x64 test al,#2 jnz empty_8042 ret 跳到下一句指跳到下一句指令的機(jī)器碼令的機(jī)器碼!位位1=0,輸入緩存,輸入緩存器為空,不空說器為空,不空說明明PC機(jī)有問

21、題機(jī)有問題D1表示寫數(shù)據(jù)到表示寫數(shù)據(jù)到8042的的P2端口端口cr0一個非常酷的寄存器一個非??岬募拇嫫鱌GPE031PE=1啟動保護(hù)模式,啟動保護(hù)模式,PG=1啟動分頁啟動分頁jmpi 0,8 /cs=8用來查用來查gdt- 17 -Operating Systemjmpi 0,8 /gdt中的中的8gdt: .word 0,0,0,0 .word 0 x07FF, 0 x0000, 0 x9A00, 0 x00C0 .word 0 x07FF, 0 x0000, 0 x9200, 0 x00C0 ?GDTcs:ip0816段基址段基址15.0段限長段限長15.004段基址段基址31.24段

22、基址段基址23.16段限長段限長19.16P DPLGGDT表項表項0310 x00C09A00000007FFFjmp到內(nèi)存到內(nèi)存0 x0000處處是是system模塊模塊!兩個兩個gdt表項,都是表項,都是0 x0000,一個只讀,一個只讀(代代碼碼),一個讀寫,一個讀寫(數(shù)據(jù)數(shù)據(jù))- 18 -Operating System跳到跳到system模塊執(zhí)行模塊執(zhí)行.system模塊模塊(目標(biāo)代碼目標(biāo)代碼)中的第一部分代碼中的第一部分代碼? head.sdisk: Image dd bs=8192 if=Image of=/dev/PS0 Image: boot/bootsect boot/s

23、etup tools/system tools/build tools/build boot/bootsect boot/setup tools/system Imagetools/system: boot/head.o init/main.o $(DRIVERS) $(LD) boot/head.o init/main.o $(DRIVERS) -o tools/systemsystem由許多文件編譯而成,為什么是由許多文件編譯而成,為什么是head.s?linux/Makefileif=input file/dev/PS0是軟驅(qū)是軟驅(qū)A明白為什么明白為什么head.s就這樣一個名字了吧就這

24、樣一個名字了吧?- 19 -Operating Systemhead.s /一段在保護(hù)模式下運行的代碼一段在保護(hù)模式下運行的代碼setup是進(jìn)入保護(hù)模式,是進(jìn)入保護(hù)模式,head是進(jìn)入之后的初始化是進(jìn)入之后的初始化stratup_32: movl $0 x10,%eax mov %ax,%ds mov %ax,%es mov %as,%fs mov %as,%gs /指向指向gdt的的0 x10項項(數(shù)據(jù)段數(shù)據(jù)段) lss _stack_start,%esp /設(shè)置棧設(shè)置棧(系統(tǒng)棧系統(tǒng)棧) call setup_idt call setup_gdt xorl %eax,%eax1:incl %

25、eax movl %eax,0 x000000 cmpl %eax,0 x100000 je 1b /0地址處和地址處和1M地址處相同地址處相同(A20沒開啟沒開啟),就死循環(huán),就死循環(huán) jmp after_page_tables /頁表,什么東東頁表,什么東東?setup_idt: lea ignore_int,%edx movl $0 x00080000,%eax movw %dx,%ax lea _idt,%edi movl %eax,(%edi) 和前面的代碼不和前面的代碼不一樣了一樣了?因為是因為是32位匯編代碼位匯編代碼!structlong *a; short b;stack_s

26、tart=&user_stackPAGE_SIZE2,0 x10; idt_48:.word 0 word 0,0_idt: .fill 256,8,0現(xiàn)在忽略中斷現(xiàn)在忽略中斷- 20 -Operating System關(guān)于匯編關(guān)于匯編head.s的匯編和前面不一樣的匯編和前面不一樣?mov ax, cs /csax, 目標(biāo)操作數(shù)在前目標(biāo)操作數(shù)在前 (1) as86匯編:能產(chǎn)生匯編:能產(chǎn)生16位代碼的位代碼的Intel 8086(386)匯編匯編(2) GNU as匯編:產(chǎn)生匯編:產(chǎn)生32位代碼,使用位代碼,使用AT&T系統(tǒng)系統(tǒng)V語法語法AT&T美國電話電報公司,美國電

27、話電報公司,包含貝爾實驗室等,包含貝爾實驗室等,1983年年AT&T UNIX支持支持組發(fā)布了系統(tǒng)組發(fā)布了系統(tǒng)Vmovl var, %eax/(var)%eaxmovb -4(%ebp), %al /取出一字節(jié)取出一字節(jié)(3) 內(nèi)嵌匯編,內(nèi)嵌匯編,gcc編譯編譯x.c會產(chǎn)生中間會產(chǎn)生中間 結(jié)果結(jié)果as匯編文件匯編文件x.s_asm_(“匯編語句匯編語句”: 輸出輸出: 輸入輸入: 破壞部分描述破壞部分描述); _asm_(“movb %fs:%2, %al”:”=a”(_res):”0”(seg),”m”(*(addr);a表示使用表示使用eax,并編號并編號%0%2表示表示addr,

28、m表示使用內(nèi)存表示使用內(nèi)存0或空表示使用與或空表示使用與相應(yīng)輸出一樣的相應(yīng)輸出一樣的寄存器寄存器- 21 -Operating Systemafter_page_tables /設(shè)置了頁表之后設(shè)置了頁表之后setup是進(jìn)入保護(hù)模式,是進(jìn)入保護(hù)模式,head是進(jìn)入之后的初始化是進(jìn)入之后的初始化after_page_tables: pushl $0 pushl $0 pushl $0 pushl $L6 pushl $_main jmp set_paging L6: jmp L6setup_paging: 設(shè)置頁表設(shè)置頁表 ret將來學(xué)到將來學(xué)到!簡單的幾句程序,控制流卻很復(fù)雜簡單的幾句程序,控制流卻很復(fù)雜setup_paging執(zhí)行執(zhí)行ret后后? 會執(zhí)行函數(shù)會執(zhí)行函數(shù)main() p3p2p1返回地址返回地址C執(zhí)行執(zhí)行func(p1,p2,p3)進(jìn)入進(jìn)入main()后的棧為后的棧為0,0,0,L6 main()函數(shù)的三個參數(shù)是函數(shù)的三

溫馨提示

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

評論

0/150

提交評論