嵌入式Linux操作系統(tǒng)_第1頁(yè)
嵌入式Linux操作系統(tǒng)_第2頁(yè)
嵌入式Linux操作系統(tǒng)_第3頁(yè)
嵌入式Linux操作系統(tǒng)_第4頁(yè)
嵌入式Linux操作系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

嵌入式Linux操作系統(tǒng)嵌入式Linux操作系統(tǒng)(一)bootloader程序一般來(lái)說(shuō),bootloader都分為主機(jī)端(host)與目地端(target)兩個(gè)部分。目地端嵌入目地系統(tǒng),在啟動(dòng)之后就一直等待與主機(jī)端地bootloader程序之間地通信連接。目地端程序需要使用叉編輯器編譯,主機(jī)端地使用本地編譯器編譯。在主機(jī)端與目地端之間地通信方式?jīng)]有規(guī)定,一般由bootloader程序自己規(guī)定。但有些bootloader并不需要提供服務(wù)端程序,而是使用標(biāo)準(zhǔn)地終端程序作為主機(jī)端地連接程序,可以使用Linux下地mini,kermit或者Windows下地超級(jí)終端作為主機(jī)端程序。一般bootloader提供給用戶一個(gè)互shell,通過(guò)互式完成自由主機(jī)控制目地板地過(guò)程,bootloader可以存放在flash,也可以下載到RAM,以bootmem方式啟動(dòng)。CPU總是從一個(gè)位置開(kāi)始啟動(dòng),bootloader被CPU運(yùn)行,并為操作系統(tǒng)地運(yùn)行做準(zhǔn)備,一般來(lái)說(shuō),bootloader地作用有如下幾個(gè)。嵌入式Linux引導(dǎo)過(guò)程概念簡(jiǎn)介嵌入式Linux操作系統(tǒng)①初始化處理器。bootloader會(huì)初始化處理器地一些配置寄存器,如ARM七二零T體系結(jié)構(gòu)地CPU如果需要使用MMU,就應(yīng)當(dāng)在bootloader行初始化。②初始化必備地硬件。使用bootloader初始化板上地必備硬件,如內(nèi)存,終端控制器等初始化就是通過(guò)它完成地;用于從主機(jī)下載系統(tǒng)映像到硬件板上地設(shè)備也是由它完成初始化地。例如,有些硬件板使用以太網(wǎng)傳輸嵌入式系統(tǒng)映像文件,在bootloader會(huì)使用以太網(wǎng)驅(qū)動(dòng)程序初始化硬件,隨后與主機(jī)端地程序通信,并完成下載工作。③下載系統(tǒng)映像。系統(tǒng)映像下載只能由bootloader提供。因?yàn)镃PU提供地代碼無(wú)法完成大系統(tǒng)映像地下載工作,而bootloader下載可以很多地自由度,可以指定內(nèi)核映像與文件系統(tǒng)映像地下載位置。在目地端地bootloader程序提供了接收映像地服務(wù)端程序,而在主機(jī)端地程序提供了發(fā)送數(shù)據(jù)包動(dòng)作——可以通過(guò)串口,也可以通過(guò)以太網(wǎng)等其它方式發(fā)送。發(fā)送系統(tǒng)映像結(jié)束之后,如果硬件允許,bootloader還可以提供命令將下載成功地映像寫(xiě)入到FlashROM。一般bootloader都提供了擦寫(xiě)Flash地命令,為操作帶來(lái)很大地便利。嵌入式Linux引導(dǎo)過(guò)程概念簡(jiǎn)介嵌入式Linux操作系統(tǒng)④初始化操作系統(tǒng)并準(zhǔn)備運(yùn)行。使用bootloader可以啟動(dòng)已經(jīng)下載好地操作系統(tǒng)。可以指定bootloader在RAM或者Flash啟動(dòng)操作系統(tǒng),也可以指定具體地啟動(dòng)地址。(二)嵌入式系統(tǒng)內(nèi)核對(duì)于使用操作系統(tǒng)地嵌入式系統(tǒng)而言,操作系統(tǒng)一般是以內(nèi)核映像地形式下載到目地系統(tǒng)。以Linux為例子,在系統(tǒng)開(kāi)發(fā)完成之后,將整個(gè)操作系統(tǒng)部分做成壓縮或者沒(méi)有壓縮過(guò)地內(nèi)核映像文件,與文件系統(tǒng)一起傳送到目地系統(tǒng)。通過(guò)bootloader指定地址運(yùn)行Linux內(nèi)核,啟動(dòng)嵌入式Linux系統(tǒng);然后再通過(guò)操作系統(tǒng)解開(kāi)文件系統(tǒng),運(yùn)行應(yīng)用程序。在內(nèi)核通常需要地部件是程管理,程間通信,內(nèi)存管理部分,其它部件,如文件系統(tǒng),驅(qū)動(dòng)程序,網(wǎng)絡(luò)協(xié)議等,都可以配置,并以有關(guān)地方式實(shí)現(xiàn)。嵌入式Linux引導(dǎo)過(guò)程概念簡(jiǎn)介嵌入式Linux操作系統(tǒng)(三)根文件系統(tǒng)在嵌入式系統(tǒng)地"硬盤(pán)"概念一般都以ramdisk地方式實(shí)現(xiàn)。因?yàn)镕alsh在斷電后還能繼續(xù)保存數(shù)據(jù)地設(shè)備,但其價(jià)格相對(duì)昂貴;然而系統(tǒng)又無(wú)法使用像硬盤(pán)這樣地大型設(shè)備,因此,需要長(zhǎng)久使用地文件系統(tǒng)數(shù)據(jù),尤其是應(yīng)用程序地可執(zhí)行文件,運(yùn)行庫(kù)等,運(yùn)行時(shí)都放在RAM。常用地方式就是從RAM劃分出一塊內(nèi)存虛擬成"硬盤(pán)",對(duì)它地操作與對(duì)永久存儲(chǔ)器操作一樣。在Linux就存在這樣地設(shè)備,稱(chēng)為ramdisk,一般使用地設(shè)備文件是/dev/ram零。ramdisk地啟動(dòng)需要操作系統(tǒng)地支持。bootloader負(fù)責(zé)將ramdisk下載到與內(nèi)核映像不沖突地位置,操作系統(tǒng)啟動(dòng)之后會(huì)自動(dòng)尋找ramdisk所在地位置,將ramdisk作為一種設(shè)備安裝(mount)為根文件系統(tǒng)。嵌入式Linux引導(dǎo)過(guò)程概念簡(jiǎn)介嵌入式Linux操作系統(tǒng)嵌入式Linux引導(dǎo)過(guò)程概念簡(jiǎn)介當(dāng)然,根文件系統(tǒng)不一定使用ramdisk實(shí)現(xiàn),還可以用NFS方式通過(guò)網(wǎng)絡(luò)安裝根文件系統(tǒng)。這也是在系統(tǒng)內(nèi)核實(shí)現(xiàn)地。操作系統(tǒng)啟動(dòng)之后直接通過(guò)內(nèi)核NFS有關(guān)代碼對(duì)處于網(wǎng)絡(luò)上地NFS文件系統(tǒng)行安裝。文件系統(tǒng)啟動(dòng)地方式可以在內(nèi)核代碼編寫(xiě)或者啟動(dòng)時(shí)通過(guò)參數(shù)指定。(四)重定位與下載生成了目地臺(tái)需要地image文件之后,就可以通過(guò)相應(yīng)地工具與目地板上地bootloader程序行通信。可以使用bootloader提供地,或者通用地終端工具與目地板相連接。一般在目地板上使用串口,通過(guò)主機(jī)終端工具與目地板通信。bootloader提供下載等控制命令,完成嵌入式系統(tǒng)正式在目地板上運(yùn)行之前對(duì)目地板地控制任務(wù)。bootloader指定image文件下載地位置。在下載結(jié)束之后,使用bootloader提供地運(yùn)行命令,從指定地址開(kāi)始運(yùn)行嵌入式系統(tǒng)軟件。這樣,一個(gè)完成地嵌入式系統(tǒng)軟件開(kāi)始運(yùn)行了。嵌入式Linux操作系統(tǒng)(五)Linux內(nèi)核源代碼地匯編語(yǔ)言代碼任何一個(gè)用高級(jí)語(yǔ)言編寫(xiě)地操作系統(tǒng),其內(nèi)核代碼總有少部分代碼時(shí)用匯編語(yǔ)言編寫(xiě)地。其大部分是關(guān)于終端與異常處理地底層程序,還有一些與初始化有關(guān)地程序以及一些核心代碼調(diào)用地公用子程序。用匯編語(yǔ)言編寫(xiě)核心代碼地部分代碼出于以下幾個(gè)方面地考慮。操作系統(tǒng)內(nèi)核地底層程序直接與硬件打道,需要用到一些專(zhuān)用地指令,而這些指令在C語(yǔ)言并無(wú)相對(duì)應(yīng)地語(yǔ)言成分。因此,這些底層地操作需要用匯編語(yǔ)言來(lái)編寫(xiě)。CPU地一些對(duì)寄存器地操作也是一樣,如要設(shè)置一個(gè)段寄存器時(shí),也只好用匯編語(yǔ)言來(lái)編寫(xiě)。CPU地一些特殊指定也沒(méi)有相對(duì)應(yīng)地C語(yǔ)言成分,如關(guān)斷,開(kāi)斷等。此外,在同一體系系統(tǒng)地不同CPU芯片,特別是新開(kāi)發(fā)出來(lái)地芯片,往往會(huì)增加一些新地指令,對(duì)這些指令地使用也得用匯編語(yǔ)言。嵌入式Linux引導(dǎo)過(guò)程概念簡(jiǎn)介嵌入式Linux操作系統(tǒng)內(nèi)核實(shí)現(xiàn)某些操作地過(guò)程,程序段或函數(shù),在運(yùn)行時(shí)會(huì)非常頻繁地被調(diào)用,因此,其時(shí)間效率就顯得很重要。而用匯編語(yǔ)言編寫(xiě)地程序,在算法與數(shù)據(jù)結(jié)構(gòu)相同地條件下,常比使用高級(jí)語(yǔ)言編寫(xiě)地效率要高。在此類(lèi)程序或程序段,往往每一條匯編指令地使用都需要經(jīng)過(guò)推敲。系統(tǒng)調(diào)用地入與返回就是一個(gè)典型例子,系統(tǒng)調(diào)用地出時(shí)非常頻繁用到地過(guò)程,每秒鐘可能會(huì)用到成千上萬(wàn)次,其時(shí)間效率可謂舉足輕重。再者,系統(tǒng)調(diào)用地出過(guò)程還牽涉到用戶空間與系統(tǒng)空間之間地來(lái)回切換,而用于這個(gè)目地地一些指令在C語(yǔ)言本來(lái)就沒(méi)有對(duì)應(yīng)地語(yǔ)言成分,所以系統(tǒng)調(diào)用地入與返回顯然需要用匯編語(yǔ)言來(lái)編寫(xiě)。在某些特殊地場(chǎng)合,一段程序地空間效率也會(huì)顯得非常重要。操作系統(tǒng)地引導(dǎo)程序就是一個(gè)例子。系統(tǒng)地引導(dǎo)程序通常一定要能容納在特定地區(qū)域。此時(shí),這段程序地大小多出一個(gè)字節(jié)也不允許,所以一般使用匯編語(yǔ)言編寫(xiě)。嵌入式Linux引導(dǎo)過(guò)程概念簡(jiǎn)介嵌入式Linux操作系統(tǒng)嵌入式Linux操作系統(tǒng)Linux地特點(diǎn)使得它成為適合嵌入式開(kāi)發(fā)與應(yīng)用地操作系統(tǒng)。對(duì)于使用操作系統(tǒng)地嵌入式系統(tǒng)而言,操作系統(tǒng)一般是以內(nèi)核映像地形式與文件系統(tǒng)一起下載到目地系統(tǒng)。一個(gè)最基本地嵌入式Linux系統(tǒng)從軟件地角度可以分為四個(gè)層次。①導(dǎo)加載程序bootloader。②Linux內(nèi)核。③文件系統(tǒng)。④用戶應(yīng)用程序。(一)嵌入式Linux引導(dǎo)過(guò)程嵌入式Linux系統(tǒng)地引導(dǎo)過(guò)程如下。①理器重新啟動(dòng)后,首先執(zhí)行啟動(dòng)代碼以初始化內(nèi)存控制器以及片上設(shè)備,然后配置存儲(chǔ)嵌入式Linux引導(dǎo)過(guò)程嵌入式Linux操作系統(tǒng)映射。②Bootloader把內(nèi)核從Flash等固態(tài)存儲(chǔ)設(shè)備加載到RAM,然后跳轉(zhuǎn)到內(nèi)核地第一條指令處執(zhí)行。③內(nèi)核首先配置微處理器地寄存器,然后調(diào)用start-kernel,它是與微處理器體系結(jié)構(gòu)無(wú)關(guān)地開(kāi)始點(diǎn)。④內(nèi)核初始化高速緩存與各種硬件設(shè)備。⑤內(nèi)核掛載根文件系統(tǒng)。⑥內(nèi)核執(zhí)行init程。⑦init運(yùn)行時(shí)享庫(kù)。⑧init讀取其配置文件。⑨init最后入用戶會(huì)話階段。嵌入式Linux引導(dǎo)過(guò)程嵌入式Linux操作系統(tǒng)在此過(guò)程bootloader地作用是非常重要地。(二)嵌入式系統(tǒng)bootloader地作用嵌入式系統(tǒng)首先要考慮地是啟動(dòng)問(wèn)題,當(dāng)一個(gè)微處理器最初啟動(dòng)時(shí),它首先執(zhí)行一個(gè)預(yù)定地址處地指令,這個(gè)地址處存放系統(tǒng)初始化或引導(dǎo)程序,正如PC地BIOS。在嵌入式系統(tǒng)由于沒(méi)有BIOS,因此將由引導(dǎo)加載程序bootloader實(shí)現(xiàn)類(lèi)似地功能。bootloader代碼量雖少,但是其作用卻非常重要,而且許多代碼與處理器體系結(jié)構(gòu)有關(guān)而不具備移植,因此研究有關(guān)技術(shù)從而寫(xiě)出針對(duì)特定處理器地啟動(dòng)代碼對(duì)嵌入式系統(tǒng)設(shè)計(jì)尤為重要。嵌入式Linux引導(dǎo)過(guò)程嵌入式Linux操作系統(tǒng)嵌入式Linux地bootloader主要作用如下?!癯跏蓟幚砥?●初始化地必備地硬件;●下載系統(tǒng)映像;●初始化操作系統(tǒng);●啟動(dòng)已下載地操作系統(tǒng)??傊産ootloader負(fù)責(zé)完成系統(tǒng)地初始化,把操作系統(tǒng)內(nèi)核映像加載到RAM,然后跳轉(zhuǎn)到內(nèi)核地入口點(diǎn)去運(yùn)行。嵌入式Linux引導(dǎo)過(guò)程嵌入式Linux操作系統(tǒng)(三)bootloader地操作模式bootloader一般要實(shí)現(xiàn)兩種操作模式:自舉與內(nèi)核啟動(dòng)模式。自舉模式地主要作用是目地機(jī)通過(guò)串口與主機(jī)通信,可以接收主機(jī)發(fā)送過(guò)來(lái)地映像文件,并將其固化在目地機(jī)地Flash等固態(tài)存儲(chǔ)設(shè)備,也可以將Flash地映像文件上傳到主機(jī)。內(nèi)核啟動(dòng)模式允許嵌入式系統(tǒng)加電啟動(dòng)后由bootloader從目地機(jī)上地Flash等固態(tài)存儲(chǔ)設(shè)備上將操作系統(tǒng)加載到RAM運(yùn)行。一般嵌入式系統(tǒng)bootloader應(yīng)能實(shí)現(xiàn)這兩種模式地切換。(四)bootloader地基本框架結(jié)構(gòu)大部分地bootloader依賴(lài)于CPU地體系結(jié)構(gòu)與嵌入式板級(jí)設(shè)備地配置,因此,bootloader可分為兩部分:用匯編語(yǔ)言實(shí)現(xiàn)地依賴(lài)于CPU體系結(jié)構(gòu)地代碼stage一與用C語(yǔ)言實(shí)現(xiàn)地代碼stage二。嵌入式Linux引導(dǎo)過(guò)程嵌入式Linux操作系統(tǒng)①stage一地操作。a.硬件地初始化,包括以下步驟?!衿帘嗡袛?●設(shè)置CPU地速度與時(shí)鐘頻率?!癯跏蓟疪AM?!癯跏蓟疞ED或UART?!駷榧虞dstage二準(zhǔn)備RAM空間。b.加載stage二到RAM。c.設(shè)置堆棧指針SP,為執(zhí)行C語(yǔ)言代碼做準(zhǔn)備。d.加載到stage二地C語(yǔ)言入口點(diǎn)。嵌入式Linux引導(dǎo)過(guò)程嵌入式Linux操作系統(tǒng)②stage二地基本操作?!癯跏蓟倦A段要用到地硬件設(shè)備?!駲z測(cè)系統(tǒng)地內(nèi)存映射。將存儲(chǔ)在Flash上地內(nèi)核映像讀到預(yù)留地RAM空間之前,先確定這些預(yù)留地RAM空間哪些被真正映射到了RAM地址單元?!窦虞d內(nèi)核映像與根文件系統(tǒng)映像?!裨O(shè)置內(nèi)核啟動(dòng)參數(shù)。Linux二.四.x以后地內(nèi)核都期望以標(biāo)記列表地形式傳遞參數(shù),在嵌入式Linux系統(tǒng),通常由bootloader設(shè)置地啟動(dòng)參數(shù)有ATAG-CORE,ATAG-MEM,ATAG-RAMDISK,ATAG-一NITRD等?!裾{(diào)用內(nèi)核,即直接跳轉(zhuǎn)到內(nèi)核地第一條指令地址處執(zhí)行。嵌入式Linux引導(dǎo)過(guò)程嵌入式Linux操作系統(tǒng)基本地啟動(dòng)流程主要分成四個(gè)部分。(一)在系統(tǒng)加電檢測(cè)結(jié)束以后,由BIOS地代碼負(fù)責(zé)把引導(dǎo)器加載入機(jī)器地內(nèi)存,控制權(quán)給引導(dǎo)器。這里又要分成兩個(gè)部分,因?yàn)锽IOS只負(fù)責(zé)裝入五一二個(gè)字節(jié)地程序,然后把控制權(quán)給這五一二字節(jié)。一般地引導(dǎo)器大小超過(guò)五一二字節(jié),其余部分再由這五一二字節(jié)地代碼負(fù)責(zé)裝入。圖五-二二Linux系統(tǒng)啟動(dòng)流程圖

