第5章嵌入式Linux開發(fā)環(huán)境的搭建課件_第1頁
第5章嵌入式Linux開發(fā)環(huán)境的搭建課件_第2頁
第5章嵌入式Linux開發(fā)環(huán)境的搭建課件_第3頁
第5章嵌入式Linux開發(fā)環(huán)境的搭建課件_第4頁
第5章嵌入式Linux開發(fā)環(huán)境的搭建課件_第5頁
已閱讀5頁,還剩81頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本章的要求第5章、嵌入式Linux開發(fā)環(huán)境的搭建

掌握嵌入式交叉編譯環(huán)境的搭建掌握嵌入式主機(jī)通信環(huán)境的配置學(xué)會(huì)使用交叉編譯工具鏈學(xué)會(huì)配置Linux下的minicom和Windows下的超級(jí)終端學(xué)會(huì)在Linux下和Windows下配置TFTP服務(wù)學(xué)會(huì)配置NFS服務(wù)學(xué)會(huì)編譯Linux內(nèi)核學(xué)會(huì)搭建Linux的根文件系統(tǒng)熟悉嵌入式Linux的內(nèi)核相關(guān)代碼的分布情況掌握Bootloader的原理了解U-Boot的代碼結(jié)構(gòu)和移植本章的要求第5章、嵌入式Linux開發(fā)環(huán)境的搭建1本章的主要內(nèi)容5.1嵌入式開發(fā)環(huán)境的搭建5.2U-Boot移植5.3實(shí)驗(yàn)內(nèi)容——?jiǎng)?chuàng)建Linux內(nèi)核和文件系統(tǒng)本章的主要內(nèi)容5.1嵌入式開發(fā)環(huán)境的搭建25.1嵌入式開發(fā)環(huán)境的搭建5.1嵌入式開發(fā)環(huán)境的搭建3嵌入式交叉編譯環(huán)境的搭建(1)搭建交叉編譯環(huán)境是嵌入式開發(fā)的第一步,也是必備一步。搭建交叉編譯環(huán)境的方法很多,不同的體系結(jié)構(gòu)、不同的操作內(nèi)容甚至是不同版本的內(nèi)核,都會(huì)用到不同的交叉編譯器。交叉編譯器完整的安裝一般涉及到多個(gè)軟件的安裝(讀者可以從/pub/下載),包括binutils、gcc、glibc等軟件。其中,binutils主要用于生成一些輔助工具,如objdump、as、ld等;gcc是用來生成交叉編譯器的,主要生成arm-linux-gcc交叉編譯工具(應(yīng)該說,生成此工具后已經(jīng)搭建起了交叉編譯環(huán)境,可以編譯Linux內(nèi)核了,但由于沒有提供標(biāo)準(zhǔn)用戶函數(shù)庫,用戶程序還無法編譯);glibc主要是提供用戶程序所使用的一些基本的函數(shù)庫。這樣,交叉編譯環(huán)境就完全搭建起來了。嵌入式交叉編譯環(huán)境的搭建(1)搭建交叉編譯環(huán)境是嵌入式開發(fā)4嵌入式交叉編譯環(huán)境的搭建(2)第1步,取得Binutils、GCC、Glibc源碼。第2步,配置并編譯Binutils取得我們所需要的匯編和連接程序。第3步,配置并編譯GCC源碼生成GCC編譯器。一般是C編譯器首先生成,然后以這個(gè)為基礎(chǔ)在結(jié)合下一步生成的Glibc的C函數(shù)庫,再編譯生成其它編譯器。第4步,配置Glibc并編譯生成Glibc的C函數(shù)庫。第5步,再次配置和編譯GCC源碼,生成其它語言的編譯器,如C++編譯器等。嵌入式交叉編譯環(huán)境的搭建(2)第1步,取得Binutils5超級(jí)終端的使用超級(jí)終端的使用6minicom的使用(1)鍵入“ctrl+AZ”鍵入“ctrl+AO”鍵入“O”minicom的使用(1)鍵入“ctrl+AZ”鍵入“ct7minicom的使用(2)鍵入“A”鍵入“E”minicom的使用(2)鍵入“A”鍵入“E”8minicom的使用(3)minicom的使用(3)9Linux下tftp服務(wù)配置(1)[root@localhosttftpboot]#vim/etc/xinetd.d/tftp#default:off#description:Thetftpserverservesfilesusingthetrivialfiletransfer\#protocol.Thetftpprotocolisoftenusedtobootdiskless\#workstations,downloadconfigurationfilestonetwork-awareprinters,\#andtostarttheinstallationprocessforsomeoperatingsystems.servicetftp{socket_type=dgram/*使用數(shù)據(jù)報(bào)套接字*/protocol=udp/*使用UDP協(xié)議*/wait=yes/*允許等待*/user=root/*用戶*/

