畢業(yè)論文----基于arm的嵌入式linux內(nèi)核的研究與移植_第1頁
已閱讀1頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  基于ARM的嵌入式Linux內(nèi)核的研究與移植</p><p>  【摘要】:本文首先介紹了當(dāng)前嵌入式發(fā)展?fàn)顩r,以及一些常用的嵌入式系統(tǒng)。接下來講述了一些linux系統(tǒng)的知識。在移植前還介紹了我們所使用的開發(fā)平臺以及與移植相關(guān)的一些硬件參數(shù)。就如PC機一樣,系統(tǒng)的啟動需要啟動程序的引導(dǎo),嵌入式系統(tǒng)也是一樣。在本文我們使用的引導(dǎo)程序是u-boot,所以我們對u-boot的啟動過程進行了講解,并根

2、據(jù)我們的開發(fā)板進行修改編譯,最后可成功引導(dǎo)我們的開發(fā)板。接下來再對我們的內(nèi)核進行相應(yīng)的修改,主要參考的還是我們的硬件平臺,修改的地方有時鐘、flash驅(qū)動等,編譯好后產(chǎn)生bzImage內(nèi)核文件。要想一個linux系統(tǒng)能正確運行我們還需要文件系統(tǒng)的支持,本文使用的文件系統(tǒng)是yaffs,在制作文件系統(tǒng)時我們還要編譯busybox產(chǎn)生linux的常用命令集。我們移植的u-boot、內(nèi)核文件、文件系統(tǒng)構(gòu)成了嵌入式linux操作系統(tǒng),現(xiàn)在我們就可

3、以在系統(tǒng)上面進行驅(qū)動的開發(fā)和應(yīng)用程序的開發(fā)。</p><p>  【關(guān)鍵詞】:嵌入式、U-boot、S3C2440、Linux內(nèi)核移植。</p><p>  [Abstract]: The text firstly introduces the current embedded development situation, and some common embedded system.

4、 The next I will say something about the Linux system. Before pretransplant ,the text also introduces what we use development platform and some hardware with transplant related parameters. Just like the personal compute

5、r,if you want to startup System ,start programs is needed to guidance,so as the embedded system.In this text we use the guidance is u-boot.So we have a detailed i</p><p>  [Key words]: Embedded、U-Boot、S3C24

6、40、Linux kernel porting.</p><p><b>  引言</b></p><p>  嵌入式系統(tǒng)已經(jīng)融合到各行各業(yè)、各個領(lǐng)域,在電子產(chǎn)品中無處不在。小到手機、PDA、游戲機、冰箱、電視機常用家用電器,大到汽車、輪船、火車、飛機等,處處都有它的聲影,所以嵌入式系統(tǒng)的應(yīng)用領(lǐng)域相當(dāng)廣泛,前景無比美好。同傳統(tǒng)的通用計算機不同,嵌入式系統(tǒng)面向特定應(yīng)用領(lǐng)

7、域,根據(jù)應(yīng)用需求定制開發(fā)。</p><p>  一般來講,可以把由微處理器加上必要的外圍電路,再根據(jù)需求對微處理器進行編程,這樣組成的一個能夠?qū)崿F(xiàn)一定功能的完整系統(tǒng)叫做嵌入式系統(tǒng)。嵌入式系統(tǒng)式硬件與軟件的統(tǒng)一,嵌入式系統(tǒng)中使用的微處理器叫嵌入式處理器。嵌入式處理器種類繁多,本文中使用的三星公司基于ARM的處理器S3C2440。</p><p>  操作系統(tǒng)(Operating System

8、,OS)是一種特殊的系統(tǒng)軟件,它把底層的硬件細(xì)節(jié)封裝起來,為運行在它上面的軟件提供一個抽象的編程接口,同時它又是系統(tǒng)資源的管理者,管理著系統(tǒng)當(dāng)中的各種軟硬件資源,保證了系統(tǒng)能夠可靠地高速運行。而嵌入式操作系統(tǒng)(Embedded Operating System,EOS)指的是在嵌入式系統(tǒng)中使用的操作系統(tǒng)。</p><p>  常見的嵌入式操作系統(tǒng)有:VxWorks、Palm OS、Windows CE、uC/OS

9、-II、嵌入式Linux等。本文中將使用嵌入式Linux,它最大的亮點在于源代碼公開并且遵循GPL協(xié)議。</p><p>  此文研究Linux2.6內(nèi)核的移植,并在此基礎(chǔ)上加上啟動代碼uboot和yaffs文件系統(tǒng),實現(xiàn)一個完整的嵌入式Linux操作系統(tǒng),并運行在SamsungS3C2440開發(fā)板上。</p><p>  第1章 Linux概述</p><p> 

10、 第1.1節(jié) Linux的誕生和發(fā)展</p><p>  1.1.1. Linux操作系統(tǒng)的誕生</p><p>  Linux操作系統(tǒng)誕生于1991年的10月5日(這是Linus第一次正式向外公布的時間),它是UNIX操作系統(tǒng)的一種克隆系統(tǒng)。以后借助于Internet網(wǎng)絡(luò),經(jīng)過世界各地地計算機愛好者的共同努力,現(xiàn)已經(jīng)成為當(dāng)今世界上使用的最多的一種UNIX類操作系統(tǒng),并且使用的人數(shù)還在迅猛

11、增長。</p><p>  1.1.2. Linux操作系統(tǒng)的發(fā)展</p><p><b>  UNIX操作系統(tǒng)</b></p><p><b>  MINIX操作系統(tǒng)</b></p><p><b>  GNU計劃</b></p><p><b&

12、gt;  POSIX標(biāo)準(zhǔn)</b></p><p>  Internet網(wǎng)絡(luò)</p><p>  上面這5點是Linux誕生、發(fā)展和成長過程的五大支柱。UNIX最初的開放源代碼版本為linux提供了實現(xiàn)的基本原理和算法、GNU計劃為linux系統(tǒng)提供了豐富且免費的各種使用工具、POSIX標(biāo)準(zhǔn)的出現(xiàn)為linux提供了實現(xiàn)與標(biāo)準(zhǔn)兼容系統(tǒng)的參考指南、MINIX操作系統(tǒng)為linux的誕生