(二)引導(dǎo)器負(fù)責(zé)確定Linux內(nèi)核地位置,把Linux內(nèi)核加載入內(nèi)存;同時(shí),確定根文件系統(tǒng)地位置,將根文件系統(tǒng)地鏡像加載入內(nèi)存。然后在加載內(nèi)核Linux啟動(dòng)流程嵌入式Linux操作系統(tǒng)地時(shí)候給內(nèi)核傳入一些啟動(dòng)參數(shù),用于控制內(nèi)核執(zhí)行過(guò)程地一些行為,接下來(lái)將控制權(quán)給內(nèi)核。(三)內(nèi)核接管控制權(quán)以后,首先解壓縮自己,檢測(cè)設(shè)備,加載內(nèi)部模塊。然后根據(jù)啟動(dòng)參數(shù)掛載根文件系統(tǒng)。掛載完根文件系統(tǒng)后內(nèi)核啟動(dòng)地第一個(gè)程是init,默認(rèn)地位置為"/sbin/init"。如果找不到這個(gè)可執(zhí)行文件,就轉(zhuǎn)而啟動(dòng)"/bin/sh",提供給用戶一個(gè)機(jī)互地界面。(四)init程啟動(dòng)后查找地第一個(gè)配置文件是"/etc/inittab",這個(gè)文件控制init地行動(dòng)。一般init會(huì)首先指定啟動(dòng)等級(jí),然后執(zhí)行"/etc/rc.d/rc.sysinit",同時(shí)rc.sysinit?啟動(dòng)腳本啟動(dòng)系統(tǒng)服務(wù)程(如update,syslogd等),網(wǎng)絡(luò)與必要地環(huán)境變量設(shè)置。最后inittab會(huì)指定init程去調(diào)用getty打開(kāi)多個(gè)終端控制臺(tái),每個(gè)終端控制臺(tái)會(huì)執(zhí)行l(wèi)ogin,從而出現(xiàn)"login:"地提示符。整個(gè)Linux系統(tǒng)啟動(dòng)完成。Linux啟動(dòng)流程嵌入式Linux操作系統(tǒng)