server=/usr/sbin/in.tftpd/*服務(wù)程序*/server_args=-s/tftpboot/*服務(wù)器端的根目錄*/disable=no/*使能*/per_source=11cps=1002flags=IPv4}Linux下tftp服務(wù)配置(1)[root@localh10Linux下tftp服務(wù)配置(2)[root@localhosttftpboot]#servicexinetdrestart(或者使用/etc/init.d/xinetdrestart,而且因發(fā)行版的不同具體路徑會(huì)有所不同)關(guān)閉xinetd:[確定]啟動(dòng)xinetd:[確定][root@localhosttftpboot]#netstat–au|greptftpActiveInternetconnections(serversandestablished)ProtoRecv-QSend-QLocalAddressForeignAddressStateudp00*:tftp*:*=>tftpboot0x30200000zImageTFTPfromserver;ourIPaddressis00Filename'zImage'.Loadaddress:0x30200000Loading:############################################################################################################################################################################doneBytestransferred=881988(d7544hex)Linux下tftp服務(wù)配置(2)[root@localho11Windows下tftp服務(wù)(tftpd32)配置Windows下tftp服務(wù)(tftpd32)配置12串口下載–使用DNW工具串口配置下載界面啟動(dòng)Bootloader串口下載–使用DNW工具串口配置下載界面啟動(dòng)Bootlo13內(nèi)核配置(1)makemenuconfig處理器選擇內(nèi)核配置(1)makemenuconfig處理器選擇14內(nèi)核配置(2)啟動(dòng)選項(xiàng)-串口設(shè)置退出并保存內(nèi)核配置(2)啟動(dòng)選項(xiàng)-串口設(shè)置退出并保存15建立依賴關(guān)系由于內(nèi)核源碼樹中的大多數(shù)文件都與一些頭文件有依賴關(guān)系,因此要順利建立內(nèi)核,內(nèi)核源碼樹中的每個(gè)Makefile都必須知道這些依賴關(guān)系。建立依賴關(guān)系通常在第一次編譯內(nèi)核的時(shí)候(或者源碼目錄樹的結(jié)構(gòu)發(fā)生變化的時(shí)候)進(jìn)行,它會(huì)在內(nèi)核源碼樹中每個(gè)子目錄產(chǎn)生一個(gè)“.depend”文件。運(yùn)行“makedep”即可。在編譯linux2.6版本的內(nèi)核通常不需要這個(gè)過程,直接輸入“make”即可。建立依賴關(guān)系16創(chuàng)建內(nèi)核鏡像建立內(nèi)核可以使用“make”、“makezImage”或“makebzImage”,這里建立的為壓縮的內(nèi)核映像。通常在Linux中,內(nèi)核映像分為壓縮的內(nèi)核映像和未壓縮的內(nèi)核映像。其中,壓縮的內(nèi)核映像通常名為zImage,位于“arch/$(ARCH)/boot”目錄中。而未壓縮的內(nèi)核映像通常名為vmlinux,位于源碼樹的根目錄中。

創(chuàng)建內(nèi)核鏡像17Linux內(nèi)核源碼目錄結(jié)構(gòu)/include子目錄包含了建立內(nèi)核代碼時(shí)所需的大部分包含文件,這個(gè)模塊利用其他模塊重建內(nèi)核。/init子目錄包含了內(nèi)核的初始化代碼,這里的代碼是內(nèi)核工作的起始入口。/arch子目錄包含了所有處理器體系結(jié)構(gòu)特定的內(nèi)核代碼。如:arm、i386、alpha。/drivers子目錄包含了內(nèi)核中所有的設(shè)備驅(qū)動(dòng)程序,如塊設(shè)備和SCSI設(shè)備。/fs子目錄包含了所有的文件系統(tǒng)的代碼,如:ext2,vfat等。/net子目錄包含了內(nèi)核的網(wǎng)絡(luò)相關(guān)代碼。/mm子目錄包含了所有內(nèi)存管理代碼。/ipc子目錄包含了進(jìn)程間通信代碼。/kernel子目錄包含了內(nèi)核核心代碼。Linux內(nèi)核源碼目錄結(jié)構(gòu)/include子目錄包含18為什么需要文件系統(tǒng)?為什么需要文件系統(tǒng)?19嵌入式文件系統(tǒng)嵌入式Linux也支持多種文件系統(tǒng)。雖然在嵌入式中,由于資源受限的原因,它的文件系統(tǒng)和PC機(jī)Linux的文件系統(tǒng)有較大的區(qū)別,但是,它們的總體架構(gòu)是一樣的,都是采用目錄樹的結(jié)構(gòu)。在嵌入式中常見的文件系統(tǒng)有cramfs、romfs、jffs、yaffs等。cramfs文件系統(tǒng)是一種經(jīng)過壓縮的、極為簡(jiǎn)單的只讀文件系統(tǒng),因此非常適合嵌入式系統(tǒng)。嵌入式文件系統(tǒng)嵌入式Linux也支持多種文件系統(tǒng)。雖然在嵌入20busyboxbusybox是構(gòu)造文件系統(tǒng)最常用的軟件工具包,它被非常形象地稱為嵌入式Linux系統(tǒng)中的“瑞士軍刀”,因?yàn)樗鼘⒃S多常用的Linux命令和工具結(jié)合到了一個(gè)單獨(dú)的可執(zhí)行程序(busybox)中。雖然與相應(yīng)的GNU工具比較起來,busybox所提供的功能和參數(shù)略少,但在比較小的系統(tǒng)(例如啟動(dòng)盤)或者嵌入式系統(tǒng)中已經(jīng)足夠了。busybox在設(shè)計(jì)上就充分考慮了硬件資源受限的特殊工作環(huán)境。它采用一種很巧妙的辦法減少自己的體積:所有的命令都通過“插件”的方式集中到一個(gè)可執(zhí)行文件中,在實(shí)際應(yīng)用過程中通過不同的符號(hào)鏈接來確定到底要執(zhí)行哪個(gè)操作。采用單一執(zhí)行文件的方式最大限度地共享了程序代碼,甚至連文件頭、內(nèi)存中的程序控制塊等其他系統(tǒng)資源都共享了,對(duì)于資源比較緊張的系統(tǒng)來說,真是最合適不過了。在busybox的編譯過程中,可以非常方便地加減它的“插件”,最后的符號(hào)鏈接也可以由編譯系統(tǒng)自動(dòng)生成。

busyboxbusybox是構(gòu)造文件系統(tǒng)最常用的軟件工具包21使用busybox創(chuàng)建文件系統(tǒng)(1)[root@localhostfs2410]#tarjxvfbusybox-1.00.tar.bz2[root@localhostfs2410]#cdbusybox-1.00[root@localhostbusybox-1.00]#makedefconfig/*首先進(jìn)行默認(rèn)配置*/[root@localhostbusybox-1.00]#makemenuconfig使用busybox創(chuàng)建文件系統(tǒng)(1)[root@localh22使用busybox創(chuàng)建文件系統(tǒng)(2)#make#makeinstallPREFIX=/home/david/fs2410/cramfs