13、起到了不可忽缺的參考、Internet是linux成長和壯大的必要環(huán)境</p><p>  第1.2節(jié) Linux的使用</p><p><b>  1.2.1. 文件</b></p><p>  在Linux系統(tǒng)中“一切都是文件”,普通文件、設(shè)備文件、管道等都是以目錄的形式存在的。一切的操作都是以文件為基礎(chǔ)的。這是Linux得一大特色,也是L

14、inux設(shè)計上的精巧之處。在Linux系統(tǒng)中,以“.“開始的文件是隱藏文件。</p><p><b>  1.2.2. 目錄</b></p><p>  目錄是一種具有目錄屬性的文件。Linux的目錄為樹形結(jié)構(gòu),且存在唯一的根目錄“/“。根目錄結(jié)構(gòu)和意義入下表:</p><p>  表1- 1 跟目錄結(jié)構(gòu)及意義</p><p

15、>  1.2.3. shell</p><p>  shell作為Linux系統(tǒng)的外殼,為用戶提供使用操作系統(tǒng)的接口。用戶在提示符下輸入的命令都由shell先解釋讓后傳給Linux核心。對用戶而言,不必關(guān)心一個命令式建立在shell內(nèi)部還是一個單獨的程序。同時shell本身就是一個解釋性的程序設(shè)計語言。</p><p>  Linux中有多種shell,其中默認(rèn)使用的是bash,而在

16、嵌入式Linux中則常使用busybox。在命令行執(zhí)行一個程序時,實際上是通過shell來找到這個命令,并執(zhí)行的。除了shell自帶的一些命令,其他的命令就是普通的程序。</p><p><b>  第2章 開發(fā)環(huán)境</b></p><p>  第2.1節(jié) 硬件平臺(開發(fā)板)</p><p>  2.1.1. 開發(fā)板總體結(jié)構(gòu)</p>

17、<p>  本文研究的課題使用的是天嵌科技TQ2440開發(fā)板。開發(fā)板采用Samsung公司ARM9芯片S3C2440作為CPU,采用64MB的SDRAM和256MB Nand Flash+2MB Nor Flash的雙Flash啟動。目標(biāo)板的總體結(jié)構(gòu)如下圖所示:</p><p>  圖2- 1 目標(biāo)板的總體結(jié)構(gòu)</p><p>  2.1.2. 核心板介紹</p>

18、<p>  插針式核心板:采用六層軍工布線設(shè)計,較強的抗震性能,運行程序穩(wěn)定高效;</p><p>  CPU: 采用三星公司的ARM9芯片的S3C2440AL作為CPU,穩(wěn)定運行在400Mhz;</p><p>  SDRAM: 64MB的SDRAM芯片;</p><p>  FLASH: 256MB Nand Flash+ 2MB Nor Flas

19、h 雙Flash啟動;</p><p>  電源:專業(yè)電源芯片提供1.25V給CPU供電,3.3V給核心板供電;</p><p>  Bootloader:采用功能強大的U-BOOT, 支持一鍵USB下載、TFTP網(wǎng)線下載;</p><p>  擴展性:提供多達192腳的擴展接 口,幾乎引出了S3C2440的全部資源,接口均采用2.0間距, 方便客戶二次開發(fā)時購買底

20、板用接口;</p><p>  核心板尺寸: 37mm×78mm。</p><p>  2.1.3. 底板介紹</p><p>  串口: 板載一個五線異步串行口, 波特率最高115200bps,另外擴展出兩個串口, Wince和linux下均提供三串口源碼;</p><p>  網(wǎng)絡(luò)接口:板載100M 網(wǎng)絡(luò)接口, DM9000網(wǎng)卡

21、, 帶聯(lián)接和傳輸指示燈;</p><p>  USB接口:板載USB1. 1 HOST接口,板載USB1. 1 Device接口;</p><p>  SD/MMC接口:板載一個SD卡接口, 可接32GB SD卡;</p><p>  外擴IDE接口:集成在底板的總線接口里面,提供linux驅(qū)動;</p><p>  音頻接口:板載IIS接口

22、芯片UDA1341, 一路立體聲音頻輸出接口可接耳機或音箱,可錄音;</p><p>  LCD和觸摸屏接口: 板上集成了4線電阻式觸摸屏接口的相關(guān)電路;分別有40pin 和50pin LCD接口引出了LCD控制器的全部信號;支持黑白、4級灰度、16級灰度、256色、4096色STN液晶屏, 屏幕分辨率可達到1024*768像素;可接7寸10寸液晶屏;接配套的VGA轉(zhuǎn)接板,實現(xiàn)VGA輸出;</p>

23、<p>  時鐘源: 板載RTC內(nèi)部實時時鐘(帶有后備鋰電池);</p><p>  調(diào)試及下載接口: 板載一個10pinJTAG接口,支持ADS1.2等單步調(diào)試,有配套ADS調(diào)試手冊;</p><p>  復(fù)位電路: 板載一個復(fù)位按鍵, 采用專用復(fù)位芯片進行復(fù)位,穩(wěn)定可靠;</p><p>  電源接口: 5V電源供電, 帶電源開關(guān)指示燈;</p&

24、gt;<p>  AD功能: 板載可調(diào)電阻接到ADC引腳上用來驗證模數(shù)轉(zhuǎn)換;</p><p>  IIC功能: 板載Atmel24C02芯片驗證IIC功能;</p><p>  PWM功能 : 板載測試PWM功能的蜂鳴器;</p><p>  Camera接口:板載攝像頭接口,可接OV9650,實現(xiàn)網(wǎng)絡(luò)監(jiān)控,linux,Wince下均有驅(qū)動支 持;&l

25、t;/p><p>  用戶按鍵: 板載四個用戶按鍵;有驅(qū)動支持,使用外部中斷;</p><p>  板載外擴接口:多達30多位GPIO, 多達10多路中斷,16路數(shù)據(jù)線, 25路地址線,片選信號等;</p><p>  底板尺寸:105mm×128mm。</p><p>  2.1.4. LCD觸摸屏的介紹</p><