Linux啟動(dòng)流程

ARM嵌入式系統(tǒng)原理與開(kāi)發(fā)要制作一套精簡(jiǎn)地Linux系統(tǒng),首先需要一套完整地Linux開(kāi)發(fā)臺(tái),這套開(kāi)發(fā)臺(tái)上需要要有g(shù)cc編譯連接工具,mkisofsISO文件系統(tǒng)創(chuàng)建工具。這里選用地是RedHatLinux七.三。一.內(nèi)核地編譯與安裝首先介紹x八六處理器臺(tái)地內(nèi)核編譯與使用,它不需要使用叉編譯臺(tái)對(duì)內(nèi)核行編譯?;贏RM處理器地叉編譯內(nèi)容后續(xù)會(huì)簡(jiǎn)單介紹。這里選用地內(nèi)核版本號(hào)是Linux-二.四.二零(可以從.下載)。下載地內(nèi)核是壓縮包,解開(kāi)壓縮包,在源代碼目錄下使用makemenuconfig(也可以使用makeconfig或makexconfig)。因?yàn)樾枰獙?duì)Linux行精簡(jiǎn),因此要選擇有關(guān)地內(nèi)核選項(xiàng):

從"零"到一套精簡(jiǎn)地Linux臺(tái)

嵌入式Linux操作系統(tǒng)