[root@localhostcramfs]#lsbinlinuxrcsbinusr[root@localhostcramfs]#mkdirmntrootvartmpprocbootetclib[root@localhostcramfs]#mkdir/var/{lock,log,mail,run,spool}如果busybox是動(dòng)態(tài)編譯的(即在配置busybox時(shí)沒選中靜態(tài)編譯),則把所需的交叉編譯的動(dòng)態(tài)鏈接庫文件復(fù)制到lib目錄中。接下來,需要?jiǎng)?chuàng)建一些重要文件。首先要?jiǎng)?chuàng)建/etc/inittab和/etc/fstab文件。inittab是Linux啟動(dòng)之后第一個(gè)被訪問的腳本文件,而fstab文件是定義了文件系統(tǒng)的各個(gè)“掛接點(diǎn)”,需要與實(shí)際的系統(tǒng)相配合。接下來要?jiǎng)?chuàng)建用戶和用戶組文件。使用busybox創(chuàng)建文件系統(tǒng)(2)#make[root@23創(chuàng)建文件系統(tǒng)映像[root@localhostfs2410]#mkdircramfs[root@localhostfs2410]#mountfs2410.cramgscramfs–oloop

[root@localhostfs2410]#lscramfsbindevetchomeliblinuxrcprocQtopiaramdisksbintestshelltmpusrvar[root@localhostfs2410]#mkdirbackup_cramfs[root@localhostfs2410]#tarcvfbackup.cramfs.tarcramfs/[root@localhostfs2410]#mvbackup.cramfs.tarbackup_cramfs/[root@localhostfs2410]#umountcramfs[root@localhostfs2410]#cdbackup_cramfs[root@localhostbackup_cramfs]#tarzvfbackup.cramfs.tar[root@localhostbackup_cramfs]#rmbackup.cramfs.tar因?yàn)閏ramfs文件系統(tǒng)是只讀的,所以不能在這個(gè)掛載目錄下直接進(jìn)行修改,因此需要將文件系統(tǒng)中的內(nèi)容復(fù)制到另一個(gè)目錄中。[root@localhostfs2410]#cp~/hellobackup_cramfs/cramfs/[root@localhostfs2410]#mkcramfsbackup_cramfs/cramfs/new.cramfs創(chuàng)建文件系統(tǒng)映像[root@localhostfs241024NFS文件系統(tǒng)(1)NFS為NetworkFileSystem的簡(jiǎn)稱,最早是由Sun公司提出發(fā)展起來的,其目的就是讓不同的機(jī)器、不同的操作系統(tǒng)之間通過網(wǎng)絡(luò)可以彼此共享文件。NFS可以讓不同的主機(jī)通過網(wǎng)絡(luò)將遠(yuǎn)端的NFS服務(wù)器共享出來的文件安裝到自己的系統(tǒng)中,從客戶端看來,使用NFS的遠(yuǎn)端文件就像是使用本地文件一樣。在嵌入式中使用NFS會(huì)使應(yīng)用程序的開發(fā)變得十分方便,并且不用反復(fù)地進(jìn)行燒寫映像文件。NFS的使用分為服務(wù)端和客戶端,其中服務(wù)端是提供要共享的文件而客戶端則通過掛載(“mount”)這一動(dòng)作來實(shí)現(xiàn)對(duì)共享文件的訪問操作。下面主要介紹NFS服務(wù)端的使用。在嵌入式開發(fā)中,通常NFS服務(wù)端在宿主機(jī)上運(yùn)行,而客戶端在目標(biāo)板上運(yùn)行。NFS文件系統(tǒng)(1)NFS為NetworkFileSy25NFS文件系統(tǒng)(2)NFS服務(wù)端是通過讀入它的配置文件“/etc/exports”來決定所共享的文件目錄的。在這個(gè)配置文件中,每一行都代表一項(xiàng)要共享的文件目錄以及所指定的客戶端對(duì)它的操作權(quán)限??蛻舳丝梢愿鶕?jù)相應(yīng)的權(quán)限,對(duì)該目錄下的所有目錄文件進(jìn)行訪問。[共享的目錄][客戶端主機(jī)名稱或IP][參數(shù)1,參數(shù)2…]在這里,主機(jī)名或IP是可供共享的客戶端主機(jī)名或IP,若對(duì)所有的IP都可以訪問,則可用“*”表示。這里的參數(shù)有很多種組合方式NFS文件系統(tǒng)(2)NFS服務(wù)端是通過讀入它的配置文件“/e26NFS文件系統(tǒng)(3)[root@localhostfs]#cat/etc/exports/root/workplace192.168.2.*(rw,no_root_squash)[root@localhostfs]#serviceportmapstart啟動(dòng)portmap: [確定][root@localhostfs]#servicenfsstart啟動(dòng)NFS服務(wù): [確定]關(guān)掉NFS配額: [確定]啟動(dòng)NFS守護(hù)進(jìn)程: [確定]啟動(dòng)NFSmountd: [確定]NFS文件系統(tǒng)(3)[root@localhostfs]#27其它命令exportfs命令可以重新掃描“/etc/exports”,使用戶在修改了“/etc/exports”配置文件之后不需要每次重啟NFS服務(wù)。showmount命令用于顯示當(dāng)前的掛載情況其它命令exportfs命令可以重新掃描“/etc/expo285.2U-Boot移植5.2U-Boot移植29Bootloader介紹簡(jiǎn)單地說,Bootloader就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段程序,它類似于PC機(jī)中的BIOS程序。通過這段程序,可以完成硬件設(shè)備的初始化,并建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),為最終加載系統(tǒng)內(nèi)核做好準(zhǔn)備。通常,Bootloader比較依賴于硬件平臺(tái),特別是在嵌入式系統(tǒng)中,更為如此。因此,在嵌入式世界里建立一個(gè)通用的Bootloader是一件比較困難的事情。Bootloader介紹簡(jiǎn)單地說,Bootloader就是30Bootloader與哪些相關(guān)?Bootloader所支持的CPU和嵌入式開發(fā)板Bootloader的存儲(chǔ)位置Bootloader的啟動(dòng)過程分為單階段和多階段兩種。通常多階段的Bootloader能提供更為復(fù)雜的功能,以及更好的可移植性。Bootloader的操作模式Bootloader與主機(jī)之間進(jìn)行文件傳輸所用的通信設(shè)備及協(xié)議,最常見的情況就是,目標(biāo)機(jī)上的Bootloader通過串口與主機(jī)之間進(jìn)行文件傳輸,傳輸協(xié)議通常是xmodem/ymodem/zmodem等。但是,串口傳輸?shù)乃俣仁怯邢薜模虼送ㄟ^以太網(wǎng)連接并借助TFTP等一些協(xié)議來下載文件是個(gè)更好的選擇。Bootloader與哪些相關(guān)?Bootloader所支持的31Bootloader啟動(dòng)流程–stage1基本的硬件初始化,包括屏蔽所有的中斷、設(shè)置CPU的速度和時(shí)鐘頻率、RAM初始化、初始化外圍設(shè)備、關(guān)閉CPU內(nèi)部指令和數(shù)據(jù)cache等。為加載stage2準(zhǔn)備RAM空間,通常為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM空間中來執(zhí)行,因此必須為加載Bootloader的stage2準(zhǔn)備好一段可用的RAM空間??截恠tage2到RAM中,在這里要確定兩點(diǎn):①stage2的可執(zhí)行映像在固態(tài)存儲(chǔ)設(shè)備的存放起始地址和終止地址;②RAM空間的起始地址。設(shè)置堆棧指針sp,這是為執(zhí)行stage2的C語言代碼做好準(zhǔn)備。Bootloader啟動(dòng)流程–stage1基本的32Bootloader啟動(dòng)流程–stage2用匯編語言跳轉(zhuǎn)到main入口函數(shù)由于stage2的代碼通常用C語言來實(shí)現(xiàn),目的是實(shí)現(xiàn)更復(fù)雜的功能和取得更好的代碼可讀性和可移植性。但是與普通C語言應(yīng)用程序不同的是,在編譯和鏈接Bootloader這樣的程序時(shí),不能使用glibc庫中的任何支持函數(shù)。初始化本階段要使用到的硬件設(shè)備,包括初始化串口、初始化計(jì)時(shí)器等。在初始化這些設(shè)備之前、可以輸出一些打印信息。檢測(cè)系統(tǒng)的內(nèi)存映射,所謂內(nèi)存映射就是指在整個(gè)4GB物理地址空間中指出哪些地址范圍被分配用來尋址系統(tǒng)的內(nèi)存。加載內(nèi)核映像和根文件系統(tǒng)映像,這里包括規(guī)劃內(nèi)存占用的布局和從Flash上拷貝數(shù)據(jù)。設(shè)置內(nèi)核的啟動(dòng)參數(shù)。Bootloader啟動(dòng)流程–stage2用匯編語33U-Boot特點(diǎn)開放源碼;支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;支持多個(gè)處理器系列,如PowerPC、ARM、x86、MIPS、XScale;較高的可靠性和穩(wěn)定性;高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求和產(chǎn)品發(fā)布等;豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;較為豐富的開發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)技術(shù)支持。U-Boot特點(diǎn)開放源碼;34U-Boot功能系統(tǒng)引導(dǎo):支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統(tǒng)。支持NFS掛載,并從FLASH中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核。基本輔助功能:強(qiáng)大的操作系統(tǒng)接口功能;可靈活設(shè)置、傳遞多個(gè)關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤其對(duì)Linux支持最為強(qiáng)勁;支持目標(biāo)板環(huán)境參數(shù)多種存儲(chǔ)方式,如FLASH、NVRAM、EEPROM;CRC32校驗(yàn),可校驗(yàn)FLASH中內(nèi)核、RAMDISK映像文件是否完好。設(shè)備驅(qū)動(dòng):串口、SDRAM、FLASH、以太網(wǎng)、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅(qū)動(dòng)支持。上電自檢功能:SDRAM、FLASH大小自動(dòng)檢測(cè);SDRAM故障檢測(cè);CPU型號(hào)。特殊功能:XIP內(nèi)核引導(dǎo)。U-Boot功能系統(tǒng)引導(dǎo):支持NFS掛載、RAMDIS35U-Boot源碼結(jié)構(gòu)(1)board:和一些已有開發(fā)板有關(guān)的代碼,比如makefile和U-Boot.lds等都和具體開發(fā)板的硬件和地址分配有關(guān)。common:與體系結(jié)構(gòu)無關(guān)的代碼,用來實(shí)現(xiàn)各種命令的C程序。cpu:包含CPU相關(guān)代碼,其中的子目錄都是以U-BOOT所支持的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個(gè)特定的子目錄中都包括cpu.c和interrupt.c,start.S等。其中cpu.c初始化CPU、設(shè)置指令Cache和數(shù)據(jù)Cache等;interrupt.c設(shè)置系統(tǒng)的各種中斷和異常,比如快速中斷、開關(guān)中斷、時(shí)鐘中斷、軟件中斷、預(yù)取中止和未定義指令等;匯編代碼文件start.S是U-BOOT啟動(dòng)時(shí)執(zhí)行的第一個(gè)文件,它主要是設(shè)置系統(tǒng)堆棧和工作方式,為進(jìn)入C程序奠定基礎(chǔ)。disk:disk驅(qū)動(dòng)的分區(qū)相關(guān)代碼。doc:文檔。U-Boot源碼結(jié)構(gòu)(1)board:和一些已有開發(fā)36U-Boot源碼結(jié)構(gòu)(2)drivers:通用設(shè)備驅(qū)動(dòng)程序,比如各種網(wǎng)卡、支持CFI的Flash、串口和USB總線等。fs:支持文件系統(tǒng)的文件,U-BOOT現(xiàn)在支持cramfs、fat、fdos、jffs2和registerfs等。include:頭文件,還有對(duì)各種硬件平臺(tái)支持的匯編文件,系統(tǒng)的配置文件和對(duì)文件系統(tǒng)支持的文件。net:與網(wǎng)絡(luò)有關(guān)的代碼,BOOTP協(xié)議、TFTP協(xié)議、RARP協(xié)議和NFS文件系統(tǒng)的實(shí)現(xiàn)。lib_arm:與ARM體系結(jié)構(gòu)相關(guān)的代碼。tools:創(chuàng)建S-Record格式文件和U-BOOTimages的工具。U-Boot源碼結(jié)構(gòu)(2)37U-Boot重要代碼cpu/arm920t/start.Sinterrupts.ccpu.cmemsetup.S……U-Boot重要代碼cpu/arm920t/start.S38U-Boot移植主要步驟建立自己的開發(fā)板類型(Makefile)修改程序鏈接地址(board/s3c2410/config.mk)修改中斷禁止的部分(/cpu/arm920t/start.S)因?yàn)樵趂s2410開發(fā)板啟動(dòng)時(shí)是直接從nandflash加載代碼,所以應(yīng)該啟動(dòng)代碼(/cpu/arm920t/start.S)修改內(nèi)存配置(board/fs2410/lowlevel_init.S)加入nandflash讀函數(shù)(board/fs2410/nand_read.c)加入nandflash的初始化函數(shù)(board/fs2410/fs2410.c)

