




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
本章的要求第5章、嵌入式Linux開發(fā)環(huán)境的搭建
掌握嵌入式交叉編譯環(huán)境的搭建掌握嵌入式主機通信環(huán)境的配置學(xué)會使用交叉編譯工具鏈學(xué)會配置Linux下的minicom和Windows下的超級終端學(xué)會在Linux下和Windows下配置TFTP服務(wù)學(xué)會配置NFS服務(wù)學(xué)會編譯Linux內(nèi)核學(xué)會搭建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實驗內(nèi)容——創(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)核,都會用到不同的交叉編譯器。交叉編譯器完整的安裝一般涉及到多個軟件的安裝(讀者可以從/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編譯器首先生成,然后以這個為基礎(chǔ)在結(jié)合下一步生成的Glibc的C函數(shù)庫,再編譯生成其它編譯器。第4步,配置Glibc并編譯生成Glibc的C函數(shù)庫。第5步,再次配置和編譯GCC源碼,生成其它語言的編譯器,如C++編譯器等。嵌入式交叉編譯環(huán)境的搭建(2)第1步,取得Binutils5超級終端的使用超級終端的使用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ù)報套接字*/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ā)行版的不同具體路徑會有所不同)關(guān)閉xinetd:[確定]啟動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工具串口配置下載界面啟動Bootloader串口下載–使用DNW工具串口配置下載界面啟動Bootlo13內(nèi)核配置(1)makemenuconfig處理器選擇內(nèi)核配置(1)makemenuconfig處理器選擇14內(nèi)核配置(2)啟動選項-串口設(shè)置退出并保存內(nèi)核配置(2)啟動選項-串口設(shè)置退出并保存15建立依賴關(guān)系由于內(nèi)核源碼樹中的大多數(shù)文件都與一些頭文件有依賴關(guān)系,因此要順利建立內(nèi)核,內(nèi)核源碼樹中的每個Makefile都必須知道這些依賴關(guān)系。建立依賴關(guān)系通常在第一次編譯內(nèi)核的時候(或者源碼目錄樹的結(jié)構(gòu)發(fā)生變化的時候)進(jìn)行,它會在內(nèi)核源碼樹中每個子目錄產(chǎn)生一個“.depend”文件。運行“makedep”即可。在編譯linux2.6版本的內(nèi)核通常不需要這個過程,直接輸入“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)核代碼時所需的大部分包含文件,這個模塊利用其他模塊重建內(nèi)核。/init子目錄包含了內(nèi)核的初始化代碼,這里的代碼是內(nèi)核工作的起始入口。/arch子目錄包含了所有處理器體系結(jié)構(gòu)特定的內(nèi)核代碼。如:arm、i386、alpha。/drivers子目錄包含了內(nèi)核中所有的設(shè)備驅(qū)動程序,如塊設(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機Linux的文件系統(tǒng)有較大的區(qū)別,但是,它們的總體架構(gòu)是一樣的,都是采用目錄樹的結(jié)構(gòu)。在嵌入式中常見的文件系統(tǒng)有cramfs、romfs、jffs、yaffs等。cramfs文件系統(tǒng)是一種經(jīng)過壓縮的、極為簡單的只讀文件系統(tǒng),因此非常適合嵌入式系統(tǒng)。嵌入式文件系統(tǒng)嵌入式Linux也支持多種文件系統(tǒng)。雖然在嵌入20busyboxbusybox是構(gòu)造文件系統(tǒng)最常用的軟件工具包,它被非常形象地稱為嵌入式Linux系統(tǒng)中的“瑞士軍刀”,因為它將許多常用的Linux命令和工具結(jié)合到了一個單獨的可執(zhí)行程序(busybox)中。雖然與相應(yīng)的GNU工具比較起來,busybox所提供的功能和參數(shù)略少,但在比較小的系統(tǒng)(例如啟動盤)或者嵌入式系統(tǒng)中已經(jīng)足夠了。busybox在設(shè)計上就充分考慮了硬件資源受限的特殊工作環(huán)境。它采用一種很巧妙的辦法減少自己的體積:所有的命令都通過“插件”的方式集中到一個可執(zhí)行文件中,在實際應(yīng)用過程中通過不同的符號鏈接來確定到底要執(zhí)行哪個操作。采用單一執(zhí)行文件的方式最大限度地共享了程序代碼,甚至連文件頭、內(nèi)存中的程序控制塊等其他系統(tǒng)資源都共享了,對于資源比較緊張的系統(tǒng)來說,真是最合適不過了。在busybox的編譯過程中,可以非常方便地加減它的“插件”,最后的符號鏈接也可以由編譯系統(tǒ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是動態(tài)編譯的(即在配置busybox時沒選中靜態(tài)編譯),則把所需的交叉編譯的動態(tài)鏈接庫文件復(fù)制到lib目錄中。接下來,需要創(chuàng)建一些重要文件。首先要創(chuàng)建/etc/inittab和/etc/fstab文件。inittab是Linux啟動之后第一個被訪問的腳本文件,而fstab文件是定義了文件系統(tǒng)的各個“掛接點”,需要與實際的系統(tǒ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因為cramfs文件系統(tǒng)是只讀的,所以不能在這個掛載目錄下直接進(jìn)行修改,因此需要將文件系統(tǒng)中的內(nèi)容復(fù)制到另一個目錄中。[root@localhostfs2410]#cp~/hellobackup_cramfs/cramfs/[root@localhostfs2410]#mkcramfsbackup_cramfs/cramfs/new.cramfs創(chuàng)建文件系統(tǒng)映像[root@localhostfs241024NFS文件系統(tǒng)(1)NFS為NetworkFileSystem的簡稱,最早是由Sun公司提出發(fā)展起來的,其目的就是讓不同的機器、不同的操作系統(tǒng)之間通過網(wǎng)絡(luò)可以彼此共享文件。NFS可以讓不同的主機通過網(wǎng)絡(luò)將遠(yuǎn)端的NFS服務(wù)器共享出來的文件安裝到自己的系統(tǒng)中,從客戶端看來,使用NFS的遠(yuǎn)端文件就像是使用本地文件一樣。在嵌入式中使用NFS會使應(yīng)用程序的開發(fā)變得十分方便,并且不用反復(fù)地進(jìn)行燒寫映像文件。NFS的使用分為服務(wù)端和客戶端,其中服務(wù)端是提供要共享的文件而客戶端則通過掛載(“mount”)這一動作來實現(xiàn)對共享文件的訪問操作。下面主要介紹NFS服務(wù)端的使用。在嵌入式開發(fā)中,通常NFS服務(wù)端在宿主機上運行,而客戶端在目標(biāo)板上運行。NFS文件系統(tǒng)(1)NFS為NetworkFileSy25NFS文件系統(tǒng)(2)NFS服務(wù)端是通過讀入它的配置文件“/etc/exports”來決定所共享的文件目錄的。在這個配置文件中,每一行都代表一項要共享的文件目錄以及所指定的客戶端對它的操作權(quán)限。客戶端可以根據(jù)相應(yīng)的權(quán)限,對該目錄下的所有目錄文件進(jìn)行訪問。[共享的目錄][客戶端主機名稱或IP][參數(shù)1,參數(shù)2…]在這里,主機名或IP是可供共享的客戶端主機名或IP,若對所有的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啟動portmap: [確定][root@localhostfs]#servicenfsstart啟動NFS服務(wù): [確定]關(guān)掉NFS配額: [確定]啟動NFS守護(hù)進(jìn)程: [確定]啟動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介紹簡單地說,Bootloader就是在操作系統(tǒng)內(nèi)核運行之前運行的一段程序,它類似于PC機中的BIOS程序。通過這段程序,可以完成硬件設(shè)備的初始化,并建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),為最終加載系統(tǒng)內(nèi)核做好準(zhǔn)備。通常,Bootloader比較依賴于硬件平臺,特別是在嵌入式系統(tǒng)中,更為如此。因此,在嵌入式世界里建立一個通用的Bootloader是一件比較困難的事情。Bootloader介紹簡單地說,Bootloader就是30Bootloader與哪些相關(guān)?Bootloader所支持的CPU和嵌入式開發(fā)板Bootloader的存儲位置Bootloader的啟動過程分為單階段和多階段兩種。通常多階段的Bootloader能提供更為復(fù)雜的功能,以及更好的可移植性。Bootloader的操作模式Bootloader與主機之間進(jìn)行文件傳輸所用的通信設(shè)備及協(xié)議,最常見的情況就是,目標(biāo)機上的Bootloader通過串口與主機之間進(jìn)行文件傳輸,傳輸協(xié)議通常是xmodem/ymodem/zmodem等。但是,串口傳輸?shù)乃俣仁怯邢薜模虼送ㄟ^以太網(wǎng)連接并借助TFTP等一些協(xié)議來下載文件是個更好的選擇。Bootloader與哪些相關(guān)?Bootloader所支持的31Bootloader啟動流程–stage1基本的硬件初始化,包括屏蔽所有的中斷、設(shè)置CPU的速度和時鐘頻率、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中,在這里要確定兩點:①stage2的可執(zhí)行映像在固態(tài)存儲設(shè)備的存放起始地址和終止地址;②RAM空間的起始地址。設(shè)置堆棧指針sp,這是為執(zhí)行stage2的C語言代碼做好準(zhǔn)備。Bootloader啟動流程–stage1基本的32Bootloader啟動流程–stage2用匯編語言跳轉(zhuǎn)到main入口函數(shù)由于stage2的代碼通常用C語言來實現(xiàn),目的是實現(xiàn)更復(fù)雜的功能和取得更好的代碼可讀性和可移植性。但是與普通C語言應(yīng)用程序不同的是,在編譯和鏈接Bootloader這樣的程序時,不能使用glibc庫中的任何支持函數(shù)。初始化本階段要使用到的硬件設(shè)備,包括初始化串口、初始化計時器等。在初始化這些設(shè)備之前、可以輸出一些打印信息。檢測系統(tǒng)的內(nèi)存映射,所謂內(nèi)存映射就是指在整個4GB物理地址空間中指出哪些地址范圍被分配用來尋址系統(tǒng)的內(nèi)存。加載內(nèi)核映像和根文件系統(tǒng)映像,這里包括規(guī)劃內(nèi)存占用的布局和從Flash上拷貝數(shù)據(jù)。設(shè)置內(nèi)核的啟動參數(shù)。Bootloader啟動流程–stage2用匯編語33U-Boot特點開放源碼;支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;較高的可靠性和穩(wěn)定性;高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求和產(chǎn)品發(fā)布等;豐富的設(shè)備驅(qū)動源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;較為豐富的開發(fā)調(diào)試文檔與強大的網(wǎng)絡(luò)技術(shù)支持。U-Boot特點開放源碼;34U-Boot功能系統(tǒng)引導(dǎo):支持NFS掛載、RAMDISK(壓縮或非壓縮)形式的根文件系統(tǒng)。支持NFS掛載,并從FLASH中引導(dǎo)壓縮或非壓縮系統(tǒng)內(nèi)核?;据o助功能:強大的操作系統(tǒng)接口功能;可靈活設(shè)置、傳遞多個關(guān)鍵參數(shù)給操作系統(tǒng),適合系統(tǒng)在不同開發(fā)階段的調(diào)試要求與產(chǎn)品發(fā)布,尤其對Linux支持最為強勁;支持目標(biāo)板環(huán)境參數(shù)多種存儲方式,如FLASH、NVRAM、EEPROM;CRC32校驗,可校驗FLASH中內(nèi)核、RAMDISK映像文件是否完好。設(shè)備驅(qū)動:串口、SDRAM、FLASH、以太網(wǎng)、LCD、NVRAM、EEPROM、鍵盤、USB、PCMCIA、PCI、RTC等驅(qū)動支持。上電自檢功能:SDRAM、FLASH大小自動檢測;SDRAM故障檢測;CPU型號。特殊功能: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)的代碼,用來實現(xiàn)各種命令的C程序。cpu:包含CPU相關(guān)代碼,其中的子目錄都是以U-BOOT所支持的CPU為名,比如有子目錄arm926ejs、mips、mpc8260和nios等,每個特定的子目錄中都包括cpu.c和interrupt.c,start.S等。其中cpu.c初始化CPU、設(shè)置指令Cache和數(shù)據(jù)Cache等;interrupt.c設(shè)置系統(tǒng)的各種中斷和異常,比如快速中斷、開關(guān)中斷、時鐘中斷、軟件中斷、預(yù)取中止和未定義指令等;匯編代碼文件start.S是U-BOOT啟動時執(zhí)行的第一個文件,它主要是設(shè)置系統(tǒng)堆棧和工作方式,為進(jìn)入C程序奠定基礎(chǔ)。disk:disk驅(qū)動的分區(qū)相關(guān)代碼。doc:文檔。U-Boot源碼結(jié)構(gòu)(1)board:和一些已有開發(fā)36U-Boot源碼結(jié)構(gòu)(2)drivers:通用設(shè)備驅(qū)動程序,比如各種網(wǎng)卡、支持CFI的Flash、串口和USB總線等。fs:支持文件系統(tǒng)的文件,U-BOOT現(xiàn)在支持cramfs、fat、fdos、jffs2和registerfs等。include:頭文件,還有對各種硬件平臺支持的匯編文件,系統(tǒng)的配置文件和對文件系統(tǒng)支持的文件。net:與網(wǎng)絡(luò)有關(guān)的代碼,BOOTP協(xié)議、TFTP協(xié)議、RARP協(xié)議和NFS文件系統(tǒng)的實現(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)因為在fs2410開發(fā)板啟動時是直接從nandflash加載代碼,所以應(yī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實驗-創(chuàng)建Linux內(nèi)核和文件系統(tǒng)5.3實驗-創(chuàng)建Linux內(nèi)核和文件系統(tǒng)40實驗?zāi)康暮蛢?nèi)容實驗?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)部分請讀者查閱本章前面內(nèi)容。實驗內(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ā)板上啟動linux。實驗?zāi)康暮蛢?nèi)容實驗?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)境的搭建掌握嵌入式主機通信環(huán)境的配置學(xué)會使用交叉編譯工具鏈學(xué)會配置Linux下的minicom和Windows下的超級終端學(xué)會在Linux下和Windows下配置TFTP服務(wù)學(xué)會配置NFS服務(wù)學(xué)會編譯Linux內(nèi)核學(xué)會搭建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實驗內(nèi)容——創(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)核,都會用到不同的交叉編譯器。交叉編譯器完整的安裝一般涉及到多個軟件的安裝(讀者可以從/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編譯器首先生成,然后以這個為基礎(chǔ)在結(jié)合下一步生成的Glibc的C函數(shù)庫,再編譯生成其它編譯器。第4步,配置Glibc并編譯生成Glibc的C函數(shù)庫。第5步,再次配置和編譯GCC源碼,生成其它語言的編譯器,如C++編譯器等。嵌入式交叉編譯環(huán)境的搭建(2)第1步,取得Binutils48超級終端的使用超級終端的使用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ù)報套接字*/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ā)行版的不同具體路徑會有所不同)關(guān)閉xinetd:[確定]啟動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工具串口配置下載界面啟動Bootloader串口下載–使用DNW工具串口配置下載界面啟動Bootlo56內(nèi)核配置(1)makemenuconfig處理器選擇內(nèi)核配置(1)makemenuconfig處理器選擇57內(nèi)核配置(2)啟動選項-串口設(shè)置退出并保存內(nèi)核配置(2)啟動選項-串口設(shè)置退出并保存58建立依賴關(guān)系由于內(nèi)核源碼樹中的大多數(shù)文件都與一些頭文件有依賴關(guān)系,因此要順利建立內(nèi)核,內(nèi)核源碼樹中的每個Makefile都必須知道這些依賴關(guān)系。建立依賴關(guān)系通常在第一次編譯內(nèi)核的時候(或者源碼目錄樹的結(jié)構(gòu)發(fā)生變化的時候)進(jìn)行,它會在內(nèi)核源碼樹中每個子目錄產(chǎn)生一個“.depend”文件。運行“makedep”即可。在編譯linux2.6版本的內(nèi)核通常不需要這個過程,直接輸入“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)核代碼時所需的大部分包含文件,這個模塊利用其他模塊重建內(nèi)核。/init子目錄包含了內(nèi)核的初始化代碼,這里的代碼是內(nèi)核工作的起始入口。/arch子目錄包含了所有處理器體系結(jié)構(gòu)特定的內(nèi)核代碼。如:arm、i386、alpha。/drivers子目錄包含了內(nèi)核中所有的設(shè)備驅(qū)動程序,如塊設(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機Linux的文件系統(tǒng)有較大的區(qū)別,但是,它們的總體架構(gòu)是一樣的,都是采用目錄樹的結(jié)構(gòu)。在嵌入式中常見的文件系統(tǒng)有cramfs、romfs、jffs、yaffs等。cramfs文件系統(tǒng)是一種經(jīng)過壓縮的、極為簡單的只讀文件系統(tǒng),因此非常適合嵌入式系統(tǒng)。嵌入式文件系統(tǒng)嵌入式Linux也支持多種文件系統(tǒng)。雖然在嵌入63busyboxbusybox是構(gòu)造文件系統(tǒng)最常用的軟件工具包,它被非常形象地稱為嵌入式Linux系統(tǒng)中的“瑞士軍刀”,因為它將許多常用的Linux命令和工具結(jié)合到了一個單獨的可執(zhí)行程序(busybox)中。雖然與相應(yīng)的GNU工具比較起來,busybox所提供的功能和參數(shù)略少,但在比較小的系統(tǒng)(例如啟動盤)或者嵌入式系統(tǒng)中已經(jīng)足夠了。busybox在設(shè)計上就充分考慮了硬件資源受限的特殊工作環(huán)境。它采用一種很巧妙的辦法減少自己的體積:所有的命令都通過“插件”的方式集中到一個可執(zhí)行文件中,在實際應(yīng)用過程中通過不同的符號鏈接來確定到底要執(zhí)行哪個操作。采用單一執(zhí)行文件的方式最大限度地共享了程序代碼,甚至連文件頭、內(nèi)存中的程序控制塊等其他系統(tǒng)資源都共享了,對于資源比較緊張的系統(tǒng)來說,真是最合適不過了。在busybox的編譯過程中,可以非常方便地加減它的“插件”,最后的符號鏈接也可以由編譯系統(tǒ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是動態(tài)編譯的(即在配置busybox時沒選中靜態(tài)編譯),則把所需的交叉編譯的動態(tài)鏈接庫文件復(fù)制到lib目錄中。接下來,需要創(chuàng)建一些重要文件。首先要創(chuàng)建/etc/inittab和/etc/fstab文件。inittab是Linux啟動之后第一個被訪問的腳本文件,而fstab文件是定義了文件系統(tǒng)的各個“掛接點”,需要與實際的系統(tǒ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因為cramfs文件系統(tǒng)是只讀的,所以不能在這個掛載目錄下直接進(jìn)行修改,因此需要將文件系統(tǒng)中的內(nèi)容復(fù)制到另一個目錄中。[root@localhostfs2410]#cp~/hellobackup_cramfs/cramfs/[root@localhostfs2410]#mkcramfsbackup_cramfs/cramfs/new.cramfs創(chuàng)建文件系統(tǒng)映像[root@localhostfs241067NFS文件系統(tǒng)(1)NFS為NetworkFileSystem的簡稱,最早是由Sun公司提出發(fā)展起來的,其目的就是讓不同的機器、不同的操作系統(tǒng)之間通過網(wǎng)絡(luò)可以彼此共享文件。NFS可以讓不同的主機通過網(wǎng)絡(luò)將遠(yuǎn)端的NFS服務(wù)器共享出來的文件安裝到自己的系統(tǒng)中,從客戶端看來,使用NFS的遠(yuǎn)端文件就像是使用本地文件一樣。在嵌入式中使用NFS會使應(yīng)用程序的開發(fā)變得十分方便,并且不用反復(fù)地進(jìn)行燒寫映像文件。NFS的使用分為服務(wù)端和客戶端,其中服務(wù)端是提供要共享的文件而客戶端則通過掛載(“mount”)這一動作來實現(xiàn)對共享文件的訪問操作。下面主要介紹NFS服務(wù)端的使用。在嵌入式開發(fā)中,通常NFS服務(wù)端在宿主機上運行,而客戶端在目標(biāo)板上運行。NFS文件系統(tǒng)(1)NFS為NetworkFileSy68NFS文件系統(tǒng)(2)NFS服務(wù)端是通過讀入它的配置文件“/etc/exports”來決定所共享的文件目錄的。在這個配置文件中,每一行都代表一項要共享的文件目錄以及所指定的客戶端對它的操作權(quán)限??蛻舳丝梢愿鶕?jù)相應(yīng)的權(quán)限,對該目錄下的所有目錄文件進(jìn)行訪問。[共享的目錄][客戶端主機名稱或IP][參數(shù)1,參數(shù)2…]在這里,主機名或IP是可供共享的客戶端主機名或IP,若對所有的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啟動portmap: [確定][root@localhostfs]#servicenfsstart啟動NFS服務(wù): [確定]關(guān)掉NFS配額: [確定]啟動NFS守護(hù)進(jìn)程: [確定]啟動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介紹簡單地說,Bootloader就是在操作系統(tǒng)內(nèi)核運行之前運行的一段程序,它類似于PC機中的BIOS程序。通過這段程序,可以完成硬件設(shè)備的初始化,并建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),為最終加載系統(tǒng)內(nèi)核做好準(zhǔn)備。通常,Bootloader比較依賴于硬件平臺,特別是在嵌入式系統(tǒng)中,更為如此。因此,在嵌入式世界里建立一個通用的Bootloader是一件比較困難的事情。Bootloader介紹簡單地說,Bootloader就是73Bootloader與哪些相關(guān)?Bootloader所支持的CPU和嵌入式開發(fā)板Bootloader的存儲位置Bootloader的啟動過程分為單階段和多階段兩種。通常多階段的Bootloader能提供更為復(fù)雜的功能,以及更好的可移植性。Bootloader的操作模式Bootloader與主機之間進(jìn)行文件傳輸所用的通信設(shè)備及協(xié)議,最常見的情況就是,目標(biāo)機上的Bootloader通過串口與主機之間進(jìn)行文件傳輸,傳輸協(xié)議通常是xmodem/ymodem/zmodem等。但是,串口傳輸?shù)乃俣仁怯邢薜?,因此通過以太網(wǎng)連接并借助TFTP等一些協(xié)議來下載文件是個更好的選擇。Bootloader與哪些相關(guān)?Bootloader所支持的74Bootloader啟動流程–stage1基本的硬件初始化,包括屏蔽所有的中斷、設(shè)置CPU的速度和時鐘頻率、RAM初始化、初始化外圍設(shè)備、關(guān)閉CPU內(nèi)部指令和數(shù)據(jù)cache等。為加載stage2準(zhǔn)備RAM空間,通常為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM空間中來執(zhí)行,因此必須為加載Bootloader的stage2準(zhǔn)備好一段可用的RAM空間。拷貝stage2到RAM中,在這里要確定兩點:①stage2的可執(zhí)行映像在固態(tài)存儲設(shè)備的存放起始地址和終止地址;②RAM空間的起始地址。設(shè)置堆棧指針sp,這是為執(zhí)行stage2的C語言代碼做好準(zhǔn)備。Bootloader啟動流程–stage1基本的75Bootloader啟動流程–stage2用匯編語言跳轉(zhuǎn)到main入口函數(shù)由于stage2的代碼通常用C語言來實現(xiàn),目的是實現(xiàn)更復(fù)雜的功能和取得更好的代碼可讀性和可移植性。但是與普通C語言應(yīng)用程序不同的是,在編譯和鏈接Bootloader這樣的程序時,不能使用glibc庫中的任何支持函數(shù)。初始化本階段要使用到的硬件設(shè)備,包括初始化串口、初始化計時器等。在初始化這些設(shè)備之前、可以輸出一些打印信息。檢測系統(tǒng)的內(nèi)存映射,所謂內(nèi)存映射就是指在整個4GB物理地址空間中指出哪些地址范圍被分配用來尋址系統(tǒng)的內(nèi)存。加載內(nèi)核映像和根文件系統(tǒng)映像,這里包括規(guī)劃內(nèi)存占用的布局和從Flash上拷貝數(shù)據(jù)。設(shè)置內(nèi)核的啟動參數(shù)。Bootloader啟動流程–stage2用匯編語76U-Boot特點開放源碼;支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD、VxWorks、QNX、RTEMS、ARTOS、LynxOS;支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;較高的可靠性和穩(wěn)定性;高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求和產(chǎn)品發(fā)布等;豐富的設(shè)備驅(qū)動源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;較為豐富的開發(fā)調(diào)試文檔與強大的網(wǎng)絡(luò)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沈陽市大東區(qū)2025屆初三下學(xué)期模擬卷(五)生物試題含解析
- 新疆維吾爾自治區(qū)阿克蘇市農(nóng)一師高級中學(xué)2024-2025學(xué)年高三下學(xué)期教學(xué)質(zhì)量檢測試題(一模)生物試題含解析
- 2025版游戲主播專屬合同
- 浙江省杭州地區(qū)達(dá)標(biāo)名校2025年第二學(xué)期期末考試初三數(shù)學(xué)試題含解析
- 二手車位交易合同范文
- 采購原材料合同樣本
- 高速公路擴建工程施工合同書
- 工廠設(shè)備安裝勞務(wù)分包合同26
- 美容院原材料采購合同
- 網(wǎng)絡(luò)優(yōu)化合同書
- 2025年上半年四川廣元旺蒼縣引進(jìn)高層次人才23人重點基礎(chǔ)提升(共500題)附帶答案詳解
- 骨科快速康復(fù)護(hù)理理念
- GB 5009.268-2025食品安全國家標(biāo)準(zhǔn)食品中多元素的測定
- 設(shè)備部門級安全培訓(xùn)
- 智研咨詢發(fā)布:2025年中國家庭智能機器人行業(yè)市場現(xiàn)狀及投資前景分析報告
- 2025年安徽國際商務(wù)職業(yè)學(xué)院單招職業(yè)技能考試題庫及答案1套
- 2024北京理工大附中高一(下)期中英語試題及答案
- 2025年心理b證筆試試題及答案
- 《冠心病病人的護(hù)理》課件
- 2024年湖南省長沙市中考?xì)v史試卷(附答案)
- 小學(xué)數(shù)學(xué)四年級下冊小數(shù)點移動練習(xí)題(共2頁)
評論
0/150
提交評論