26、;p><b>  尺寸:3.5寸</b></p><p>  顯示面積:70.08(H)mm×52.56(V)mm</p><p>  顯示顏色:16.7兆色 (24位)</p><p>  分辨率:320RGB×240(橫屏)</p><p><b>  LED 背光</b&g

27、t;</p><p><b>  對比度:300:1</b></p><p>  亮度:320cd/m2(流明)</p><p>  使用溫度:-20℃到60℃</p><p>  觸摸屏使用次數(shù):超過100,000次</p><p>  響應(yīng)時 間:≤10ms</p><p&

28、gt;  驅(qū)動板自帶兩個接口:40pin的0.5間距的FPC接口和50pin的2.0間距的插針接口;</p><p>  提供5V和3.3V兩種電壓供電,缺省狀態(tài)是3.3V供電.</p><p>  提供接口部分的原理圖,方便您的使用.</p><p>  LCD驅(qū)動板的尺 寸:103mm×83mm</p><p>  第2.2節(jié)

29、交叉開發(fā)環(huán)境</p><p>  2.2.1. 交叉開發(fā)環(huán)境的介紹</p><p>  嵌入式系統(tǒng)是專用的計算機系統(tǒng),由于其處理能力和存儲能力較弱及特殊的處理器結(jié)構(gòu),使嵌入式系統(tǒng)中不能安裝開發(fā)軟件。所以,在進行嵌入式開發(fā)時,往往采用交叉編譯的方式。</p><p>  所謂交叉編譯是指在宿主機(host)中編輯和編譯程序,并在目標(biāo)機(target)中運行由主機編譯得

30、到的可執(zhí)行代碼。</p><p>  2.2.2. 交叉開發(fā)環(huán)境的建立</p><p>  在Windows中安裝虛擬機,并在虛擬機中安裝Ubuntu10.04操作系統(tǒng)</p><p>  在Ubuntu中安裝安裝交叉編譯器arm-linux-xxx</p><p>  Windows中安裝一些工具軟件,如串口通信,F(xiàn)lash下載的軟件等&l

31、t;/p><p>  第3章 U-Boot的研究與移植</p><p>  第3.1節(jié) U-Boot概述</p><p>  U—Boot,全稱Universal Boot Loader,是遵循GPL條款的開放源碼項目,從FADSROM、8xxROM 、PPCBOOT逐步發(fā)展演化而來,其源碼目錄、編譯形式與Linux內(nèi)核很相似。事實上,不少U—Boot源碼就是相應(yīng)Lin

32、ux內(nèi)核源程序的簡化, 尤其是一些設(shè)備的驅(qū)動程序, 從U-Boot源碼的注釋中能體現(xiàn)這一點。但是U-Boot不僅僅支持嵌入式Linux系統(tǒng)的引導(dǎo), 當(dāng)前,它還支持NetBSD。VxWorks、QNX、RTEMS、ARTOS、LynxOS嵌入式操作系統(tǒng)。其目前要支持的目標(biāo)操作系統(tǒng)包括0P enB S D 、NetBSD、FreeBSD、4 4BSD 、Linux、SVR4、Esix、Solaris、Irix、SCO、Dell、NCR、Vx

33、Works、LynxOS、pSOS、QNX、RTEMS 和ARTOS。這是u-Boot中Universal的一層含義。另外一層含義則是U-Boot除了支持PowerPC系列的處理器外,還能支持 MIPS、x86、ARM 、Nios、XScale等諸多常用系列的處理器。這兩個特點正是U-Boot項目的開發(fā)目標(biāo),即支</p><p>  選擇U-Boot的理由:</p><p><b&g

34、t;  開放源碼</b></p><p>  支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS</p><p>  支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale</p><p>  較高的可靠性和穩(wěn)定性</p><p>  高度靈活

35、的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等</p><p>  豐富的設(shè)備驅(qū)動源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等</p><p>  較為豐富的開發(fā)調(diào)試文檔與強大的網(wǎng)絡(luò)技術(shù)支持</p><p>  3.1.1. U-Boot的目錄結(jié)構(gòu)</p><p>  U-

36、Boot的源代碼目錄結(jié)構(gòu)十分清晰,主要的目錄及結(jié)構(gòu)如表3-1所示。</p><p>  表3- 1 U-Boot的代碼結(jié)構(gòu)</p><p>  3.1.2. U-Boot的啟動過程</p><p>  U-Boot的啟動過程可以分為三個階段。首先在Flash中運行匯編程序,將Flash中的啟動代碼部分復(fù)制到SDRAM中,同時創(chuàng)造環(huán)境準(zhǔn)備運行C程序;然后在SDRAM中

37、執(zhí)行,對硬件進行初始化;最后設(shè)置內(nèi)核參數(shù)的標(biāo)記列表,復(fù)制鏡像文件,進入內(nèi)核的入口函數(shù)。以本開發(fā)板為例來做詳細(xì)的說明。</p><p>  在Flash中運行CPU入口函數(shù)/cpu/arm920t/stsrt.s</p><p><b>  具體工作包括:</b></p><p>  設(shè)置異常的入口地址和異常處理函數(shù)</p><

38、;p>  配置PLLCON寄存器,確定系統(tǒng)的主頻</p><p><b>  屏蔽看門狗和中斷</b></p><p><b>  初始化I/O寄存器</b></p><p><b>  關(guān)閉MMU功能</b></p><p>  初始化寄存器空間,設(shè)置刷新頻率</

39、p><p>  將U-Boot的內(nèi)容復(fù)制到SDRAM中</p><p><b>  設(shè)置堆棧的大小</b></p><p>  跳轉(zhuǎn)到SDRAM中執(zhí)行/lib_arm/board.c中的start_armboot()函數(shù)</p><p>  該函數(shù)將完成如下工作:</p><p><b> 

40、 設(shè)置通用端口</b></p><p><b>  設(shè)置處理器類型</b></p><p><b>  設(shè)置啟動參數(shù)地址</b></p><p>  設(shè)置環(huán)境變量,初始化環(huán)境</p><p><b>  設(shè)置串口的波特率</b></p><p&g