修改外設(shè)控制器相關(guān)宏(board/fs2410/fs2410.c)提供nandflash相關(guān)宏定義(include/configs/fs2410.h)加入nandflash設(shè)備(include/linux/mtd/nand_ids.h)設(shè)置nandflash環(huán)境(common/env_nand.c)U-Boot移植主要步驟建立自己的開發(fā)板類型(Makefi395.3實(shí)驗(yàn)-創(chuàng)建Linux內(nèi)核和文件系統(tǒng)5.3實(shí)驗(yàn)-創(chuàng)建Linux內(nèi)核和文件系統(tǒng)40實(shí)驗(yàn)?zāi)康暮蛢?nèi)容實(shí)驗(yàn)?zāi)康耐ㄟ^移植Linux內(nèi)核,熟悉嵌入式開發(fā)環(huán)境的搭建和Linux內(nèi)核的編譯配置。通過創(chuàng)建文件系統(tǒng),熟練掌握使用busybox創(chuàng)建文件系統(tǒng)和如何創(chuàng)建文件系統(tǒng)映像文件。由于具體步驟在前面已經(jīng)詳細(xì)講解過了,因此,相關(guān)部分請(qǐng)讀者查閱本章前面內(nèi)容。實(shí)驗(yàn)內(nèi)容首先在Linux環(huán)境下配置minicom,使之能夠正常顯示串口的信息。然后再編譯配置Linux2.6內(nèi)核,并下載到開發(fā)板。接下來,用busybox創(chuàng)建文件系統(tǒng)并完善所缺的內(nèi)容。用mkcramfs創(chuàng)建cramfs映像文件并下載到開發(fā)板。在linux內(nèi)核和文件系統(tǒng)加載完了之后,在開發(fā)板上啟動(dòng)linux。實(shí)驗(yàn)?zāi)康暮蛢?nèi)容實(shí)驗(yàn)?zāi)康?1思考與練習(xí)1.適當(dāng)更改Linux內(nèi)核配置,再進(jìn)行編譯下載查看結(jié)果。2.配置NFS服務(wù)。3.深入研究一下U-Boot源碼以及移植的具體步驟。思考與練習(xí)1.適當(dāng)更改Linux內(nèi)核配置,再進(jìn)行編譯下載查看42演講完畢,謝謝觀看!演講完畢,謝謝觀看!43本章的要求第5章、嵌入式Linux開發(fā)環(huán)境的搭建