Filesystems>[*]/devfilesystemsupport(EXPERIMENTAL)//使用了devfs文件系統(tǒng)。[*]Automaticallymountatboot

Loadablemodulesupport>[]Enableloadablemodulesupport//對(duì)于固定地硬件臺(tái),把要使用到地驅(qū)動(dòng)都編譯入內(nèi)核

從"零"到一套精簡(jiǎn)地Linux臺(tái)

嵌入式Linux操作系統(tǒng)workdevicesupport>Ether(一零or一零零Mbit)>[*]Ether(一零or一零零Mbit)[*]EISA,VLB,PCIandonboardcontrollers[*]AMDPC三二PCIsupport//Vmware軟件使用地網(wǎng)卡驅(qū)動(dòng)程序[*]DECchipTulip(dc二一x四x)PCIsupport//VisualPC軟件使用地網(wǎng)卡驅(qū)動(dòng)程序

從"零"到一套精簡(jiǎn)地Linux臺(tái)

嵌入式Linux操作系統(tǒng)[*]RealTekRTL-八一三九PCIFastEtherAdaptersupport//實(shí)際PC使用地網(wǎng)卡驅(qū)動(dòng)程序

這里編譯內(nèi)核地選項(xiàng)還有許多,用戶可以根據(jù)自己項(xiàng)目地需要選擇不同地選項(xiàng),使制作地Linux臺(tái)具有不同地特。二.引導(dǎo)器地編譯與安裝引導(dǎo)器要能識(shí)別ISO九六六零文件系統(tǒng),這樣它才能在所制作地鏡像文件找到內(nèi)核與根文件系統(tǒng)鏡像,在這里選用地是syslinux自由軟件地一個(gè)工具isolinux,版本號(hào)為syslinux-二.零四(可以在http://syslinux.zytor./下載)。在安裝syslinux之前,首先要安裝nasm匯編工具,因?yàn)閟yslinux就是靠這個(gè)工具編譯地。nasm地版本號(hào)為nasm-零.九八.三八(可以在http://nasm.sf./下載)。

從"零"到一套精簡(jiǎn)地Linux臺(tái)

嵌入式Linux操作系統(tǒng)安裝完nasm工具以后,編譯syslinux就可以得到引導(dǎo)器地目地文件:isolinux.bin,這個(gè)文件就是在BIOS自檢后被加載地代碼,負(fù)責(zé)加載內(nèi)核與根文件系統(tǒng)。三.工具軟件地安裝一般在嵌入式系統(tǒng)使用地文件系統(tǒng),基本地工具集合主要是三個(gè):busybox,tinylogin,uclibc。其busybox提供各種基本地工具,如cat,ping等;uclibc提供一個(gè)精簡(jiǎn)地C運(yùn)行庫(kù),使用這個(gè)庫(kù),可以大大減小系統(tǒng)地體積(從一.二MB減小到二五三KB),但是帶來(lái)地可能是某些函數(shù)不兼容;tinylogin這個(gè)工具集合是一個(gè)微型地用戶登錄,認(rèn)證工具,如addgroup,adduser,login等;為了防止uclibc帶來(lái)地不兼容,可以使用busybox與tinylogin,避免影響一些程序地工作。

從"零"到一套精簡(jiǎn)地Linux臺(tái)

嵌入式Linux操作系統(tǒng)四.啟動(dòng)配置文件地制作Inittab配置文件是一個(gè)固定格式地文本文件,因?yàn)榫?jiǎn)地Linux臺(tái)上使用地init程是由busybox提供地,與普通Linux上面地systemVinit有一定地差異,主要地是busybox提供地init程不支持啟動(dòng)級(jí)別(runlevel)。Inittab配置文件每一行地格式為:

<id>:<runlevels>:<action>:<process>

從"零"到一套精簡(jiǎn)地Linux臺(tái)

嵌入式Linux操作系統(tǒng)五.臺(tái)地整合在臺(tái)整合之前,需要建立相應(yīng)地文件夾,同時(shí)要配置好相應(yīng)地系統(tǒng)配置文件。系統(tǒng)需要地文件夾為/bin/sbin/var/dev/proc/lib/home/root/tmp/usr同時(shí),有些工具放在/usr目錄下面,所以在/usr目錄下面一般還有如下目錄:/usr/bin/usr/sbin/usr/etc/usr/share/usr/lib等建立好相應(yīng)地目錄以后,將工具復(fù)制入相應(yīng)地目錄,這樣才可以建立一個(gè)完整地根文件系統(tǒng)鏡像。建立根文件系統(tǒng)地時(shí)候,首先要使用dd命令創(chuàng)建一個(gè)三二MB大小地文件,然后使用mkfs.ext三把創(chuàng)建地文件格式化成ext三分區(qū)格式,最后以loop設(shè)備地方式掛載到一個(gè)目錄下面,把整個(gè)文件系統(tǒng)復(fù)制到這個(gè)loop文件系統(tǒng)上面。制作好根文件系統(tǒng)以后,使用mkisofs工具合成可啟動(dòng)操作系統(tǒng)鏡像,這個(gè)鏡像就可以作為一套精簡(jiǎn)地Linux操作系統(tǒng)來(lái)使用。對(duì)于dd命令,mkisofs命令地使用,詳細(xì)內(nèi)容可查看manpage:dd(一)mkisofs(四)。從"零"到一套精簡(jiǎn)地Linux臺(tái)嵌入式Linux操作系統(tǒng)從"零"到一套精簡(jiǎn)地Linux臺(tái)ARM嵌入式系統(tǒng)原理與開(kāi)發(fā)六.臺(tái)地?cái)U(kuò)展在精簡(jiǎn)地Linux臺(tái)上行擴(kuò)展是非常方便地,對(duì)于臺(tái)地?cái)U(kuò)展主要是兩個(gè)方面:內(nèi)核地修改與應(yīng)用程序地添加。要修改臺(tái)地內(nèi)核,只要把重新編譯過(guò)地內(nèi)核復(fù)制到光盤(pán)鏡像目錄地根目錄,覆蓋掉原來(lái)地內(nèi)核文件,再使用mkisofs工具重新整合操作系統(tǒng)鏡像。要在臺(tái)地文件系統(tǒng)添加一些應(yīng)用程序,首先要考慮添加應(yīng)用程序以后,文件系統(tǒng)是否大于ramdisk地容量(這里要考慮系統(tǒng)執(zhí)行地時(shí)候會(huì)產(chǎn)生一些臨時(shí)文件,所以要留有一定地空間),在ramdisk容量夠地情況下,解開(kāi)根文件系統(tǒng)地壓縮鏡像,使用loop設(shè)備地方式掛載到開(kāi)發(fā)系統(tǒng)地文件系統(tǒng)上面。將要添加入地應(yīng)用程序復(fù)制到相應(yīng)地目錄,同時(shí)注意是否要復(fù)制一些庫(kù)文件與配置文件。重新壓縮根文件系統(tǒng),最后還是通過(guò)mkisofs工具重新合成系統(tǒng)鏡像。從x八六臺(tái)到嵌入式臺(tái)一.BSP與BIOS在PC上,操作系統(tǒng)與硬件互,通過(guò)BIOS(基本輸入/輸出系統(tǒng))行,BIOS為操作系統(tǒng)控制硬件提供了一個(gè)接口。在嵌入式硬件臺(tái)上,由于各硬件臺(tái)之間存在著許多差異,當(dāng)然就不會(huì)存在一個(gè)通用地BSP(板級(jí)支持包),BSP提供與BIOS相當(dāng)?shù)毓δ?主要也是對(duì)操作系統(tǒng)與底層硬件互提供一個(gè)接口。BSP地開(kāi)發(fā)是在嵌入式硬件臺(tái)開(kāi)發(fā)完成后做地第一件事情,一般BSP不會(huì)全部自己寫(xiě),都是根據(jù)其它類(lèi)似地硬件臺(tái)上能使用地BSP源代碼行修改。二.叉編譯臺(tái)以x八六為臺(tái)行Linux地裁減,開(kāi)發(fā)系統(tǒng)也使用x八六系列地PC,這樣就不需要建立叉編譯臺(tái),在宿主機(jī)上能執(zhí)行地二制代碼,放到目地機(jī)器上也是能直接執(zhí)行地。而對(duì)于ARM,PPC等處理器,指令集與x八六地指令集完全不同,在x八六臺(tái)上能運(yùn)行地二制代碼,在ARM,PPC臺(tái)上不能直接運(yùn)行,只有通過(guò)叉編譯臺(tái),使用源代碼編譯出目地機(jī)器上地可執(zhí)行二制代碼才能在目地機(jī)器上使用。叉編譯臺(tái)是針對(duì)CPU地,不同地CPU對(duì)應(yīng)不同地臺(tái),對(duì)于硬件電路沒(méi)有任何關(guān)系。叉編譯臺(tái)主要包括gcc,ld,ar,strip等工具與在目地臺(tái)上地glibc動(dòng)態(tài)庫(kù)。這樣就可以在宿主機(jī)器上構(gòu)件地叉編譯環(huán)境下編譯目地機(jī)器上地操作系統(tǒng)內(nèi)核,工具軟件等。嵌入式Linux操作系統(tǒng)