41、t;<b>  設(shè)置串口的工作方式</b></p><p>  設(shè)置ID號、每個分頁的起始地址等信息,并將信息送入到相應(yīng)的結(jié)構(gòu)體中</p><p>  設(shè)置SDRAM的起始地址和大小</p><p>  將環(huán)境變量的地址送到全局變量的結(jié)構(gòu)體中</p><p><b>  開啟中斷</b></p

42、><p>  設(shè)置延時等待,從而確定目標(biāo)板是進入下載模式還是裝載鏡像文件啟動內(nèi)核</p><p>  裝載模式下系統(tǒng)將內(nèi)核從Flash和Ramdisk復(fù)制到SDRAM中</p><p>  第3.2節(jié) U-Boot的移植</p><p>  基于此開發(fā)板的U-Boot天嵌已有提供,但從移植的角度考慮,主要修改一下文件(以下目錄是基于天嵌的U-Bo

43、ot):</p><p>  目標(biāo)板的頭文件,位于目錄/include/configs/EmbedSky.h</p><p>  目標(biāo)板的.c源文件,位于目錄/board/EmbedSky/EmbedSky。這是SDRAM的驅(qū)動程序</p><p>  Flash的驅(qū)動程序,位于目錄/board/EmbedSky/flash.c</p><p&g

44、t;  串口驅(qū)動,位于目錄/cpu/arm920t/s3c24x0/serial.c</p><p>  在移植的過程中,有下列一些需要注意的問題:</p><p>  U-Boot移植參考板</p><p>  這是進行U-Boot移植首先要明確的。可以根據(jù)目標(biāo)板上CPU、FLASH、SDRAM的情況,以盡可能相一致為原則,先找出一個與所移植目標(biāo)板為同一個或同一系

45、列處理器的U-Boot支持板為移植參考板。對U-Boot移植新手,建議依照循序漸進的原則,目標(biāo)板文件名暫時先用移植參考板的名稱,在逐步熟悉U-Boot移植基礎(chǔ)上,再考慮給目標(biāo)板重新命名。在實際移植過程中,可用Linux命令查找移植參考板的特定代碼,如grep –r EmbedSky ./ 可確定出在U-Boot中與EmbedSky板有關(guān)的代碼,依此對照目標(biāo)板實際進行屏蔽或修改。同時應(yīng)不局限于移植參考板中的代碼,要廣泛借鑒U-Boot中已

46、有的代碼更好地實現(xiàn)一些具體的功能。</p><p>  U-Boot燒寫地址</p><p>  不同目標(biāo)板,對U-Boot在FLASH中存放地址要求不盡相同。事實上,這是由處理器中斷復(fù)位向量來決定的。也就是說,U-Boot燒寫具體位置是由硬件決定的,而不是程序設(shè)計來選擇的。程序中相應(yīng)U-Boot起始地址必須與硬件所確定的硬件復(fù)位向量相吻合。</p><p>  C

47、PU寄存器參數(shù)設(shè)置</p><p>  根據(jù)處理器系列、類型不同,寄存器名稱與作用有一定差別。必須根據(jù)目標(biāo)板的實際,進行合理配置。一個較為可行和有效的方法,就是借鑒參考移植板的配置,再根據(jù)目標(biāo)板實際,進行合理修改。這是一個較費功夫和考驗?zāi)土Φ倪^程,需要仔細(xì)對照處理器各寄存器定義、參考設(shè)置、目標(biāo)板實際作出選擇并不斷測試。。</p><p><b>  串口調(diào)試</b>&

48、lt;/p><p>  能從串口輸出信息,即使是亂碼,也可以說U-Boot移植取得了實質(zhì)性突破。串口是否有輸出,除了與串口驅(qū)動相關(guān)外,還與FLASH相關(guān)的寄存器設(shè)置有關(guān)。因為U-Boot是從FLASH中被引導(dǎo)啟動的,如果FLASH設(shè)置不正確,U-Boot代碼讀取和執(zhí)行就會出現(xiàn)一些問題。因此,還需要就FLASH的相關(guān)寄存器設(shè)置進行一些參數(shù)調(diào)試。同時,要注意串口收發(fā)芯片相關(guān)引腳工作波形。依據(jù)筆者調(diào)試情況,如果串口無輸出或

49、出現(xiàn)亂碼,一種可能就是該芯片損壞或工作不正常。</p><p>  與啟動 FLASH相關(guān)的寄存器BR0、OR0的參數(shù)設(shè)置</p><p>  應(yīng)根據(jù)目標(biāo)板FLASH的數(shù)據(jù)手冊與BR0和OR0的相關(guān)位含義進行合理設(shè)置。這不僅關(guān)系到FLASH能否正常工作,而且與串口調(diào)試有直接的關(guān)聯(lián)。</p><p><b>  關(guān)于CPLD電路</b></

50、p><p>  目標(biāo)板上是否有CPLD電路絲毫不會影響U-Boot的移植與嵌入式操作系統(tǒng)的正常運行。事實上,CPLD電路是一個集中將板上電路的一些邏輯關(guān)系可編程設(shè)置的一種實現(xiàn)方法。其本身所起的作用就是實現(xiàn)一些目標(biāo)板所需的脈沖信號和電路邏輯,其功能完全可以用一些邏輯電路與CPU口線來實現(xiàn)。</p><p><b>  SDRAM的驅(qū)動</b></p><

51、p>  串口能輸出以后,U-Boot移植是否順利基本取決于SDRAM的驅(qū)動是否正確。與串口調(diào)試相比,這部分工作更為核心,難度更大。MPC8xx目標(biāo)板SDRAM驅(qū)動涉及三部分。一是相關(guān)寄存器的設(shè)置;二是UPM表;三是SDRAM上電初始化過程。任何一部分有問題,都會影響U-Boot、嵌入式操作系統(tǒng)甚至應(yīng)用程序的穩(wěn)定、可靠運行。所以說,SDRAM的驅(qū)動不僅關(guān)系到U-Boot本身能否正常運行,而且還與后續(xù)部分相關(guān),是相當(dāng)關(guān)鍵的部分。<