掌握嵌入式交叉編譯環(huán)境的搭建掌握嵌入式主機(jī)通信環(huán)境的配置學(xué)會(huì)使用交叉編譯工具鏈學(xué)會(huì)配置Linux下的minicom和Windows下的超級(jí)終端學(xué)會(huì)在Linux下和Windows下配置TFTP服務(wù)學(xué)會(huì)配置NFS服務(wù)學(xué)會(huì)編譯Linux內(nèi)核學(xué)會(huì)搭建Linux的根文件系統(tǒng)熟悉嵌入式Linux的內(nèi)核相關(guān)代碼的分布情況掌握Bootloader的原理了解U-Boot的代碼結(jié)構(gòu)和移植本章的要求第5章、嵌入式Linux開發(fā)環(huán)境的搭建44本章的主要內(nèi)容5.1嵌入式開發(fā)環(huán)境的搭建5.2U-Boot移植5.3實(shí)驗(yàn)內(nèi)容——?jiǎng)?chuàng)建Linux內(nèi)核和文件系統(tǒng)本章的主要內(nèi)容5.1嵌入式開發(fā)環(huán)境的搭建455.1嵌入式開發(fā)環(huán)境的搭建5.1嵌入式開發(fā)環(huán)境的搭建46嵌入式交叉編譯環(huán)境的搭建(1)搭建交叉編譯環(huán)境是嵌入式開發(fā)的第一步,也是必備一步。搭建交叉編譯環(huán)境的方法很多,不同的體系結(jié)構(gòu)、不同的操作內(nèi)容甚至是不同版本的內(nèi)核,都會(huì)用到不同的交叉編譯器。交叉編譯器完整的安裝一般涉及到多個(gè)軟件的安裝(讀者可以從/pub/下載),包括binutils、gcc、glibc等軟件。其中,binutils主要用于生成一些輔助工具,如objdump、as、ld等;gcc是用來生成交叉編譯器的,主要生成arm-linux-gcc交叉編譯工具(應(yīng)該說,生成此工具后已經(jīng)搭建起了交叉編譯環(huán)境,可以編譯Linux內(nèi)核了,但由于沒有提供標(biāo)準(zhǔn)用戶函數(shù)庫,用戶程序還無法編譯);glibc主要是提供用戶程序所使用的一些基本的函數(shù)庫。這樣,交叉編譯環(huán)境就完全搭建起來了。嵌入式交叉編譯環(huán)境的搭建(1)搭建交叉編譯環(huán)境是嵌入式開發(fā)47嵌入式交叉編譯環(huán)境的搭建(2)第1步,取得Binutils、GCC、Glibc源碼。第2步,配置并編譯Binutils取得我們所需要的匯編和連接程序。第3步,配置并編譯GCC源碼生成GCC編譯器。一般是C編譯器首先生成,然后以這個(gè)為基礎(chǔ)在結(jié)合下一步生成的Glibc的C函數(shù)庫,再編譯生成其它編譯器。第4步,配置Glibc并編譯生成Glibc的C函數(shù)庫。第5步,再次配置和編譯GCC源碼,生成其它語言的編譯器,如C++編譯器等。嵌入式交叉編譯環(huán)境的搭建(2)第1步,取得Binutils48超級(jí)終端的使用超級(jí)終端的使用49minicom的使用(1)鍵入“ctrl+AZ”鍵入“ctrl+AO”鍵入“O”minicom的使用(1)鍵入“ctrl+AZ”鍵入“ct50minicom的使用(2)鍵入“A”鍵入“E”minicom的使用(2)鍵入“A”鍵入“E”51minicom的使用(3)minicom的使用(3)52Linux下tftp服務(wù)配置(1)[root@localhosttftpboot]#vim/etc/xinetd.d/tftp#default:off#description:Thetftpserverservesfilesusingthetrivialfiletransfer\#protocol.Thetftpprotocolisoftenusedtobootdiskless\#workstations,downloadconfigurationfilestonetwork-awareprinters,\#andtostarttheinstallationprocessforsomeoperatingsystems.servicetftp{socket_type=dgram/*使用數(shù)據(jù)報(bào)套接字*/protocol=udp/*使用UDP協(xié)議*/wait=yes/*允許等待*/user=root/*用戶*/

