vxworks引導(dǎo)啟動過程_第1頁
vxworks引導(dǎo)啟動過程_第2頁
vxworks引導(dǎo)啟動過程_第3頁
vxworks引導(dǎo)啟動過程_第4頁
vxworks引導(dǎo)啟動過程_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、一 基本概念及引導(dǎo)概述1 bootloader/bootrom/bootstrapCPU上電經(jīng)自復(fù)位的過程(由硬件時序邏輯決定的Power-On StrappingSequence)后,指令指針指向一個固定的地址(after-reset startingpoint)。這個固定地址因體系架構(gòu)而異:在一個基于 ARM7TDMI core 的嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時通常都從地址0x00000000 處開始執(zhí)行;在一個MIPS體系架構(gòu)的嵌入式系統(tǒng)中,系統(tǒng)在上電或復(fù)位時通常都從地址0xBFC00000(0x1FC00000)處開始執(zhí)行。無論是ARM中的0x00000000,還是MIPS中的0x1

2、FC00000,這個入口地址處往往存放的就是系統(tǒng)的Boot Loader程序。這個地址往往映射(可參考具體datasheet的Memory Map)為Boot Rom的地址空間,這里的Boot Rom通常為NOR Flash或者SPI Flash(早期的可能為EEPROM等非易失性存儲介質(zhì))。由此可見,bootloader(引導(dǎo)加載程序)是系統(tǒng)上電后運行的第一段軟件代碼。bootrom則是用來存儲bootloader的ROM/Flash芯片。當然bootrom(ROM/Flash)上不僅僅只是存儲bootloader,往往還存儲著系統(tǒng)映像、應(yīng)用程序資源和用戶配置數(shù)據(jù)等信息。這樣,嵌入式設(shè)備每次

3、重新上電后,總能加載系統(tǒng)和恢復(fù)上一次的配置。因為嵌入式設(shè)備中往往沒有配備磁盤,SDRAM又是易失的,因此bootrom上往往還存放著系統(tǒng)映像等數(shù)據(jù)(可能是壓縮的)。在嵌入式系統(tǒng)中,通常沒有像BIOS那樣的固件程序(注,有的嵌入式CPU也會內(nèi)嵌一段短小的啟動微碼),因此整個系統(tǒng)的加載啟動任務(wù)就完全由Boot Loader來完成。此時,CPU只認得指令,因此bootloader一般以純匯編指令開始,而不應(yīng)該包含任何ELF格式的文件頭信息(這些信息只有特定OS才能識別)。bootstrap是bootloader的一部分,是最初級的引導(dǎo),旨在初始化CPU、內(nèi)存控制器、時鐘、堆棧,目標是讓CPU正常運作

4、起來。我們可以認為bootloader = bootstrap program + boot image。boot image往往初始化最小OS內(nèi)核,搭建網(wǎng)絡(luò)下載通道,提供一個可以交互的命令行,以便自我更新(update boot)或下載更新系統(tǒng)映像(update vxWorks)。bootloader通常都分為Stage1和Stage2兩個階段,這里的bootstrap program對應(yīng)Stage1,boot image則對應(yīng)Stage2。下面從代碼構(gòu)成角度入手,闡述VxWorks下的bootstrap program和boot image的含義。在vxWorks中,若含有bootlade

5、r(即下文提到的Boot Image + Loadable Image組合類型),則bootstrap program主要是指romInit.s+bootInit.c,boot image主要是指有bootConfig.c、sysAlib.s、sysLib.c以及BSP目錄下的其他文件編譯鏈接而成。通常為了節(jié)省空間,boot image部分被壓縮作為數(shù)據(jù)段存儲在bootstrap program之后bootrom.bin。bootstrap program是在ROM/Flash中運行的,當然為了執(zhí)行更快,其后半部分也可能拷貝到RAM中執(zhí)行。很顯然,bootstrap program是不能壓縮的