52、;/p><p><b>  補充功能的添加</b></p><p>  在獲得一個能工作的U-Boot后,就可以根據(jù)目標(biāo)板和實際開發(fā)需要,添加一些其它功能支持。如以太網(wǎng)、LCD、NVRAM等。與串口和SDRAM調(diào)試相比,在已有基礎(chǔ)之上,這些功能添加還是較為容易的。大多只是在參考現(xiàn)有源碼的基礎(chǔ)上,進行一些修改和配置。</p><p>  另外,如果在

53、自主設(shè)計的主板上移植U-Boot,那么除了考慮上述軟件因素以外,還需要排查目標(biāo)板硬件可能存在的問題。如原理設(shè)計、PCB布線、元件好壞。在移植過程中,敏銳判斷出故障態(tài)是硬件還是軟件問題,往往是關(guān)系到項目進度甚至移植成敗的關(guān)鍵,相應(yīng)難度會增加許多。</p><p>  第4章 Linux內(nèi)核的研究與移植</p><p>  Linux內(nèi)核移植是開發(fā)適合于自己特定硬件平臺系統(tǒng)的重要部分,只有在b

54、ootloader引導(dǎo)內(nèi)核啟動之后,才能運行自己的應(yīng)用程序,所以掌握內(nèi)核移植技術(shù)是系統(tǒng)開發(fā)的重要基礎(chǔ)。</p><p>  第4.1節(jié) Linux內(nèi)核結(jié)構(gòu)</p><p>  Linux內(nèi)核主要由5個子系統(tǒng)組成:進程調(diào)度、內(nèi)存管理、虛擬文件系統(tǒng)、網(wǎng)絡(luò)接口、進程間通信。</p><p>  進程調(diào)度模塊(SCHED)用來負(fù)責(zé)控制進程對CPU資源的使用。所采取的調(diào)度策略

55、是各進程能公平合理地訪問CPU,同時保證內(nèi)核能及時地執(zhí)行硬件操作。Linux使用了簡單的基于優(yōu)先級的進程調(diào)度算法選擇新的進程。 </p><p>  內(nèi)存管理模塊(MM)用于確保所有進程能夠安全地共享機器主內(nèi)存,同時,內(nèi)存管理模塊還支持虛擬內(nèi)存管理方式,使得Linux支持進程使用比實際內(nèi)存空間更多的內(nèi)存容量。并可以利用文件系統(tǒng)把暫時不用的內(nèi)存數(shù)據(jù)塊交換到外部存儲設(shè)備上去,當(dāng)需要時再交換回來。 內(nèi)存管理從邏輯上分為

56、硬件無關(guān)部分和硬件有關(guān)部分。硬件無關(guān)部分提供了進程的映射和邏輯內(nèi)存的對換;硬件有關(guān)部分為內(nèi)存管理硬件提供了虛擬接口。</p><p>  文件系統(tǒng)模塊(VFS)用于支持對外部設(shè)備的驅(qū)動和存儲。虛擬文件系統(tǒng)模塊通過向所有的外部存儲設(shè)備提供一個通用的文件接口,隱藏了各種硬件設(shè)備的不同細(xì)節(jié)。從而提供并支持與其他操作系統(tǒng)兼容的多種文件系統(tǒng)格式。 </p><p>  進程間通信模塊子系統(tǒng)(IPC)

57、用于支持多種進程間的信息交換方式。 </p><p>  網(wǎng)絡(luò)接口模塊(NET)提供對多種網(wǎng)絡(luò)通信標(biāo)準(zhǔn)的訪問并支持許多網(wǎng)絡(luò)硬件。 網(wǎng)絡(luò)接口可分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動程序。網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實現(xiàn)每一種可能的網(wǎng)絡(luò)傳輸協(xié)議;網(wǎng)絡(luò)設(shè)備驅(qū)動程序負(fù)責(zé)與硬件設(shè)備通訊,每一種可能的硬件設(shè)備都有相應(yīng)的設(shè)備驅(qū)動程序。</p><p>  圖4- 1 Linux內(nèi)核系統(tǒng)模塊結(jié)構(gòu)及相互依賴關(guān)系</p>

58、<p>  由上圖可以看出,所有的模塊都與進程調(diào)度模塊存在依賴關(guān)系。因為它們都需要依靠進程調(diào)度程序來掛起(暫停)或重新運行它們的進程。通常,一個模塊會在等待硬件操作期間被掛起,而在操作完成后才可繼續(xù)運行。例如,當(dāng)一個進程試圖將一數(shù)據(jù)塊寫到軟盤上去時,軟盤驅(qū)動程序就可能在啟動軟盤旋轉(zhuǎn)期間將該進程置為掛起等待狀態(tài),而在軟盤進入到正常轉(zhuǎn)速后再使得該進程能繼續(xù)運行。另外3個模塊也是由于類似的原因而與進程調(diào)度模塊存在依賴關(guān)系。</

59、p><p>  其他幾個模塊的依賴關(guān)系有些不太明顯,太同樣也很重要。進程調(diào)度子系統(tǒng)需要使用內(nèi)存管理來調(diào)整一特定進程所使用的物理內(nèi)存空間。進程通信子系統(tǒng)則需要依靠內(nèi)存管理器來支持共享內(nèi)存通信機制。這種通信機制允許兩個進程訪問內(nèi)存的同一區(qū)域以進行進程間信息的交換。虛擬文件系統(tǒng)也會使用網(wǎng)絡(luò)接口來支持網(wǎng)絡(luò)文件系統(tǒng)(NFS),同樣也能使用內(nèi)存管理子系統(tǒng)提供內(nèi)存虛擬盤(ramdisk)設(shè)備。而內(nèi)存管理子系統(tǒng)也會使用文件系統(tǒng)來支持

60、內(nèi)存數(shù)據(jù)塊的交換操作。</p><p>  除了這些依賴關(guān)系外,內(nèi)核中的所有子系統(tǒng)還要依賴于一些共同的資源。這些資源包括所有子系統(tǒng)都會調(diào)用的內(nèi)存分配和回收函數(shù)、打印警告或出錯信息函數(shù)以及一些系統(tǒng)調(diào)試函數(shù)。從單內(nèi)核的角度可以把內(nèi)核結(jié)構(gòu)描述成如圖4-2所示的結(jié)構(gòu)框圖。</p><p>  圖4- 2 Linux內(nèi)核結(jié)構(gòu)框圖</p><p>  第4.2節(jié) Linux內(nèi)核