從x八六臺(tái)到嵌入式臺(tái)

三.驅(qū)動(dòng)程序?qū)τ诙ㄖ频厍度胧较到y(tǒng)硬件臺(tái),大部分驅(qū)動(dòng)程序是不能直接使用地,因?yàn)樵诙ㄖ频赜布_(tái)上,板級(jí)寄存器地地址,設(shè)備地讀寫(xiě)地址,RAM/ROM地地址等都不相同。即使是Linux內(nèi)核支持地設(shè)備,也要對(duì)其驅(qū)動(dòng)程序源碼行修改才能使用。對(duì)于定制地硬件臺(tái)一些特殊地專(zhuān)用設(shè)備,只能自己來(lái)為設(shè)備書(shū)寫(xiě)驅(qū)動(dòng)。因?yàn)長(zhǎng)inux內(nèi)核源代碼帶了各種各樣地設(shè)備驅(qū)動(dòng),沒(méi)有必要每一個(gè)字節(jié)都自己寫(xiě),可以根據(jù)類(lèi)似設(shè)備地驅(qū)動(dòng)程序,對(duì)其行簡(jiǎn)單地修改。四.系統(tǒng)地啟動(dòng)PC上行Linux系統(tǒng)精簡(jiǎn)地工作時(shí),可以使用引導(dǎo)器(如isolinux)來(lái)裝入Linux嵌入式Linux操作系統(tǒng)內(nèi)核與根文件系統(tǒng)鏡像;在此之前,由BIOS負(fù)責(zé)轉(zhuǎn)入引導(dǎo)器。而在嵌入式臺(tái)上,也可以使用類(lèi)似地方式,使用一個(gè)引導(dǎo)器(如Redboot,Ppcboot等),這些引導(dǎo)器地基本工作原理相同,負(fù)責(zé)從指定地ROM地址把數(shù)據(jù)搬運(yùn)到指定地RAM地址,然后轉(zhuǎn)移控制權(quán)。由于嵌入式系統(tǒng)上比較常見(jiàn)地是使用FlashMemory來(lái)存放引導(dǎo)器,操作系統(tǒng)內(nèi)核與根文件系統(tǒng)。在嵌入式臺(tái)上面,內(nèi)存資源比較緊張,不可能把整個(gè)文件系統(tǒng)從FlashMemory復(fù)制到RAM執(zhí)行,而使用在FlashMemory上面直接可以讀寫(xiě)地文件系統(tǒng)jffs。使用這種文件系統(tǒng),Linux在啟動(dòng)過(guò)程就會(huì)又有一些不同地工作,而且對(duì)于文件系統(tǒng)地制作也有許多不同地地方。從x八六臺(tái)到嵌入式臺(tái)嵌入式Linux操作系統(tǒng)五.臺(tái)地整合在x八六上行Linux系統(tǒng)地精簡(jiǎn),最后通過(guò)使用mkisofs工具把引導(dǎo)器,操作系統(tǒng)內(nèi)核以及根文件系統(tǒng)全部集成到一個(gè)iso光盤(pán)鏡像。在嵌入式系統(tǒng)臺(tái)上,一般采用jtag接口把引導(dǎo)器燒錄到FlashMemory,然后使用FlashMemory上地引導(dǎo)器引導(dǎo)嵌入式系統(tǒng)臺(tái)。在引導(dǎo)器地控制下,把操作系統(tǒng)內(nèi)核與根文件系統(tǒng)鏡像都下載到RAM,然后燒錄到FlashMemory地特殊位置上。同時(shí),把這些位置信息讓引導(dǎo)器保存起來(lái),這樣下一次啟動(dòng)地時(shí)候,引導(dǎo)器就直接可以引導(dǎo)Linux系統(tǒng)了。從x八六臺(tái)到嵌入式臺(tái)

嵌入式Linux操作系統(tǒng)這里將介紹常用地三種用戶態(tài)程與內(nèi)核互地方式:ioctl,proc,linksocket。一.ioctl在UNIX系統(tǒng),ioctl是設(shè)備驅(qū)動(dòng)程序?qū)υO(shè)備地I/O通道行管理地系統(tǒng)調(diào)用,所謂對(duì)I/O通道行管理,就是對(duì)設(shè)備地一些特行控制,如串口地傳輸波特率,電動(dòng)機(jī)地轉(zhuǎn)速等。這個(gè)函數(shù)主要用于設(shè)備驅(qū)動(dòng)間。在用戶態(tài)看來(lái),ioctl地調(diào)用方式如下:

intioctl(intfd,indd,…);

Linux臺(tái)上用戶空間程序與內(nèi)核互方式

嵌入式Linux操作系統(tǒng)二.Proc文件系統(tǒng)Proc文件系統(tǒng)是Linux內(nèi)核提供地一個(gè)虛擬地文件系統(tǒng),用于讓用戶空間地程獲取一些內(nèi)核信息或者配置一些內(nèi)核地參數(shù),使內(nèi)核模塊以指定地方式工作。一些用戶空間地命令(如ps命令)直接讀取proc文件系統(tǒng)里面相應(yīng)文件地信息。根據(jù)內(nèi)核版本地不同,或者編譯內(nèi)核地時(shí)候選擇模塊地不同,Linux系統(tǒng)執(zhí)行地時(shí)候得到地proc文件系統(tǒng)地內(nèi)容將會(huì)有所區(qū)別。一般一些基本地信息在proc文件系統(tǒng)都可以找到。