server=/usr/sbin/in.tftpd/*服務(wù)程序*/server_args=-s/tftpboot/*服務(wù)器端的根目錄*/disable=no/*使能*/per_source=11cps=1002flags=IPv4}Linux下tftp服務(wù)配置(1)[root@localh53Linux下tftp服務(wù)配置(2)[root@localhosttftpboot]#servicexinetdrestart(或者使用/etc/init.d/xinetdrestart,而且因發(fā)行版的不同具體路徑會(huì)有所不同)關(guān)閉xinetd:[確定]啟動(dòng)xinetd:[確定][root@localhosttftpboot]#netstat–au|greptftpActiveInternetconnections(serversandestablished)ProtoRecv-QSend-QLocalAddressForeignAddressStateudp00*:tftp*:*=>tftpboot0x30200000zImageTFTPfromserver;ourIPaddressis00Filename'zImage'.Loadaddress:0x30200000Loading:############################################################################################################################################################################doneBytestransferred=881988(d7544hex)Linux下tftp服務(wù)配置(2)[root@localho54Windows下tftp服務(wù)(tftpd32)配置Windows下tftp服務(wù)(tftpd32)配置55串口下載–使用DNW工具串口配置下載界面啟動(dòng)Bootloader串口下載–使用DNW工具串口配置下載界面啟動(dòng)Bootlo56內(nèi)核配置(1)makemenuconfig處理器選擇內(nèi)核配置(1)makemenuconfig處理器選擇57內(nèi)核配置(2)啟動(dòng)選項(xiàng)-串口設(shè)置退出并保存內(nèi)核配置(2)啟動(dòng)選項(xiàng)-串口設(shè)置退出并保存58建立依賴關(guān)系由于內(nèi)核源碼樹中的大多數(shù)文件都與一些頭文件有依賴關(guān)系,因此要順利建立內(nèi)核,內(nèi)核源碼樹中的每個(gè)Makefile都必須知道這些依賴關(guān)系。建立依賴關(guān)系通常在第一次編譯內(nèi)核的時(shí)候(或者源碼目錄樹的結(jié)構(gòu)發(fā)生變化的時(shí)候)進(jìn)行,它會(huì)在內(nèi)核源碼樹中每個(gè)子目錄產(chǎn)生一個(gè)“.depend”文件。運(yùn)行“makedep”即可。在編譯linux2.6版本的內(nèi)核通常不需要這個(gè)過程,直接輸入“make”即可。建立依賴關(guān)系59創(chuàng)建內(nèi)核鏡像建立內(nèi)核可以使用“make”、“makezImage”或“makebzImage”,這里建立的為壓縮的內(nèi)核映像。通常在Linux中,內(nèi)核映像分為壓縮的內(nèi)核映像和未壓縮的內(nèi)核映像。其中,壓縮的內(nèi)核映像通常名為zImage,位于“arch/$(ARCH)/boot”目錄中。而未壓縮的內(nèi)核映像通常名為vmlinux,位于源碼樹的根目錄中。

創(chuàng)建內(nèi)核鏡像60Linux內(nèi)核源碼目錄結(jié)構(gòu)/include子目錄包含了建立內(nèi)核代碼時(shí)所需的大部分包含文件,這個(gè)模塊利用其他模塊重建內(nèi)核。/init子目錄包含了內(nèi)核的初始化代碼,這里的代碼是內(nèi)核工作的起始入口。/arch子目錄包含了所有處理器體系結(jié)構(gòu)特定的內(nèi)核代碼。如:arm、i386、alpha。/drivers子目錄包含了內(nèi)核中所有的設(shè)備驅(qū)動(dòng)程序,如塊設(shè)備和SCSI設(shè)備。/fs子目錄包含了所有的文件系統(tǒng)的代碼,如:ext2,vfat等。/net子目錄包含了內(nèi)核的網(wǎng)絡(luò)相關(guān)代碼。/mm子目錄包含了所有內(nèi)存管理代碼。/ipc子目錄包含了進(jìn)程間通信代碼。/kernel子目錄包含了內(nèi)核核心代碼。Linux內(nèi)核源碼目錄結(jié)構(gòu)/include子目錄包含61為什么需要文件系統(tǒng)?為什么需要文件系統(tǒng)?62嵌入式文件系統(tǒng)嵌入式Linux也支持多種文件系統(tǒng)。雖然在嵌入式中,由于資源受限的原因,它的文件系統(tǒng)和PC機(jī)Linux的文件系統(tǒng)有較大的區(qū)別,但是,它們的總體架構(gòu)是一樣的,都是采用目錄樹的結(jié)構(gòu)。在嵌入式中常見的文件系統(tǒng)有cramfs、romfs、jffs、yaffs等。cramfs文件系統(tǒng)是一種經(jīng)過壓縮的、極為簡(jiǎn)單的只讀文件系統(tǒng),因此非常適合嵌入式系統(tǒng)。嵌入式文件系統(tǒng)嵌入式Linux也支持多種文件系統(tǒng)。雖然在嵌入63busyboxbusybox是構(gòu)造文件系統(tǒng)最常用的軟件工具包,它被非常形象地稱為嵌入式Linux系統(tǒng)中的“瑞士軍刀”,因?yàn)樗鼘⒃S多常用的Linux命令和工具結(jié)合到了一個(gè)單獨(dú)的可執(zhí)行程序(busybox)中。雖然與相應(yīng)的GNU工具比較起來,busybox所提供的功能和參數(shù)略少,但在比較小的系統(tǒng)(例如啟動(dòng)盤)或者嵌入式系統(tǒng)中已經(jīng)足夠了。busybox在設(shè)計(jì)上就充分考慮了硬件資源受限的特殊工作環(huán)境。它采用一種很巧妙的辦法減少自己的體積:所有的命令都通過“插件”的方式集中到一個(gè)可執(zhí)行文件中,在實(shí)際應(yīng)用過程中通過不同的符號(hào)鏈接來確定到底要執(zhí)行哪個(gè)操作。采用單一執(zhí)行文件的方式最大限度地共享了程序代碼,甚至連文件頭、內(nèi)存中的程序控制塊等其他系統(tǒng)資源都共享了,對(duì)于資源比較緊張的系統(tǒng)來說,真是最合適不過了。在busybox的編譯過程中,可以非常方便地加減它的“插件”,最后的符號(hào)鏈接也可以由編譯系統(tǒng)自動(dòng)生成。