61、的編譯</p><p>  Linux源代碼只有經(jīng)過編譯之后,才能在開發(fā)板上運行,下面詳述具體內(nèi)容。</p><p>  4.2.1. 編譯準(zhǔn)備</p><p>  從http://www.kernel.org/pub/linux/kernel/v2.6/網(wǎng)址中下載linux-2.6.30.4.tar.bz2內(nèi)核到到工作目錄中進行解壓,進入解壓后的工作目錄。<

62、/p><p>  用vi打開目錄下的Makefile,指明交叉編譯器</p><p>  #vi Makefile</p><p>  在193行“ARCH ?= (SUBARCH)”和194行“CROSS_COMPILE ?=”將其改為:</p><p>  ARCH=arm</p><p>  CROSS_COMP

63、ILE=arm-linux-</p><p>  設(shè)置PATH環(huán)境變量,使其可以找到交叉編譯工具鏈(我的交叉編譯工具在~/kernel/embedsky/opt/EmbedSky/4.3.3/bin下)</p><p>  export PATH=$PATH:~/kernel/embedsky/opt/EmbedSky/4.3.3/bin</p><p>  修

64、改平臺的時鐘頻率,以滿足開發(fā)板的工作頻率。修改文件arch/arm/mach-s3c2440/math-smdk2440.c的163行,把16934400改為12000000,因為開發(fā)板使用的就是12MHz的外部時鐘源輸入。</p><p>  TQ2440開發(fā)板使用的uboot中設(shè)定了機器碼為168,所以內(nèi)核中需要修改機器碼,否側(cè)會出現(xiàn)不能啟動的情況。機器碼保存在內(nèi)核源代碼的“arch/arm/tools/ma

65、ch-types”文件中,在379行,把原來的362改為168保存即可。</p><p>  4.2.2. Nand Flash驅(qū)動移植</p><p>  進行Nand Flash的移植,其實Linux里面已經(jīng)做好了Nand Flash的驅(qū)動,我們只需要就行修改就可以進行使用了。</p><p>  修改內(nèi)核源碼“arch/arm/plat-s3c24xx/com

66、mon-smdk.c”文件,在文件的109行有一個結(jié)構(gòu)體名為:smdk_default_nand_part[],記載了Nand Flash的分區(qū)信息,將其修改為如下所表示:</p><p>  static struct mtd_partition smdk_default_nand_part[]={</p><p><b>  [0] = {</b></p&g

67、t;<p>  .name=“uboot”,</p><p>  .offset=0x00000000,</p><p>  .size=0x00040000,</p><p><b>  },</b></p><p><b>  [1] = {</b></p>

68、<p>  .name=“kernel”,</p><p>  .offset=0x00200000,</p><p>  .size=0x00200000,</p><p><b>  },</b></p><p><b>  [2] = {</b></p>

69、<p>  .name=“yaffs2”,</p><p>  .offset=0x00400000,</p><p>  .size=0x0FB80000,</p><p><b>  }</b></p><p><b>  };</b></p><p&

70、gt;  修改Nand Flash的讀寫匹配時間,修改common-smdk.c文件修改前165行的smdk_nand_info結(jié)構(gòu)體,修改內(nèi)容如下:(這部分不做也可)</p><p>  static struct s3c2410_platform_nand smdk_nand_info = {</p><p>  .tacls= 10,</p><p> 

71、 .twrph0= 25,</p><p>  .twrph1= 10,</p><p>  .nr_sets= ARRAY_SIZE(smdk_nand_sets),</p><p>  .sets= smdk_nand_sets,</p><p><b>  };</b></p>

72、<p>  修改內(nèi)核源代碼“drivers/mtd/nand/Kconfig”文件,添加對各種容量Nand Flash的支持,在165行處添加如下內(nèi)容:</p><p><b>  choice</b></p><p>  prompt“Nand Flash Capacity select”</p><p>  depends o

73、n MTD</p><p><b>  help</b></p><p>  EmbedSky Board Nand Flash Capacity select</p><p>  config EmbedSky_more_than_256MB_NAND</p><p>  boolean“256MB~1G Nand

74、for Board”</p><p>  depends on MTD</p><p><b>  help</b></p><p>  Set 256MB~1GB Nand parts</p><p><b>  endchoice</b></p><p>  4.2.3.

75、 配置內(nèi)核</p><p>  Linux內(nèi)核是一個社區(qū)共同開發(fā)的作品,具備一個現(xiàn)代操作系統(tǒng)的所有功能,并能對絕大多數(shù)硬件提供支持。然而對于具體的開發(fā)板來說,大多數(shù)功能并不需要,為了盡可能減少編譯出來的內(nèi)核體積,在配置內(nèi)核時,對需要的功能進行配置和去除不需要的模塊是主要內(nèi)容。</p><p>  運行 make menuconfig,進入配置菜單界面,如下圖所示:</p>&

76、lt;p>  圖4- 3 配置菜單</p><p>  利用默認(rèn)配置單做自己的配置單</p><p>  這里推薦的一種做法,就是先調(diào)用自帶的一個默認(rèn)配置單,該配置單在內(nèi)核源代碼的“arch/arm/configs/”目錄下面,名為:“s3c2410_defconfig”,改配置文件里面選擇了幾乎所有的和s3c24xx系列CPU相關(guān)的配置選項,我們完全可以在該配置單的基礎(chǔ)上進行配置。

77、</p><p>  在配置菜單中選擇選項:“Load an Alternate Configuration File”,然后調(diào)用剛剛說到的那個配置文件,如圖4-4::</p><p><b>  圖4- 4</b></p><p>  然后進入到如圖4-5所示的界面,輸入剛剛提到的路徑和配置文件名稱回車即可:</p><p