Linux臺(tái)上用戶空間程序與內(nèi)核互方式

嵌入式Linux操作系統(tǒng)在內(nèi)核模塊設(shè)計(jì),與構(gòu)建/proc文件有關(guān)地函數(shù)有五個(gè),它們地聲明在/linux/proc_fs.h文件。(一)structproc_dir_entry*create_proc_entry(constchar*name,mode_tmode,structproc_dir_entry*parent)這個(gè)函數(shù)以名稱(chēng)name與文件模式mode在目錄parent下創(chuàng)建一個(gè)規(guī)則文件。如果要在根目錄/proc下創(chuàng)建,則parent參數(shù)用NULL代替。創(chuàng)建成功地話,返回一個(gè)指向新建結(jié)構(gòu)體proc_dir_entry地指針,否則返回NULL。另外,這個(gè)函數(shù)可以支持跨越多層目錄地創(chuàng)建。(二)structproc_dir_entry*proc_symlink(constchar*name,structproc_dir_entry*parent,constchar*dest)這個(gè)函數(shù)用于在目錄parent下以名稱(chēng)name建立指向dest地符號(hào)連接,在用戶態(tài),相當(dāng)于ln-sdestname。

Linux臺(tái)上用戶空間程序與內(nèi)核互方式

嵌入式Linux操作系統(tǒng)(三)structproc_dir_entry*proc_mknod(constchar*name,mode_tmode,structproc_dir_entry*parent,kdev_trdev)這個(gè)函數(shù)用于在目錄parent下以名稱(chēng)name與模式mode建立一個(gè)設(shè)備文件,該設(shè)備文件在設(shè)備rdev下工作,rdev被linux/kdev_t.h定義地宏MKDEV創(chuàng)建。Mode參數(shù)需要包含S_IFBLK或S_IFCHR來(lái)創(chuàng)建設(shè)備節(jié)點(diǎn)。(四)structproc_dir_entry*proc_mkdir(constchar*name,structproc_dir_entry*parent)顧名思義,用來(lái)在parent目錄下創(chuàng)建名稱(chēng)為name地目錄。(五)voidremove_proc_entry(constchar*name,structproc_dir_entry*parent)Linux臺(tái)上用戶空間程序與內(nèi)核互方式嵌入式Linux操作系統(tǒng)三.linkSocketslinkSockets也是用于在Linux內(nèi)核空間與用戶空間傳輸信息地方法,它提供了一套雙向地內(nèi)核空間/用戶空間互地方式。對(duì)于用戶空間程序看來(lái),linkSocket就是一套標(biāo)準(zhǔn)地Sockets函數(shù),而對(duì)于內(nèi)核空間模塊看來(lái),也有一套方便地函數(shù)入口與出口?,F(xiàn)在Linux內(nèi)核提供地linkSockets協(xié)議還行細(xì)分,根據(jù)使用側(cè)重點(diǎn)地不同,以前地Linux內(nèi)核主要分為以下內(nèi)容:●LINK_ROUTE:接收路由更新信息,可以用來(lái)修改IPv四地路由表。Linux臺(tái)上用戶空間程序與內(nèi)核互方式ARM嵌入式系統(tǒng)原理與開(kāi)發(fā)●LINK_FIREWALL:接收IPv四防火墻編碼發(fā)送地?cái)?shù)據(jù)包?!馤INK_ARPD:用以維護(hù)用戶地址空間里地arp表。●LINK_ROUTE六:接收與發(fā)送IPv六路由表更新消息?!馤INK_IP六_FW:接收未通過(guò)IPv六防火墻檢查地?cái)?shù)據(jù)包(尚未實(shí)現(xiàn))。●LINK_TAPBASE...LINK_TAPBASE+一五:是Ethertap設(shè)備實(shí)例。Ethertap是從用戶程序空間對(duì)以太網(wǎng)驅(qū)動(dòng)程序行仿真地"偽"網(wǎng)絡(luò)通道設(shè)備。●LINK_SKIP:Enskip地保留選項(xiàng)。●LINK_USERSOCK:為今后用戶程序空間協(xié)議用保留選項(xiàng)。Linux臺(tái)上用戶空間程序與內(nèi)核互方式嵌入式Linux操作系統(tǒng)Linux是一套功能非常強(qiáng)大地網(wǎng)絡(luò)操作系統(tǒng),在最新地Linux內(nèi)核,經(jīng)過(guò)研究發(fā)現(xiàn),至少有如下特。①提供了完整地TCP/IP網(wǎng)絡(luò)協(xié)議棧地實(shí)現(xiàn)。②對(duì)于其它網(wǎng)絡(luò)協(xié)議(如IPX協(xié)議,Appletalk協(xié)議,DEC,X.二五協(xié)議,IPv六協(xié)議等)也提供了很好地支持。③Linux在實(shí)現(xiàn)自己地網(wǎng)絡(luò)協(xié)議棧地時(shí)候,使用了一套非常靈活地框架:filter構(gòu)架,這套框架給用戶開(kāi)發(fā)網(wǎng)絡(luò)設(shè)備或者開(kāi)發(fā)網(wǎng)絡(luò)應(yīng)用等提供了靈活地接口。④提供了比較完整地QoS支持。同時(shí),網(wǎng)絡(luò)上出現(xiàn)地許多自由軟件(如動(dòng)態(tài)路由軟件zebra,MPLS信令軟件rsvpd,filter配置軟件iptables,網(wǎng)絡(luò)工具包Iproute二等)都對(duì)某項(xiàng)應(yīng)用提供了非常完整地實(shí)現(xiàn)。如果需要開(kāi)發(fā)自己地設(shè)備或者網(wǎng)絡(luò)應(yīng)用軟件地時(shí)候,完全可以參考這些自由軟件地體系框架。下面對(duì)Linux地filter構(gòu)架,iproute二軟件包地TC工具,動(dòng)態(tài)路由軟件zebra與MPLS在Linux下面地工作框架行簡(jiǎn)要分析。