busyboxbusybox是構(gòu)造文件系統(tǒng)最常用的軟件工具包64使用busybox創(chuàng)建文件系統(tǒng)(1)[root@localhostfs2410]#tarjxvfbusybox-1.00.tar.bz2[root@localhostfs2410]#cdbusybox-1.00[root@localhostbusybox-1.00]#makedefconfig/*首先進(jìn)行默認(rèn)配置*/[root@localhostbusybox-1.00]#makemenuconfig使用busybox創(chuàng)建文件系統(tǒng)(1)[root@localh65使用busybox創(chuàng)建文件系統(tǒng)(2)#make#makeinstallPREFIX=/home/david/fs2410/cramfs

[root@localhostcramfs]#lsbinlinuxrcsbinusr[root@localhostcramfs]#mkdirmntrootvartmpprocbootetclib[root@localhostcramfs]#mkdir/var/{lock,log,mail,run,spool}如果busybox是動(dòng)態(tài)編譯的(即在配置busybox時(shí)沒選中靜態(tài)編譯),則把所需的交叉編譯的動(dòng)態(tài)鏈接庫文件復(fù)制到lib目錄中。接下來,需要?jiǎng)?chuàng)建一些重要文件。首先要?jiǎng)?chuàng)建/etc/inittab和/etc/fstab文件。inittab是Linux啟動(dòng)之后第一個(gè)被訪問的腳本文件,而fstab文件是定義了文件系統(tǒng)的各個(gè)“掛接點(diǎn)”,需要與實(shí)際的系統(tǒng)相配合。接下來要?jiǎng)?chuàng)建用戶和用戶組文件。使用busybox創(chuàng)建文件系統(tǒng)(2)#make[root@66創(chuàng)建文件系統(tǒng)映像[root@localhostfs2410]#mkdircramfs[root@localhostfs2410]#mountfs2410.cramgscramfs–oloop