78、>  圖4- 5 加載配置文件</p><p>  然后返回到配置界面,進入到“System Type”選項下的配置單,如圖4-6:</p><p>  圖4- 6 system type選項卡</p><p>  然后對平臺進行配置,如下所示:</p><p>  System type ---></p><

79、p>  S3C2410 Machines ---></p><p>  [*] SMDK 2410/A9M410</p><p>  [ ] IPAQ H1940</p><p>  [ ] Acer N30 family</p><p>  [ ] Simtec Electronics BAST (EB2410ITX)</

80、p><p>  [ ] NexVision OTOM Board</p><p>  [ ] AML M5900 Series</p><p>  [ ] BAST PC104 IRQ support</p><p>  [ ] TCT Hammer Board</p><p>  [ ] Thorcom VR1000&l

81、t;/p><p>  [ ] QT2410</p><p>  S3C2412 Machines ---></p><p>  [ ] SMDK2413</p><p>  [ ] SMDK2412</p><p>  [ ] VMSTMS</p><p>  S3C2440 Machines

82、 ---></p><p>  [ ] Simtec Electronics ANUBIS</p><p>  [ ] Simtec IM2440D20 (OSIRIS) module</p><p>  [ ] HP iPAQ rx3715</p><p>  [*] SMDK2440</p><p>  [

83、] NexVision NEXCODER 2440 Light Board</p><p>  [*] SMDK2440 with S3C2440 CPU module</p><p>  S3C2442 Machines ---></p><p>  [ ] SMDK2440 with S3C2442 CPU module</p><p&

84、gt;  S3C2443 Machines ---></p><p>  [ ] SMDK2443</p><p>  配置完畢這個地方后,退回到最初的配置單。再在配置單中添加上對Nand Flash支持的配置選項,配置如下:</p><p>  Device Drivers ---></p><p>  <*> Me

85、mory Technology Device (MTD) support ---></p><p>  [*] MTD partitioning support</p><p>  <*> RedBoot partition table parsing</p><p>  [ ] Command line partitiontable parsin

86、g</p><p>  <*> Direct char device access to MTD devices</p><p>  -*- Common interface to block layer for MTD devices</p><p>  <*> Caching block device access to MTD devi

87、ces</p><p>  <*> NAND Device Support ---></p><p>  [*] NAND Flash support for S3C2410/S3C2440 SoC</p><p>  [*] S3C2410 NAND Hardware ECC</p><p>  Nand Flash Ca

88、pacity select (256MB~1GB Nand for Board) ---></p><p>  (X) 256MB~1GB Nand for EmbedSky Board</p><p>  配置好后,選擇選項“Save an Alternate Configuration File”將其保存為:“.config”文件,因為編譯系統(tǒng)時會調(diào)用該文件,如圖4-7、4-8所

89、示:</p><p><b>  圖4- 7</b></p><p><b>  圖4- 8</b></p><p>  保存為“.config”文件后,退出配置單。</p><p>  4.2.4. 編譯鏡像</p><p>  然后輸入:#make zImage,就可以進

90、行編譯了,編譯完畢后,會在內(nèi)核源碼的“arch/arm/boot/”目錄下面生成名為“zImage”的 ,不過在此之前還需要對相關(guān)文件系統(tǒng)的支持,請見下章。</p><p>  第5章 文件系統(tǒng)的移植與制作</p><p>  第5.1 節(jié) yaffs文件系統(tǒng)的研究與移植</p><p>  YAFFS(Yet Another Filing System)是第一個專

91、門為NAND Flash存儲器設(shè)計的嵌入式文件系統(tǒng),適用于大容量的存儲設(shè)備;并且是在GPL(General Public License)協(xié)議下發(fā)布的,可在其網(wǎng)站http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/免費獲得源代碼。</p><p>  在內(nèi)核中添加對yaffs的支持</p><p>  得到補丁包后,解壓補丁,然后打上yaffs2的補丁,

92、在解壓縮后進入源碼目錄執(zhí)行:</p><p>  #./patch-ker.shc~/opt/EmbedSky/linux-2.6.30.4/</p><p>  注:c后面為你內(nèi)核的目錄。</p><p>  此時到內(nèi)核源代碼的“fs/”目錄下面添加了一個名為“yaffs2”的目錄,同時fs目錄下面的“Makefile”文件和“Kconfig”文件也添加了ya

93、ffs2的配置和編譯條件。</p><p>  在配置單中添加對yaffs的支持</p><p>  執(zhí)行#make menuconfig,進入配置單,對File system選項進行如下配置:</p><p>  File system ---></p><p>  < > Second extended fs suppo

94、rt</p><p>  < > Ext3 journalling file system support</p><p>  < > Kernel automounter support</p><p>  < > Kernel automounter version 4 support (also support v3)<

95、;/p><p>  < > Filesystem in Userpace support</p><p>  CD-ROM/DVD Filesystems ---></p><p>  <*> ISO 9660 CDROM file system support</p><p>  [ ] Microsoft Jol

96、iet CDROM extensions</p><p>  [ ] Transparent decompression extension</p><p>  < > UDF file system support</p><p>  DOS/FAT/NT Filesystems ---></p><p>  <*&

97、gt; MSDOS fs support</p><p>  <*> VFAT(Windows-95) fs support</p><p>  (437) Default codepage for FAT</p><p>  (iso8859-1) Default iocharset for FAT</p><p>  <

98、 > NTFS file system support</p><p>  Pseudo filesystem</p><p>  [*] Virtual memory file system support(former shm fs)</p><p>  [ ] Tmpfs POSIX Access Control Lists</p><

99、;p>  <*> Userspace-driven configuration filesystem</p><p>  Miscellaneous filesystems ---></p><p>  <*> YAFFS2 file system support</p><p>  -*- 512 byte/page devic

100、es</p><p>  [ ] Use older-style on-NAND data format with pageStatus byte</p><p>  [ ] Lets Yaffs do its own ECC</p><p>  -*- 2048 byte(or larger)/page devices</p><p>  

101、[*] Autoselect yaffs2 format</p><p>  [ ] Disable lazy loading</p><p>  [ ] Turn off wide tnodes</p><p>  [ ] Force chunk erase check</p><p>  [ ] Cache short names in