Linux臺(tái)上網(wǎng)絡(luò)工具工作框架

嵌入式Linux操作系統(tǒng)一.filter構(gòu)架與iptables工具filter是在二.四.xLinux內(nèi)核版本開(kāi)始引入地,主要用于代替二.二.xLinux內(nèi)核版本地ipchains與二.零.xLinux內(nèi)核版本地ipfwadm。filter提供了一個(gè)抽象,通用化地框架,基于filter框架地功能有包過(guò)濾,NAT,數(shù)據(jù)包處理等。filter框架包含以下三部分。①為每種網(wǎng)絡(luò)協(xié)議(IPv四,IPv六等)定義一套掛載點(diǎn),其,IPv四協(xié)議定義了五個(gè)掛載點(diǎn),這些掛載點(diǎn)在數(shù)據(jù)包流過(guò)協(xié)議棧地幾個(gè)關(guān)鍵點(diǎn)被調(diào)用。在這幾個(gè)點(diǎn),協(xié)議棧將把數(shù)據(jù)包及掛載點(diǎn)標(biāo)號(hào)作為參數(shù)調(diào)用filter框架。②內(nèi)核地任何模塊可以對(duì)每種協(xié)議地一個(gè)或多個(gè)掛載點(diǎn)注冊(cè)釣子函數(shù),實(shí)現(xiàn)掛接,這樣當(dāng)某個(gè)數(shù)據(jù)包被傳遞給filter框架時(shí),內(nèi)核能檢測(cè)是否有任何模塊對(duì)該協(xié)議與掛載點(diǎn)行了注冊(cè)。若注冊(cè)了,則調(diào)用該模塊地注冊(cè)時(shí)使用釣子函數(shù),這樣這些模塊就有機(jī)會(huì)檢查,修改,丟棄該數(shù)據(jù)包或指示filter將該數(shù)據(jù)包傳入用戶空間地隊(duì)列。

Linux臺(tái)上網(wǎng)絡(luò)工具工作框架

嵌入式Linux操作系統(tǒng)③那些排隊(duì)地?cái)?shù)據(jù)包是被傳遞給用戶空間地異步地行處理。一個(gè)用戶程能檢查數(shù)據(jù)包,修改數(shù)據(jù)包,甚至可以重新將該數(shù)據(jù)包通過(guò)離開(kāi)內(nèi)核地同一個(gè)鉤子函數(shù)注入到內(nèi)核。圖五-二五所示為filter構(gòu)架內(nèi)部結(jié)構(gòu)圖,從圖可以看出filter架構(gòu)為IPv四提供了五個(gè)鉤子函數(shù)地掛載點(diǎn),掛載在其上地鉤子函數(shù)會(huì)在如下情況被調(diào)用?!馧F_IP_PRE_ROUTING:在完整校驗(yàn)之后,選路確定之前;●NF_IP_LOCAL_IN:在選路確定之后,且數(shù)據(jù)包地目地是本地主機(jī);●NF_IP_FORWARD:目地地是其它主機(jī)地?cái)?shù)據(jù)包;●NF_IP_LOCAL_OUT:來(lái)自本機(jī)程地?cái)?shù)據(jù)包在其離開(kāi)本地主機(jī)地過(guò)程;●NF_IP_POST_ROUTING:在數(shù)據(jù)包離開(kāi)本地主機(jī),準(zhǔn)備入網(wǎng)絡(luò)之前。

Linux臺(tái)上網(wǎng)絡(luò)工具工作框架

嵌入式Linux操作系統(tǒng)

Linux臺(tái)上網(wǎng)絡(luò)工具工作框架

嵌入式Linux操作系統(tǒng)內(nèi)核模塊可以對(duì)一個(gè)或多個(gè)這樣地鉤子函數(shù)行注冊(cè)掛接在掛載點(diǎn)上,在數(shù)據(jù)包經(jīng)過(guò)掛載點(diǎn)時(shí),這些鉤子函數(shù)被調(diào)用,從而模塊可以處理這些數(shù)據(jù)包,并向filter返回如下值以決定這個(gè)數(shù)據(jù)包地命運(yùn)?!馧F_ACCEPT:繼續(xù)正常傳輸數(shù)據(jù)包;●NF_DROP:丟棄該數(shù)據(jù)包,不再傳輸;●NF_STOLEN:模塊接管該數(shù)據(jù)包,不要繼續(xù)傳輸該數(shù)據(jù)包;●NF_QUEUE:對(duì)該數(shù)據(jù)包行排隊(duì)(用于將數(shù)據(jù)包給用戶空間地程行處理);●NF_REPEAT:再次調(diào)用該鉤子函數(shù)。在IPv四地IP層代碼,有一些帶有NF_HOOK宏地語(yǔ)句,如IP地轉(zhuǎn)發(fā)函數(shù)ip_forward()有如下語(yǔ)句:

N_HOOK(PF_I,NF_IP_FORWARD,skb,skb->dev,dev二,ip_forward_finish);

Linux臺(tái)上網(wǎng)絡(luò)工具工作框架

嵌入式Linux操作系統(tǒng)二.iproute二軟件包地TC工具Linux內(nèi)核從Kernel二.一.一零五就開(kāi)始支持QoS,其核心機(jī)理是在輸入/輸出接口,對(duì)不同數(shù)據(jù)行調(diào)度與處理,即流量控制(TC)。這套系統(tǒng)支持分類(lèi),優(yōu)先,享,輸入/輸出流量限制等,可以與專(zhuān)用地帶寬管理系統(tǒng)相媲美。TC只有在輸入檢測(cè)與輸出隊(duì)列兩部分對(duì)數(shù)據(jù)報(bào)行控制。輸入檢測(cè)僅僅是丟棄數(shù)據(jù)包,而輸出隊(duì)列則是對(duì)數(shù)據(jù)報(bào)行排隊(duì),丟棄,延時(shí)及設(shè)置優(yōu)先級(jí)。

Linux臺(tái)上網(wǎng)絡(luò)工

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論