6、,否則無法完成自舉。對于沒有bootloader的引導(dǎo)型映像(即下文提到的ROM-based Image類型,vxWorks_rom*.bin),其固化在ROM/Flash的第一部分bootstrap program可能有romInit.s+romStart.c組成,后面無boot image,緊隨其后的為vxWorks映像(可能被壓縮)。2 vxWorks的bootrom類型bootrom的類型前綴或后綴說明bootrom壓縮的bootrom映像(除bootstrap代碼外)bootorm_uncmp非壓縮的bootrom映像bootrom_resROM駐留型的bootrom映像無后綴ELF

7、可執(zhí)行文件格式.hexMotorola S-record文件格式.bin裸的二進制格式(一般燒到ROM/Flash零地址處)3 引導(dǎo)流程概述系統(tǒng)上電后,CPU開始從預(yù)先安排的地址上開始執(zhí)行一段指令,這段指令的作用首先是將可執(zhí)行程序所需的最小環(huán)境搭建起來。這個初始化過程包括初始化CPU、內(nèi)存控制器及各種必需輸入/輸出設(shè)備、磁盤控制器等等。以X86體系結(jié)構(gòu)來說,需要初始化CPU、北橋、南橋,常說的BIOS就是這樣一段初始化程序。在那些沒有BIOS的架構(gòu)中,這一工作由系統(tǒng)的bootloader完成。建立了最小可運行系統(tǒng),操作系統(tǒng)的內(nèi)核就可以運行了。于是,BIOS或bootloader程序?qū)⒉僮飨到y(tǒng)從

8、能夠永久保存內(nèi)容的存儲介質(zhì)中讀取出來加載到內(nèi)存中。這些可永久保存內(nèi)容的存儲介質(zhì)可能是NVROM、磁盤、光盤等,例如我們常說的操作系統(tǒng)光盤。通常,操作系統(tǒng)在加載過程中還會對硬件環(huán)境做一次重新初始化,這一次初始化就不僅僅是最小運行環(huán)境了。包括CPU在內(nèi)的全部計算機所包含的硬件都會被操作系統(tǒng)依次初始化,同時初始化的還包括操作系統(tǒng)內(nèi)核本身。這樣,整個系統(tǒng)就處于一種可控狀態(tài),可以開始執(zhí)行用戶應(yīng)用程序了。從引導(dǎo)到系統(tǒng)啟動是一個bottom-up的過程;啟動后,用戶交互到系統(tǒng)響應(yīng)則是一個top-down的過程。 二 VxWorks映象1 VxWorks映象的組成VxWorks映象由文本段(.tex

9、t/.code),數(shù)據(jù)段(.data)和BSS段(.bss)組成。文本段相當于代碼段,是由一些指令組成的;數(shù)據(jù)段就是由一些初始化過的全局和靜態(tài)變量組成;BSS段也是由全局變量和靜態(tài)變量組成,只不過他們都沒有經(jīng)過初始化。2 VxWorks映象的類型(1).VxWorks(Loadable binary VxWorks image)RAM based VxWorks image, linked to RAM_LOW_ADRS. It is loaded into RAM via some external program such as abootROM.This is the

10、 default development image.(2).vxWorks_rom(Uncompressed ROMable binary VxWorks image)RAM based image that starts in ROM. The ROM startup code copies the entireimage to RAM and then jumps to it. This image generally has a slower startup time, but faster execution time, than vxWorks_romResident.(

11、3).vxWorks_romCompress(compressed ROMable binary VxWorks image)Compressed RAM based image thatstartsin ROM. This image can fit almost twice the code as other ROM images.But it has the slowest boot time, since the image must be uncompressed. The run-time speed is the same as for vxWorks_rom.(4).

12、vxWorks_romResident(ROM-resident version binary VxWorks image)ROM resident image. The program textremains in ROM, only the data iscopied to RAM. This image has the fastest boot time and uses the least amount of RAM, but runsslower on boards with slow ROM access.相關(guān)后綴的含義同bootrom。我們可將VxW