102、RAM</p><p>  -*- Native language support ---></p><p>  --- Native language support</p><p>  (iso8859-1) Default NLS Option</p><p>  <*> Codepage 437 (United St

103、ates, Canada)</p><p>  <*> Simplified Chinese charset(CP936, GB2312)</p><p>  <*> NLS ISO 8859-1 (Latin 1;Western European Languages)</p><p>  <*> NLS UTF-8</p&

104、gt;<p>  配置好之后,保存配置單位“.config”文件后,編譯出鏡像。</p><p>  第5.2 節(jié) 文件系統(tǒng)的制作</p><p>  5.2.1. 編譯Busybox</p><p>  制作文件系統(tǒng),首先需要用busybox編譯出文件系統(tǒng)所需要的應(yīng)用程序,然后我們再做文件系統(tǒng)。</p><p>  獲取Bus

105、ybox源碼</p><p>  Busybox的源代碼可在網(wǎng)址http://www.busybox.net/downloads/獲得,本人使用的是最新版busybox-1.18.3.tar.bz2,解壓縮到自己的目錄,并進入busybox的主目錄。</p><p>  修改并配置Busybox</p><p>  修改Makefile文件,將編譯器和平臺改成我們所

106、使用的,如下:</p><p>  CROSS_COMPILE = arm-linux-</p><p>  ARCH = arm</p><p>  然后輸入:#make menuconfig,進入配置菜單:</p><p>  圖5- 1 busybox配置菜單</p><p>  Busybox Settings

107、 ---></p><p>  Build Option ---></p><p>  [*]Build Busybox as a static binary (no shared libs)</p><p>  這個選項是一定要選擇的,這樣才能把busybox編譯成靜態(tài)的可執(zhí)行文件,運行時才獨立于其他函數(shù)庫。否則必須要其他庫文件才能運行,在單一個lin

108、ux內(nèi)核不能使他正常工作。</p><p>  Busybox Settings ---></p><p>  Installation Options (“make install” behavior) ---></p><p>  (./_install) Busybox installation prefix</p><p>

109、;  這個選項是設(shè)置make install后,busybox的安裝目錄,這里默認(rèn)是放在_install目錄下。</p><p>  其余的選項使用默認(rèn)的配置即可,選擇“Save Configuration to an Alternate”保存并退出。</p><p>  編譯并安裝Busybox</p><p>  執(zhí)行指令:#make;makeinstall進行

110、Busybox的編譯,編譯完成后會在busybox-1.18.3目錄中生成一個名為“_install”的目錄,里面存放著一些可執(zhí)行的文件,目錄圖5-2:</p><p>  圖5- 2 _install目錄</p><p>  完成busybox的編譯之后,我們就可以進行文件系統(tǒng)的構(gòu)建了。</p><p>  5.2.2. 文件系統(tǒng)的構(gòu)建</p>&l

111、t;p><b>  構(gòu)建框架</b></p><p>  建立一個名為“root_2.6.30.4”的目錄,將busybox編譯出來的“_install”目錄下的所有文件拷貝到該目錄下,然后新建“dev”、“mnt”、“opt”、“proc”、“root”、“sys”、“temp”、“var”和“web”目錄,同時在原有的“usr”目錄下面新建一個“l(fā)ib”和“share”目錄。<

112、;/p><p><b>  添加內(nèi)容</b></p><p><b>  “dev”目錄:</b></p><p>  下面的內(nèi)容在內(nèi)核掛載完畢文件系統(tǒng)后,系統(tǒng)會使用mdev自動建立。不過mdev是調(diào)用init進程來啟動的,在使用mdev構(gòu)建“dev”目錄前,init進程需要用到“/dev/console/”和“/dev/nu

113、ll”這兩個設(shè)備文件,所以,我們需要在制作文件系統(tǒng)時靜態(tài)創(chuàng)建這兩個設(shè)備文件,在“dev”目錄下執(zhí)行:</p><p>  #mknod console c 5 1</p><p>  #mknod null c 1 3</p><p><b>  “etc”目錄:</b></p><p>  用來存放系統(tǒng)的配置文件。在“

114、etc/”目錄下面需要建立的文件:</p><p>  fstab:指明需要掛載的文件系統(tǒng);</p><p>  profile:用戶環(huán)境配置文件;</p><p>  inittab:init進程的配置文件;</p><p>  init.d目錄:啟動文件目錄,該目錄下面有個“rc”,里面存放了系統(tǒng)啟動時配置以及自啟動加載的進程等;<

115、/p><p>  resolv.conf:存放DNS信息的文件,訪問外網(wǎng)時需要DNS的信息。</p><p>  配置文件可以從建立好的文件系統(tǒng)中直接拷貝。其它的目錄大都為空目錄,或是從已經(jīng)存在的文件系統(tǒng)中直接拷貝。</p><p>  到這里,文件系統(tǒng)的框架就基本搞好了,然后使用制作yaffs文件系統(tǒng)的軟件,把它做出yaffs文件系統(tǒng)的鏡像就可以使用了。使用如下命令制

116、作:</p><p>  #mkyaffs2image root_2.6.30.4 root_2.6.30.4.bin</p><p>  到此文件系統(tǒng)已經(jīng)制作完畢,把制作好的鏡像文件root_2.6.30.4.bin復(fù)制出來,燒寫到開發(fā)板中,就可以運行了。</p><p><b>  結(jié)論</b></p><p>  

117、嵌入式linux的移植涉及到啟動程序u-boot的移植、linux內(nèi)核的移植、以及文件系統(tǒng)的制作。編譯完成各部分之后還需對目標(biāo)板進行燒寫,按照順序燒寫u-boot、linux內(nèi)核、文件系統(tǒng)到flash中。本文作者經(jīng)過多次試驗失敗之后,終于成功的在S3C2440開發(fā)板上移植了Linux系統(tǒng)。完成了時下熱門的ARM+Linux的嵌入式系統(tǒng)的移植。系統(tǒng)建立好后我們就可以根據(jù)需要在系統(tǒng)上面進行驅(qū)動的開發(fā)和上層應(yīng)用程序的開發(fā)。我們現(xiàn)在所移植的系統(tǒng)

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論