[root@localhostfs2410]#lscramfsbindevetchomeliblinuxrcprocQtopiaramdisksbintestshelltmpusrvar[root@localhostfs2410]#mkdirbackup_cramfs[root@localhostfs2410]#tarcvfbackup.cramfs.tarcramfs/[root@localhostfs2410]#mvbackup.cramfs.tarbackup_cramfs/[root@localhostfs2410]#umountcramfs[root@localhostfs2410]#cdbackup_cramfs[root@localhostbackup_cramfs]#tarzvfbackup.cramfs.tar[root@localhostbackup_cramfs]#rmbackup.cramfs.tar因?yàn)閏ramfs文件系統(tǒng)是只讀的,所以不能在這個(gè)掛載目錄下直接進(jìn)行修改,因此需要將文件系統(tǒng)中的內(nèi)容復(fù)制到另一個(gè)目錄中。[root@localhostfs2410]#cp~/hellobackup_cramfs/cramfs/[root@localhostfs2410]#mkcramfsbackup_cramfs/cramfs/new.cramfs創(chuàng)建文件系統(tǒng)映像[root@localhostfs241067NFS文件系統(tǒng)(1)NFS為NetworkFileSystem的簡(jiǎn)稱,最早是由Sun公司提出發(fā)展起來的,其目的就是讓不同的機(jī)器、不同的操作系統(tǒng)之間通過網(wǎng)絡(luò)可以彼此共享文件。NFS可以讓不同的主機(jī)通過網(wǎng)絡(luò)將遠(yuǎn)端的NFS服務(wù)器共享出來的文件安裝到自己的系統(tǒng)中,從客戶端看來,使用NFS的遠(yuǎn)端文件就像是使用本地文件一樣。在嵌入式中使用NFS會(huì)使應(yīng)用程序的開發(fā)變得十分方便,并且不用反復(fù)地進(jìn)行燒寫映像文件。NFS的使用分為服務(wù)端和客戶端,其中服務(wù)端是提供要共享的文件而客戶端則通過掛載(“mount”)這一動(dòng)作來實(shí)現(xiàn)對(duì)共享文件的訪問操作。下面主要介紹NFS服務(wù)端的使用。在嵌入式開發(fā)中,通常NFS服務(wù)端在宿主機(jī)上運(yùn)行,而客戶端在目標(biāo)板上運(yùn)行。NFS文件系統(tǒng)(1)NFS為NetworkFileSy68NFS文件系統(tǒng)(2)NFS服務(wù)端是通過讀入它的配置文件“/etc/exports”來決定所共享的文件目錄的。在這個(gè)配置文件中,每一行都代表一項(xiàng)要共享的文件目錄以及所指定的客戶端對(duì)它的操作權(quán)限??蛻舳丝梢愿鶕?jù)相應(yīng)的權(quán)限,對(duì)該目錄下的所有目錄文件進(jìn)行訪問。[共享的目錄][客戶端主機(jī)名稱或IP][參數(shù)1,參數(shù)2…]在這里,主機(jī)名或IP是可供共享的客戶端主機(jī)名或IP,若對(duì)所有的IP都可以訪問,則可用“*”表示。這里的參數(shù)有很多種組合方式NFS文件系統(tǒng)(2)NFS服務(wù)端是通過讀入它的配置文件“/e69NFS文件系統(tǒng)(3)[root@localhostfs]#cat/etc/exports/root/workplace192.168.2.*(rw,no_root_squash)[root@localhostfs]#serviceportmapstart啟動(dòng)portmap: [確定][root@localhostfs]#servicenfsstart啟動(dòng)NFS服務(wù): [確定]關(guān)掉NFS配額: [確定]啟動(dòng)NFS守護(hù)進(jìn)程: [確定]啟動(dòng)NFSmountd: [確定]NFS文件系統(tǒng)(3)[root@localhostfs]#70其它命令exportfs命令可以重新掃描“/etc/exports”,使用戶在修改了“/etc/exports”配置文件之后不需要每次重啟NFS服務(wù)。showmount命令用于顯示當(dāng)前的掛載情況其它命令exportfs命令可以重新掃描“/etc/expo715.2U-Boot移植5.2U-Boot移植72Bootloader介紹簡(jiǎn)單地說,Bootloader就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段程序,它類似于PC機(jī)中的BIOS程序。通過這段程序,可以完成硬件設(shè)備的初始化,并建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),為最終加載系統(tǒng)內(nèi)核做好準(zhǔn)備。通常,Bootloader比較依賴于硬件平臺(tái),特別是在嵌入式系統(tǒng)中,更為如此。因此,在嵌入式世界里建立一個(gè)通用的Bootloader是一件比較困難的事情。Bootloader介紹簡(jiǎn)單地說,Bootloader就是73Bootloader與哪些相關(guān)?Bootloader所支持的CPU和嵌入式開發(fā)板Bootloader的存儲(chǔ)位置Bootloader的啟動(dòng)過程分為單階段和多階段兩種。通常多階段的Bootloader能提供更為復(fù)雜的功能,以及更好的可移植性。Bootloader的操作模式Bootloader與主機(jī)之間進(jìn)行文件傳輸所用的通信設(shè)備及協(xié)議,最常見的情況就是,目標(biāo)機(jī)上的Bootloader通過串口與主機(jī)之間進(jìn)行文件傳輸,傳輸協(xié)議通常是xmodem/ymodem/zmodem等。但是,串口傳輸?shù)乃俣仁怯邢薜?,因此通過以太網(wǎng)連接并借助TFTP等一些協(xié)議來下載文件是個(gè)更好的選擇。Bootloader與哪些相關(guān)?Bootloader所支持的74Bootloader啟動(dòng)流程–stage1基本的硬件初始化,包括屏蔽所有的中斷、設(shè)置CPU的速度和時(shí)鐘頻率、RAM初始化、初始化外圍設(shè)備、關(guān)閉CPU內(nèi)部指令和數(shù)據(jù)cache等。為加載stage2準(zhǔn)備RAM空間,通常為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM空間中來執(zhí)行,因此必須為加載Bootloader的stage2準(zhǔn)備好一段可用的RAM空間??截恠tage2到RAM中,在這里要確定兩點(diǎn):①stage2的可執(zhí)行映像在固態(tài)存儲(chǔ)設(shè)備的存放起始地址和終止地址;②RAM空間的起始地址。設(shè)置堆棧指針sp,這是為執(zhí)行stage2的C語言代碼做好準(zhǔn)備。Bootloader啟動(dòng)流程–stage1基本的75Bootloader啟動(dòng)流程–stage2用匯編語言跳轉(zhuǎn)到main入口函數(shù)由于stage2的代碼通常用C語言來實(shí)現(xiàn),目的是實(shí)現(xiàn)更復(fù)雜的功能和取得更好的代碼可讀性和可移植性。但是與普通C語言應(yīng)用程序不同的是,在編譯和鏈接Bootloader這樣的程序時(shí),不能使用glibc庫中的任何支持函數(shù)。初始化本階段要使用到的硬件設(shè)備,包括初始化串口、初始化計(jì)時(shí)器等。在初始化這些設(shè)備之前、可以輸出一些打印信息。檢測(cè)系統(tǒng)的內(nèi)存映射,所謂內(nèi)存映射就是指在整個(gè)4GB物理地址空間中指出哪些地址范圍被分配用來尋址系統(tǒng)的內(nèi)存。加載內(nèi)核映像和根文件系統(tǒng)映像,這里包括規(guī)劃內(nèi)存占用的布局和從Flash上拷貝數(shù)據(jù)。設(shè)置內(nèi)核的啟動(dòng)參數(shù)。Bootloader啟動(dòng)流程–stage2用匯編語76U-Boot特點(diǎn)開放源碼;支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;支持多個(gè)處理器系列,如PowerPC、ARM、x86、MIPS、XScale;較高的可靠性和穩(wěn)定性;高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求和產(chǎn)品發(fā)布等;豐富的設(shè)備驅(qū)動(dòng)源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;較為豐富的開發(fā)調(diào)試文檔與強(qiáng)大的網(wǎng)絡(luò)

溫馨提示

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