13、orks Image的文件類型劃分為兩類三種:A加載型映象(VxWorks類型)(1)Loadable Image是包含用戶程序的VxWorks操作系統(tǒng)映象,其不具備引導(dǎo)功能,需要借助bootloader引導(dǎo)程序通過網(wǎng)口或串口下載到RAM中。bootloader在此扮演了“搬運工”的角色。B可引導(dǎo)型映象可引導(dǎo)型(Bootable)映象包含含有用戶程序的VxWorks操作系統(tǒng)映象,并包括完整的引導(dǎo)代碼,可以在系統(tǒng)上電后自動完成自身的引導(dǎo)。我們在前面已經(jīng)分析過,該類映像往往由bootstrap program(romInit.s+romStart.c)和緊隨其后的為vxWorks映像(可能被壓縮)

14、組成。(2)ROM-based Image(壓縮/沒有壓縮):即將Image直接燒入ROM/flash,運行時將Image拷入(如果壓縮則需解壓)RAM中運行。(3)ROM-resident Image:Image的指令部分駐留在ROM中運行,僅將數(shù)據(jù)段部分拷入RAM。注意,以上三種映象都是包含完整VxWorks操作系統(tǒng)的映象,其中后兩種可以直接啟動并運行起來,但是第一種不行,它必須借助另一個叫做Boot Image的映象(可以在Tornado中的build->build bootrom中生成)才能運行起來,也就是利用Boot Image引導(dǎo)起來后通過網(wǎng)口或串口下載真正包含VxWorks

15、的Loadable Image,然后才能運行起來。也即Boot Image往往和Loadable Image結(jié)合起來使用。現(xiàn)在看來一共有四種映象文件,讓我們看看它們的組成:(1)Boot Image:包含一段起始引導(dǎo)程序(BootStrap Program)和一段ROM引導(dǎo)程序(ROM Boot Program)。(2)Loadable Image:由操作系統(tǒng)VxWorks和應(yīng)用組成的映象。(3)ROM-based Image(壓縮/沒有壓縮):包含一段叫做BootStrap Program的程序+Loadable Image(即有操作系統(tǒng)VxWorks和應(yīng)用組成的映象)。(4)ROM-Res

16、ident Image:同上。通過上面我們可以看出,ROM-based Image,ROM-Resident Image,Boot Image三種映象都包含一段叫做BootStrap Program的程序,可以把ROM引導(dǎo)程序的代碼段和數(shù)據(jù)段拷貝到RAM中。同時,它具有啟動功能。 三 VxWorks映象啟動流程下面讓我們看看三種VxWorks的啟動過程:1 BootImageLoadableImage注意:這里和下文的Boot Image是指存放在bootrom中的bootloader映像。前面提到LoadableImage是依靠Boot Image加載啟動的,首先由Boot Ima

17、ge中的BootStrap Program程序把ROM引導(dǎo)程序(ROM Boot Program)加載(如果壓縮則需解壓)到RAM中的RAM_HIGH_ADRS處,然后跳轉(zhuǎn)到此處執(zhí)行ROM引導(dǎo)程序,由ROM引導(dǎo)程序負責一系列簡單的硬件初始化(網(wǎng)口,串口等),開始下載Loadable Image(即包含應(yīng)用的VxWorks操作系統(tǒng))到RAM_LOW_ADRS,然后跳轉(zhuǎn)到此處啟動VxWorks操作系統(tǒng)。下面的圖一是一個簡單的流程圖,后面的圖二是更為詳細的流程圖。圖一圖二(1)圖二(2)引導(dǎo)過程成功以后,RAM中ROM引導(dǎo)程序占用的空間(從RAM_HIGH_ADRS開始)可以重新被系統(tǒng)利用。2 RO

18、M-basedImage(壓縮/沒有壓縮)這種映象由起始引導(dǎo)程序(BootStrap Program)和基于ROM的VxWorks映象組成。因此,這種bootrom的體積較大。BootStrap Program把基于ROM的VxWorks映象加載到內(nèi)存的RAM_LOW_ADRS處,然后直接啟動VxWorks操作系統(tǒng)(如果壓縮則需解壓)。圖三是一個簡圖,圖四是更為詳盡的流程圖。圖三圖四3 ROM-residentImage這種映象由起始引導(dǎo)程序(BootStrap Programs)和駐留ROM的VxWorks映象組成。VxWorks系統(tǒng)文本段(代碼段)駐留在ROM,搬移程序負責將data段和b

19、ss段搬移到內(nèi)存的RAM_LOW_ADRS處,直接啟動VxWorks映像(含符號表)。此時,RAM_LOW_ADRS是VxWorks映象的加載點,也是VxWorks數(shù)據(jù)段的起始點。 四 VxWorks映象函數(shù)級啟動過程上一節(jié)主要是從映象的分類和各種映象的大致加載流程上看VxWorks的啟動過程,這一節(jié)讓我們從函數(shù)級看一下VxWorks的啟動過程。1 BootImageLoadableImageVxWorks借鑒了傳統(tǒng)PC操作系統(tǒng)的引導(dǎo)原理,其將整個引導(dǎo)過程分為兩個階段:1.1 BOOTROM啟動起始引導(dǎo)程序(BootStrap Program)駐留在ROM中,主要包含:(1)匯編級的

20、硬件初始化程序romInit.s,用于系統(tǒng)的基本初始化,設(shè)置一些重要寄存器的初始值,進行存儲器的映射(2)搬移程序bootInit.c,將ROM引導(dǎo)程序拷貝至RAM的高端地址RAM_HIGH_ADRS,然后跳轉(zhuǎn)到此處執(zhí)行ROM引導(dǎo)程序。ROM引導(dǎo)程序運行,將可加載的VxWorks映象下載到內(nèi)存的指定地址RAM_LOW_ADRS處。1.2 啟動VxWorks內(nèi)核下面是具體的流程圖:圖五其中第一階段的執(zhí)行流程使用的是上圖的左邊的源文件中的那些函數(shù)(romInit->romStart->usrInit->sysHwinit->usrKernelinit->usrRoot

21、);第二階段執(zhí)行流程使用的是上圖中右邊源文件中的那些函數(shù)(sysInit->usrInit->sysHwinit->usrKernelinit->usrRoot->usrAppInit)。下面具體解釋:Stage 1:(1)romInit.s : romInit() /*entry point for VxWorks in ROM*/系統(tǒng)上電之后,首先調(diào)用的函數(shù)就是romInit(),其主要完成兩個操作:將CPU設(shè)置為正確的工作狀態(tài),包括各個寄存器的值以及CPU的工作模式;初始化系統(tǒng)內(nèi)存并建立堆棧。由于需要設(shè)置CPU模式,所以這里的代碼必須由匯編代碼完成

22、,并且匯編也是建立堆棧的唯一選擇。 禁止中斷,避免陷入不確定混亂狀態(tài)。 清除cache。 初始化CPU基本寄存器,調(diào)用SDRAM初始化函數(shù)初始化UPM。 初始化系統(tǒng)堆棧,在內(nèi)存中建立起堆棧后,系統(tǒng)就具備了高級語言的執(zhí)行條件。后面的代碼可以用C實現(xiàn)。 把啟動類型(冷啟動/熱啟動)放在堆棧上。 直接跳轉(zhuǎn)到bootInit.c : romStart()(2)bootInit.c : romStart()/*generic ROM initialization*/這是VxWorks中所執(zhí)行的第一段C語言代碼,但仍在ROM中執(zhí)行。 把

23、ROMBoot Program的代碼段和數(shù)據(jù)段從ROM復(fù)制到RAM中。 完成程序映象的解壓縮(如果映象是壓縮版本的)。 跳轉(zhuǎn)到bootConfig.c: usrInit()開始執(zhí)行ROM引導(dǎo)程序。從這里開始,可引導(dǎo)型映象和加載型映象走上了相同的初始化道路。(3)bootConfig.c : usrInit()對于bootrom_uncmp和bootrom_res,在romStart()中直接跳轉(zhuǎn)到usrInit()。對于壓縮的bootrom,romStart()跳轉(zhuǎn)到解壓縮點,而bootConfig.c中的第一個函數(shù)為compressedEntry(),故壓縮型bootro

24、m解壓后將跳轉(zhuǎn)到compressedEntry()入口處,緊接著調(diào)用usrInit()。至于為什么壓縮的bootrom需要compressedEntry這個樁函數(shù)(Stub Routine),詳情參考后文VxWorks/MIPS運行期的gp重定位。/* compressedEntry - compressed entry point after decompression。* This routine is the entry point after the bootroms decompress, if* compression is utilized.  Th

25、is routine must be the first item of the* text segment of this file.*/ VxWorks中第一個在RAM中執(zhí)行的函數(shù)。執(zhí)行操作系統(tǒng)內(nèi)核所必須的初始化程序。 Cache程序庫的初始化。 清零系統(tǒng)的BSS段。 初始化中斷向量表。 使硬件工作在一個“安靜”的狀態(tài),盡量不產(chǎn)生各種中斷或者異常。 調(diào)用sysHwInit()初始化硬件。 調(diào)用usrKernelInit()初始化內(nèi)核的必要組件。 調(diào)用KernelInit(),初始化VxWorks內(nèi)核并產(chǎn)生usrRoot根

26、任務(wù)。 在usrRoot根任務(wù)中解析Bootline,產(chǎn)生bootCmdLoop任務(wù),用于啟動、加載VxWorks映象。此時,調(diào)試超級終端會有如下打印信息(printBootLogo()):VxWorks System BootCopyright 1984-1998  Wind River Systems, Inc.CPU: MPC860Version: 5.4BSP version: 1.2/0Creation date: Aug 22002, 09:19:47Press any key to stopauto-boot. 3接著,將調(diào)用自動引導(dǎo)程序autobo

27、ot(timeout),在指定時間timeout內(nèi),按任意鍵可停止自動啟動,修改啟動行參數(shù)(read and execute the ROM commands)。下一步將調(diào)用bootload()將指定主機目錄下的VxWorks映象下載到目標板的RAM地址RAM_LOW_ADRS處,并跳轉(zhuǎn)(go)到此處執(zhí)行指令代碼,啟動VxWorks操作系統(tǒng)。VxWorks Boot: pboot device          : cpmunit number     &

28、#160;    : 0processor number     : 0host name            : Michelfile name            : c:/ftpRoot/vxWorksinet on ethernet (e) :7:ffffff00host ine

29、t (h)        : 0user (u)             : targetPasswd(pw)           : targetflags (f)          

30、60; : 0x0VxWorks Boot: boot device          : cpmunit number          : 0processor number     : 0host name            : Michelfile name

31、            : c:/ftpRoot/vxWorksinet on ethernet (e) :7:ffffff00host inet (h)        : 0user (u)             : targetPasswd(pw) 

32、;          : targetflags (f)            : 0x0 Attached TCP/IPinterface to cpm0.Attaching networkinterface lo0. done.Stage 2:(1)bootConfig.c :bootLoad()加載VxWorks映象,并跳轉(zhuǎn)到它的加載地址,具體流程如下。usrBootLineIni

33、t()中strcpy (BOOT_LINE_ADRS,DEFAULT_BOOT_LINE);從FLASH中讀出DEFAULT_BOOT_LINE配置的引導(dǎo)方式及映象文件。bootload()->usrBootLineCrack (BOOT_LINE_ADRS,&params)獲取BOOT_PARAMS,通過params.bootDev類型來決定從硬盤、軟盤、閃存加載或通過網(wǎng)口、串口下載VxWorks映象。bootLoad (BOOT_LINE_ADRS, &entry);scsiLoad();/* loada vxWorks image fr

34、om a local SCSI disk */fdLoad(); /* loada vxWorks image from a local floppy disk */ideLoad();/* loada vxWorks image from a local IDE disk */ataLoad();/* loada vxWorks image from a local ATA disk */pcmciaLoad();/* loada vxWorks image from a PCMCIA disk device */tffsLoad();/* loada vxWorks image

35、from a TFFS Flash disk */tsfsLoad();/* loada vxWorks image from a Target Server File System (TSFS) */netLoad();/*downLoad a file from a remote machine via the network */bootLoadModule();/*bootstrap load an object module into memory */下載完成后,直接跳轉(zhuǎn)到VxWorks系統(tǒng)映象起始地址(RAM_LOW_ADRS)處,從系統(tǒng)入口點(VxWorks image ent

36、rypoint)開始執(zhí)行,入口函數(shù)為sysInit():go (entry); /*. and never return */(2)sysALib.s : sysInit()與romInit.s: romInit()的初始化過程類似,但不再初始化SDRAM。(3)usrConfig.c :usrInit()設(shè)置cache的工作模式,板級硬件初始化,初始化Wind內(nèi)核,啟動usrRoot()根任務(wù)。(4)usrConfig.c : usrRoot()初始化內(nèi)存,系統(tǒng)時鐘,I/O系統(tǒng),標準輸入輸出錯,異常處理,最后會調(diào)用usrAppInit.c中的usrAppInit()進行用戶級應(yīng)用模

37、塊的初始化。此時調(diào)試超級終端打印如下信息,Boot引導(dǎo)完成。/*VXWORKS Image GettingLoaded*/Loading. 881680Starting at 0x10000 Attached TCP/IPinterface to cpm unit 0Attaching networkinterface lo0. done. VxWorksCopyright 1984-1998 WindRiver Systems, Inc.         CPU : MPC860 &

38、#160;   vxWorks : 5.4  BSP version: 1.2/0Creation date: Aug 22000         WDB : Ready2 ROM-based Image(壓縮/沒有壓縮)和上面那種啟動方式相比,這種啟動方式省去了一些步驟,執(zhí)行完romStart()之后就已經(jīng)將VxWorks加載到RAM中了,因此,下一步就是把控制權(quán)交給VxWorks,由VxWorks從usrEntry()開始執(zhí)行即可。下面是具體的流程:(1)romInit.s : r

39、omInit()同上。(2)romStart.c : romStart()rules.vxWorks中根據(jù)映像類型是vxWorks_romCompress、vxWorks_rom或vxWorks_romResident,將ROM_FLAGS_EXTRA定義為CC_ROM_CMP_FLAGS、CC_ROM_CPY_FLAGS或CC_ROM_RES_FLAGS(defs.vxWorks中定義),其中分別定義了ROM_COMPRESS、ROM_COPY或ROM_RESIDENT宏。項目wpj文件在romInit.o和romStart.o的BUILDRULE中引入了ROM_FLAGS_EXTRA。&#

40、160;把基于ROM的VxWorks映象的代碼段(如果是VxWorks_romResident映象,則不拷貝代碼段)和數(shù)據(jù)段從bootrom復(fù)制到RAM當中。 完成程序映象的解壓縮(如果映象是壓縮版本的) 跳轉(zhuǎn)到usrEntry.c: usrEntry()(3)usrEntry.c : usrEntry() usrEntry - entry point for _romCompress and _rom images.rules.vxWorks中定義了partialImage.o的編譯規(guī)則,當非DEFAULT_RULE(vxWorks)類型時,usrEntry.o

41、將會安插到$(PRJ_OBJS_FOR_LD_PARTIAL)之前。而PRJ_OBJS_FOR_LD_PARTIAL=PRJ_OBJS=prjObjs.lst,其中第一個目標文件為sysAlib.o,這樣usrEntry()取代sysInit()了成為vxWorks的入口。-partialImage.o: $(LDDEPS) $(PRJ_OBJS) $(EXTRA_MODULES) $(COMPONENT_LIBS)         $(patsubst -l%,lib%.a,$(LIBS) $(CC_LIB) $(PRJ_OBJS_

42、FILE)    - $(RM) $    $(CC) $(CFLAGS) $(OPTION_OBJECT_ONLY) $(VERSION_C)ifneq   ($(findstring vxWorks_rom, $(DEFAULT_RULE),)    $(CC) $(CFLAGS) $(OPTION_OBJECT_ONLY) $(USR_ENTRY_C)    $(LD_PARTIAL) usrEntry.o $(PRJ_

43、OBJS_FOR_LD_PARTIAL)         $(EXTRA_MODULES) version.o $(LD_PARTIAL_START_GROUP)         $(COMPONENT_LIBS) $(LD_LINK_PATH) $(LIBS)         $(LD_PARTIAL_END_GROUP)  $(CC_LIB) -o $else    $(LD_PARTIAL) $(PRJ_OBJS_FOR_LD_PARTIAL) $(EXTRA_MODULES)         version.o $(LD_P

溫馨提示

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

評論

0/150

提交評論