第4章 嵌入式Linux的構建(2012-10-9)_第1頁
第4章 嵌入式Linux的構建(2012-10-9)_第2頁
第4章 嵌入式Linux的構建(2012-10-9)_第3頁
第4章 嵌入式Linux的構建(2012-10-9)_第4頁
第4章 嵌入式Linux的構建(2012-10-9)_第5頁
已閱讀5頁,還剩99頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第4章

嵌入式Linux的構建4.1嵌入式BootLoader技術4.2嵌入式Linux根文件系統(tǒng)構建4.3

Linux內核及啟動過程4.4基于ARM目標板的Linux系統(tǒng)及應用程序的燒寫4.1嵌入式BootLoader技術4.1.1

Bootloader的概念

簡單地說,BootLoader就是在操作系統(tǒng)內核運行之前運行的一段小程序。通過這段小程序,可以初始化硬件設備、建立內存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調用操作系統(tǒng)內核準備好正確的環(huán)境。

通常,BootLoader是嚴重地依賴于硬件而實現的,特別是在嵌入式系統(tǒng)。因此,在嵌入式系統(tǒng)里建立一個通用的BootLoader幾乎是不可能的。盡管如此,仍然可以對BootLoader歸納出一些通用的概念來,以指導用戶特定的BootLoader設計與實現。

每種不同的CPU體系結構都有不同的BootLoader。有些BootLoader也支持多種體系結構的CPU,比如U-Boot就同時支持ARM體系結構和MIPS體系結構。除了依賴于CPU的體系結構外,BootLoader實際上也依賴于具體的嵌入式板級設備的配置。這也就是說,對于兩塊不同的嵌入式板而言,即使它們是基于同一種CPU而構建的,要想讓運行在一塊板子上的BootLoader程序也能運行在另一塊板子上,通常也都需要修改BootLoader的源程序。1.BootLoader所支持的CPU和嵌入式開發(fā)板

2.BootLoader的安裝媒介(InstallationMedium)系統(tǒng)加電或復位后,所有的CPU通常都從某個由CPU制造商預先安排的地址上取指令。比如,基于ARM920T核的CPU在復位時通常都從地址0x00000000取它的第一條指令。而基于CPU構建的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設備(比如:ROM、EEPROM或FLASH等)被映射到這個預先安排的地址上。因此在系統(tǒng)加電后,CPU將首先執(zhí)行BootLoader程序。

圖4.1所示的就是一個同時裝有BootLoader、內核的啟動參數、內核映像和根文件系統(tǒng)映像的固態(tài)存儲設備的典型空間分配結構圖。

圖4.1固態(tài)存儲設備的典型空間分配結構

3.用來控制BootLoader的設備或機制

主機和目標機之間一般通過串口建立連接,BootLoader軟件在執(zhí)行時通常會通過串口來進行I/O,比如:輸出打印信息到串口,從串口讀取用戶控制字符等。

4.BootLoader的啟動過程是單階段(SingleStage)還是多階段(Multi-Stage)通常多階段的BootLoader能提供更為復雜的功能,以及更好的可移植性。從固態(tài)存儲設備上啟動的BootLoader大多都是2階段的啟動過程,也即啟動過程可以分為stage1和stage2兩部分。而至于在stage1和stage2具體完成哪些任務將在下面討論。

5.BootLoader的操作模式(OperationMode)

①啟動加載(Bootloading)模式:這種模式也稱為"自主"(Autonomous)模式。也即BootLoader從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產品發(fā)布的時侯,BootLoader顯然必須工作在這種模式下。②下載(Downloading)模式:在這種模式下,目標機上的BootLoader將通過串口連接或網絡連接等通信手段從主機(Host)下載文件,比如:下載內核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被BootLoader保存到目標機的RAM中,然后再被BootLoader寫到目標機上的FLASH類固態(tài)存儲設備中。BootLoader的這種模式通常在第一次安裝內核與根文件系統(tǒng)時被使用;此外,以后的系統(tǒng)更新也會使用BootLoader的這種工作模式。工作于這種模式下的BootLoader通常都會向它的終端用戶提供一個簡單的命令行接口。6.BootLoader與主機之間進行文件傳輸所用的通信設備及協議一般情況,目標機上的BootLoader通過串口與主機之間進行文件傳輸,傳輸協議通常是xmodem/ymodem/zmodem協議中的一種。但是,串口傳輸的速度是有限的,因此通過以太網連接并借助TFTP協議來下載文件是個更好的選擇。

還必須考慮主機方所用的軟件。比如,在通過以太網連接和TFTP協議來下載文件時,主機方必須有一個軟件用來的提供TFTP服務。

4.1.2Bootloader引導程序Bootloader引導程序是嵌入式開發(fā)很重要的組成部分。它是嵌入式系統(tǒng)上電后執(zhí)行的第一個程序,并由它最終將操作系統(tǒng)啟動起來并將控制權交給操作系統(tǒng)。Bootloader引導程序最基本的功能是對硬件系統(tǒng)的初始化和內核啟動參數設置并啟動內核。Bootloader的主要功能有:(1)初始化CPU的主頻、SDRAM、中斷、串口等硬件;(2)啟動Linux內核并提供一個RAMDISK;(3)通過串口下載內核或RAMDISK到目標板上;(4)將修改過的內核或RAMDISK寫入到Flash內;(5)為用戶提供一個命令接口?!馚ootloader的stage1stage1是Bootloader一開始就執(zhí)行的操作,其目的是為了stage2的執(zhí)行以及隨后的內核的執(zhí)行,設置好一些基本的硬件環(huán)境。包括以下步驟:①屏蔽所有的中斷。為中斷提供服務的通常是操作系統(tǒng),因此在執(zhí)行Bootloader的過程中可以不響應任何中斷。中斷屏蔽通過寫CPU的中斷屏蔽寄存器來完成。②設置CPU的時鐘頻率和速度。③初始化RAM設置系統(tǒng)內存控制器的功能寄存器和各內存庫控制寄存器等。④為加載stage2準備RAM空間。⑤拷貝stage2到RAM中。⑥跳轉到stage2的入口點。●Bootloader的stage2

stage2的主要的功能是通過串口下載Linux內核到目標板上。包括以下幾個步驟:①初始化本階段要使用到的硬件設備。通常包括:初始化至少一個串口,以便和終端用戶進行I/O輸出信息;初始化計時器等。②檢測系統(tǒng)的內存映射。所謂內存映射就是指在整個4GB物理地址空間中有哪些地址范圍被分配用來尋址系統(tǒng)的RAM單元。③加載內核映像和根文件系統(tǒng)從Flash讀入到Rom中。包括兩個方面:第一方面是內核映像所占用的內存范圍;第二方面是根文件系統(tǒng)所占用的內存范圍。在規(guī)劃內存占用布局時,主要考慮基地址和映像的大小兩個方面。④設置內核的啟動參數。⑤調用內核。Bootloader調用Linux內核的方法是直接跳轉到內核的第一條指令處。2.BootLoader代碼分析

下面對引導程序2410INIT.S進行分析,以加深對BootLoader的理解。在第一階段完成依賴于體系結構硬件初始化的代碼,包括禁止看門狗、禁止中斷、初始化各控制寄存器拷貝自身到RAM等。IMPORTMain AREAInit,CODE,READONLY ENTRY …… b ResetHandler ……ResetHandler ldr r0,=WTCON ldr r1,=0x0 str r1,[r0] ldr r0,=INTMSK ldr r1,=0xffffffff str r1,[r0] ldr r0,=INTSUBMSK ldr r1,=0x7ff str r1,[r0] …… ldr r0,=LOCKTIME ldr r1,=0xffffff str r1,[r0] …… ldr r0,=SMRDATA ldr r1,=BWSCON add r2,r0,#52 ldr r3,[r0],#4 str r3,[r1],#4 cmp r2,r0 bne %B0 ……第二階段通常用C語言實現,包括內存管理單元初始化、時鐘設置、端口設置和串口初始化等。voidIsr_Init(void){rINTMOD=0x0;//工作在IRQ模式rINTMSK=BIT_ALLMSK;//屏蔽中斷rINTSUBMSK=BIT_SUB_ALLMSK;//屏蔽子中斷}voidMain(void){MMU_Init(); //MMU初始化ChangeClockDivider(1,1);//設置時鐘除法器->1:2:4ChangeMPllValue(0xa1,0x3,0x1);//時鐘值FCLK=202.8MHzPort_Init(); Isr_Init();Uart_Init(0,115200);Uart_Select(0);while(1){ …… Uart_Printf("\n\nSMDK2410Board(MCUS3C2410)ExampleProgramVer1.0(20020521)FCLK=%dHz\n\n",FCLK); ……}}

與一般的C語言程序一樣,第二階段程序從Main()函數開始。因為所采用的S3C2410X處理器內含存儲器管理單元MMU,所以首先需要進行存儲器管理單元的初始化。緊接著設置系統(tǒng)工作主時鐘,若使用USB設備則USB時鐘也需要做相應初始化。其次對端口工作狀態(tài)進行設定。然后設定處理器工作模式,以及中斷控制。最后初始化串口,與宿主機建立聯系,以利于顯示調試信息。啟動成功后,可以執(zhí)行主程序。4.1.3VIVI簡介VIVI是韓國Mizi公司開發(fā)的BootLoader,可用于ARM9處理器的引導。VIVI利用串行通信為用戶提供接口。為連接VIVI,首先利用串口電纜連接宿主機和目標板,然后在主機上運行串口通信程序,并在目標板上正確設置VIVI以支持串口。在宿主機進入超級終端后,打開目標板電源或按目標板復位鍵,就可以由串口通信程序顯示提示信息,提示信息的最后一行如下所示:PressReturntostarttheLINUXnow,anyotherkeyforvivi.VIVI也有前面說過的兩種工作模式,啟動模式可以在一段時間后自行啟動Linux內核,這是VIVI的默認方式。出現上述信息后,如果按除回車鍵外的任意鍵,即可進入下載模式,出現“vivi>”提示符。有如下作用:●把內核(kernel)從flash復制到RAM,然后啟動;●初始化硬件;●下載程序并寫入flash(通常由串口或者網口先把內核下載到RAM中,然后寫入flash);●檢測目標板(bootloader會有一些簡單的代碼用以測試目標板硬件的好壞)。在下載模式下,VIVI為用戶提供了一個命令行接口,通過該接口可以使用VIVI提供的一些命令。

1.VIVI的命令

(1)load命令

將二進制文件載入到Flash或者RAM,命令格式:load<media_type>[<partname>|<addr><size>]<x|y|z>其中命令行參數<media_type>描述裝載位置,有flash和ram兩種選項;參數[<partname>]或[<addr><size>]描述裝載的地址,如果有提前定義的mtd分區(qū)信息,可以只輸入分區(qū)名稱,否則需要指定地址和大??;參數<x|y|z>確定文件的傳輸協議,常采用的選項“x”用來指定采用xmodem協議。

例如:vivi>loadflashkernelx,裝載壓縮映像文件zImage到flash存儲器中,地址是kernel分區(qū),采用xmodem傳輸協議。也可以指定地址和大小,例如:vivi>loadflash0x800000xc0000x。(2)part命令操作MTD分區(qū)信息,比如,顯示、增加、刪除、復位、保存MTD分區(qū)等?!駊artshow:顯示mtd分區(qū)信息?!駊artadd<name><offset><size><flag>:增加新的mtd分區(qū),其中<name>為新mtd分區(qū)名稱,<offset>是mtd器件的偏移,<size>表示mtd分區(qū)的大小,<flag>表示分區(qū)類型,可選項有JFFS2、LOCKED和BONFS。●partdel<partname>:刪除一個mtd分區(qū)。●partreset:恢復mtd分區(qū)為默認值。●partsave:在flash中永久保存參數值和分區(qū)信息。(3)param命令用來設置或者察看參數。例如:改變“l(fā)inuxcommandline”,使用vivi>paramsetlinux_cmd_line"youwish."。也可以改變引導程序啟動的時間,使用vivi>paramsetboot_delay100000實現。

(4)boot命令

用來引導存儲在flash存儲器或ram中的linux內核。命令格式:boot<media_type>[<partname>|<addr><size>]參數<media_type>設定存儲linux內核映像的位置,可選項有ram、nor和smc。

參數[<partname>]或[<addr><size>]描述存儲內核的地址,如果有提前定義的mtd分區(qū)信息,可以只輸入分區(qū)名稱,否則需要指定地址和大小。例如:vivi>bootnor0x80000表示從flash存儲器中讀出linux內核,偏移是0x80000。

(5)flash命令

存儲器管理命令,例如:flasherase[<partname>|<offset><size>],表示擦除flash存儲器。2.VIVI的目錄樹(1)arch:此目錄包括了所有VIVI支持的目標板的子目錄,本書附帶的代碼中只包含S3C2410X。(2)Documentation:存放了許多文檔,其中包括VIVI的使用指南。(3)drivers:其中包括了引導內核所需的MTD設備和串口驅動程序。MTD目錄下分maps、nand和nor三個目錄,實現對NandFlash和NorFlash的讀寫控制。Serial目錄下的文件實現對串口的控制,并支持xmodem和ymodem協議。(4)include:頭文件的公共目錄,其中的S3C2410.h定義了處理器的一些寄存器,以及NANDFlash的一些寄存器等。Platform/smdk2410.h定義了與目標板相關的資源配置參數,修改波特率、引導參數和物理內存映射等參數即可配置目標板。(5)init:此目錄只有main.c和version.c兩個文件。與普通的C程序一樣,VIVI將從main函數開始執(zhí)行。(6)lib:一些平臺公共的接口代碼,比如,time.c里的udelay()和mdelay()。(7)scripts:此目錄存放了配置所需的腳本文件,如Menuconfig和Configure文件,以方便對VIVI的配置。

VIVI的運行也可以分為兩個階段。在第一階段完成含有依賴于CPU體系結構硬件初始化的代碼,利用匯編語言完成。第二階段是用C語言完成的。即在VIVI中以head.S作為第一階段,main()作為第二階段。在跳轉進main()函數之前,利用匯編語言編寫了一段trampoline程序作為階段2可執(zhí)行鏡像的執(zhí)行入口點。之后可以在trampoline中用處理器的跳轉指令進入main()函數中去執(zhí)行。當main()函數返回時,CPU就進行復位。VIVI的程序代碼請參考本書提供的光盤:\2410s\exp\bootloader\vivi\arch\s3c2410的文件夾中的head.S程序,VIVI的下載燒寫在4.7節(jié)詳細介紹。3.配置和編譯vivi

如果vivi的源代碼已根據開發(fā)板作了相應改動,則需要對源代碼進行配置和編譯,以生成燒入flash的vivi二進制映象文件。

由于vivi要用到kernel的一些頭文件,所以需要kernel的源代碼,所以先要把linux的kernel準備好。將vivi和kernel都解到相應目錄下(例如將光盤提供的vivi源代碼解壓到/home/xiongmh目錄下,光盤提供的Linuxkernel源碼kernel-h2410eb.041024.tar.gz也解壓到/home/xiongmh目錄下,解壓后的文件名為kerne-h2410eb)。然后需修改/vivi/Makefile文件中的一些變量設置:

LINUX_INCLUDE_DIR=/kernel/include/修改為:

LINUX_INCLUDE_DIR=/home/xiongmh/kerne-h2410eb/include/?CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-修改為:

CROSS_COMPILE=/usr/local/arm/2.95.3/bin/arm-linux-ARM_GCC_LIBS=/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3進入/vivi目錄執(zhí)行makedistclean。(目的是確保編譯的有效性,在編譯之前將vivi里所有的“*.o”和“*.o.flag”文件刪掉)

進入/vivi目錄里,輸入makemenuconfig,開始選擇配置。也可用Load裝入一個寫好的配置文件。注意,選Exit退出時一定要選“Yes”保存配置。再輸入make正式開始編譯直至完成。如果不報錯,配置和編譯得到的“vivi”在/vivi的文件夾中。這個就是后面要燒寫到flash中的bootloader。4.1.4vivi代碼分析vivi的運行也可以分為兩個階段:

1.vivi的第一階段完成含依賴于CPU的體系結構硬件初始化的代碼,包括禁止中斷、初始化串口、復制自身到RAM等。相關代碼集中在head.S(\vivi\arch\s3c2410目錄下):

Head.S:

#include"config.h"#include"linkage.h"#include"machine.h"@StartofexecutablecodeENTRY(_start)ENTRY(ResetEntryPoint)@@Exceptionvectortable(physicaladdress=0x00000000);異常向量表物理地址@@0x00:Reset;復位bReset@0x04:Undefinedinstructionexception;未定義的指令異常UndefEntryPoint:bHandleUndef@0x08:Softwareinterruptexception;軟件中斷異常SWIEntryPoint:bHandleSWI@0x0c:PrefetchAbort(InstructionFetchMemoryAbort);內存操作異常PrefetchAbortEnteryPoint:bHandlePrefetchAbort@0x10:DataAccessMemoryAbort;數據異常DataAbortEntryPoint:bHandleDataAbort@0x14:Notused;未使用NotUsedEntryPoint:bHandleNotUsed@0x18:IRQ(InterruptRequest)exception;慢速中斷處理IRQEntryPoint:bHandleIRQ@0x1c:FIQ(FastInterruptRequest)exception;快速中斷處理FIQEntryPoint:bHandleFIQ@VIVImagics@@0x20:magicnumbersowecanverifythatweonlyput.long0@0x24:.long0@0x28:wherethisviviwaslinked,sowecanputitinmemoryintherightplace.long_start@0x2C:thiscontainstheplatform,cpuandmachineid.longARCHITECTURE_MAGIC@0x30:vivicapabilities.long0#ifdefCONFIG_PM;vivi考慮不需要使用電源管理@0x34:bSleepRamProc#endif#ifdefCONFIG_TEST@0x38:bhmi#endif@@StartVIVIhead@Reset:@disablewatchdogtimer;禁止看門狗計時器movr1,#0x53000000;WTCON寄存器地址是0x53000000,清0movr2,#0x0strr2,[r1]#ifdefCONFIG_S3C2410_MPORT3;不符合條件,跳到下面的關中斷/****在/vivi/include/autoconf.h中#undefCONFIG_S3C2410_MPORT3******/movr1,#0x56000000;GPACON寄存器地址是0x56000000movr2,#0x00000005strr2,[r1,#0x70];配置GPHCON寄存器movr2,#0x00000001strr2,[r1,#0x78];配置GPHUP寄存器movr2,#0x00000001strr2,[r1,#0x74];配置GPHDAT寄存器#endif@disableallinterrupts;禁止全部中斷movr1,#INT_CTL_BASEmovr2,#0xffffffffstrr2,[r1,#oINTMSK];掩碼關閉所有中斷2.vivi的第二階段vivi的第二階段是從main()函數開始,同一般的C語言程序一樣,該函數在/init/main.c文件中,總共可以分為8個步驟。(1)函數開始,通過putstr(vivi_banner)打印出vivi的版本。Vivi_banner在/init/version.c文件中定義(2)對開發(fā)板進行初始化(board_init函數),board_init是與開發(fā)板緊密相關的,這個函數在/arch/s3c2410/smdk.c文件中。開發(fā)板初始化主要完成兩個功能,時鐘初始化(init_time())和通用IO口設置(set_gpios())。voidset_gpios(void){GPACON=vGPACON;GPBCON=vGPBCON;GPBUP=vGPBUP;GPCCON=vGPCCON;GPCUP=vGPCUP;GPDCON=vGPDCON;GPDUP=vGPDUP;GPECON=vGPECON;GPEUP=vGPEUP;GPFCON=vGPFCON;GPFUP=vGPFUP;GPGCON=vGPGCON;GPGUP=vGPGUP;GPHCON=vGPHCON;GPHUP=vGPHUP;EXTINT0=vEXTINT0;EXTINT1=vEXTINT1;EXTINT2=vEXTINT2;}其中,GPIO口在smdk2410.h(\vivi\include\platform\目錄下)文件中定義。(3)內存映射初始化和內存管理單元的初始化工作:

mem_map_init();mmu_init();這兩個函數都在/arch/s3c2410/mmu.c文件中。voidmem_map_init(void){#ifdefCONFIG_S3C2410_NAND_BOOTmem_map_nand_boot();#elsemem_map_nor();#endifcache_clean_invalidate();tlb_invalidate();}如果配置vivi時使用了NAND作為啟動設備,則執(zhí)行mem_map_nand_boot(),否則執(zhí)行mem_map_nor()。這里要注意的是,如果使用NOR啟動,則必須先把vivi代碼復制到RAM中。這個過程是由copy_vivi_to_ram()函數來完成的。代碼如下:

staticvoidcopy_vivi_to_ram(void){putstr_hex("Evacuating1MBofFlashtoDRAMat0x",VIVI_RAM_BASE);memcpy((void*)VIVI_RAM_BASE,(void*)VIVI_ROM_BASE,VIVI_RAM_SIZE);}VIVI_RAM_BASE、VIVI_ROM_BASE、VIVI_RAM_SIZE這些值都可以在smdk2410.h中查到,并且這些值必須根據自己開發(fā)板的RAM實際大小修改。這也是在移植vivi的過程中需要注意的一個地方。mmu_init()函數中執(zhí)行了arm920_setup函數。這段代碼是用匯編語言實現的,針對arm920t核的處理器。(4)初始化堆棧,heap_init()。(定義在\vivi\lib\heap.c文件中)

intheap_init(void){returnmmalloc_init((unsignedchar*)(HEAP_BASE),HEAP_SIZE);}(5)初始化mtd設備,mtd_dev_init()。intmtd_init(void){intret;#ifdefCONFIG_MTD_CFIret=cfi_init();#endif#ifdefCONFIG_MTD_SMCret=smc_init();#endif#ifdefCONFIG_S3C2410_AMD_BOOTret=amd_init();#endifif(ret){mymtd=NULL;returnret;}return0;}這幾個函數可以在/drivers/mtd/maps/s3c2410_flash.c里找到。(6)初始化私有數據,init_priv_data()。(定義在\vivi\lib\priv_data\rw.c文件中)

(7)初始化內置命令,init_builtin_cmds()。通過add_command函數,加載vivi內置的幾個命令。(8)啟動boot_or_vivi()。啟動成功后,將通過vivi_shell()啟動一個shell(如果配置了CONFIG_SERIAL_TERM),此時vivi的任務完成。4.2嵌入式Linux根文件系統(tǒng)構建4.2.1Linux文件系統(tǒng)介紹

理論上說一個嵌入式設備如果內核能夠運行起來,且不需要運行用戶進程的話,是不需要文件系統(tǒng)的,文件系統(tǒng)簡單的說就是一種目錄結構,由于linux操作系統(tǒng)的設備在系統(tǒng)中是以文件的形式存在,將這些文件進行分類管理以及提供和內核交互的接口,就形成一定的目錄結構也就是文件系統(tǒng),文件系統(tǒng)是為用戶反映系統(tǒng)的一種形式,為用戶提供一個檢測控制系統(tǒng)的接口。

根文件系統(tǒng),我認為根文件系統(tǒng)就是一種特殊的文件系統(tǒng),那么根文件系統(tǒng)和普通的文件系統(tǒng)有什么區(qū)別呢?由于根文件系統(tǒng)是內核啟動時掛在的第一個文件系統(tǒng),那么根文件系統(tǒng)就要包括Linux啟動時所必須的目錄和關鍵性的文件,例如Linux啟動時都需要有init目錄下的相關文件,在Linux掛載分區(qū)時Linux一定會找/etc/fstab這個掛載文件等,根文件系統(tǒng)中還包括了許多的應用程序bin目錄等,任何包括這些Linux系統(tǒng)啟動所必須的文件都可以成為根文件系統(tǒng)。圖4.3Linux系統(tǒng)結構Linux支持多種文件系統(tǒng),包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,為了對各類文件系統(tǒng)進行統(tǒng)一管理,Linux引入了虛擬文件系統(tǒng)VFS(VirtualFileSystem),為各類文件系統(tǒng)提供一個統(tǒng)一的操作界面和應用編程接口。如4.3所示的Linux系統(tǒng)結構圖。Linux啟動時,第一個必須掛載的是根文件系統(tǒng);若系統(tǒng)不能從指定設備上掛載根文件系統(tǒng),則系統(tǒng)會出錯而退出啟動。之后可以自動或手動掛載其他的文件系統(tǒng)。因此,一個系統(tǒng)中可以同時存在不同的文件系統(tǒng)。不同的文件系統(tǒng)類型有不同的特點,因而根據存儲設備的硬件特性、系統(tǒng)需求等有不同的應用場合。在嵌入式Linux應用中,主要的存儲設備為RAM(DRAM,SDRAM)和ROM(常采用FLASH存儲器),常用的基于存儲設備的文件系統(tǒng)類型包括:jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。4.2.2根文件系統(tǒng)的目錄結構內核啟動的最后步驟是掛載根文件系統(tǒng),包含:Init進程、Shell、文件系統(tǒng)、網絡系統(tǒng)等等的工具集、系統(tǒng)配置文件和鏈接庫等。根文件系統(tǒng)是由目錄、Shell、庫、腳本等組成,根文件系統(tǒng)根目錄下除了可能的標準的系統(tǒng)引導映象/vmlinuz外一般不含任何文件,所有其他文件是在根文件系統(tǒng)的子目錄中。嵌入式根文件系統(tǒng)要包含了一些必須有的目錄,如:/dev、/bin、/usr、/sbin、/lib、/etc、/proc、/sys。下面介紹根文件系統(tǒng)中的主要子目錄。/bin:必要的用戶命令(二進制文件)。*/boot:引導加載程序使用的靜態(tài)文件。/dev:設備文件及其他特殊文件。/etc:系統(tǒng)配置文件。*/home:用戶主目錄。/lib:必要的鏈接庫,例如:C鏈接庫、內核模塊。/mnt:臨時掛載的文件系統(tǒng)的掛載點。*/opt:附加軟件的安裝目錄。proc:提供內核和進程信息的proc文件系統(tǒng)。*/root:root用戶主目錄。sbin:必要的系統(tǒng)管理員命令。tmp:臨時文件目錄。usr:大多數用戶使用的應用程序和文件目錄。var:監(jiān)控程序和工具程序存放的可變數據。注意:“*”目錄在嵌入式Linux上為可選的。(1)/dev目錄在/dev目錄中,包括設備文件及其他特殊文件,當配置內核支持設備文件系統(tǒng)devfs時,此目錄中的設備節(jié)點由內核和驅動程序自動創(chuàng)建??稍?dev目錄下用ls命令查看該目錄下的內容。(2)/lib目錄在/lib目錄下,包括了glibc鏈接庫,glibc存放系統(tǒng)必要的動態(tài)鏈接庫,支持系統(tǒng)的正常啟動,包括:①ld :動態(tài)鏈接器。②libc :主C鏈接器進程。③libm:數學進程,在數學函數中需要用到。④ibcrypt :密碼學進程,多數涉及認證的應用程序中需要使用。完整說明參見glibc使用手冊,相應的連接庫可以從編譯器的lib目錄下拷取。(3)/lib目錄在etc目錄包含很多文件。主要的子目錄如下。①/etc/rc、/etc/rc.d、/etc/rc*.d:啟動、或改變運行時運行的scripts或scripts的目錄。

②/etc/passwd:用戶數據庫,其中的域給出了用戶名、真實姓名、家目錄、加密的口令和用戶的其他信息。

③/etc/fstab:啟動時mount-a命令(在/etc/rc或等效的啟動文件中)自動mount的文件系統(tǒng)列表。

④/etc/inittab:nit的配置文件。

⑤/etc/login.defs:login命令的配置文件。

⑥/etc/profile:登錄時執(zhí)行的文件。系統(tǒng)管理員可為所有用戶建立全局缺省環(huán)境。

⑦/etc/securetty:確認安全終端,即哪個終端允許root登錄。⑧/etc/shells:列出可信任的shell。chsh命令允許用戶在本文件指定范圍內改變登錄shell4.2.3使用Busybox生成工具集Busybox在設計上就充分考慮了硬件資源受限的特殊工作環(huán)境,采用一種很巧妙的辦法減少自己的體積,即所有的命令都通過“插件”的方式集中到一個可執(zhí)行文件中,在實際應用過程中通過不同的符號鏈接來確定到底要執(zhí)行哪個操作。采用單一執(zhí)行文件的方式最大限度地共享了程序代碼,甚至連文件頭、內存中的程序控制塊等其他操作系統(tǒng)資源都共享了,對于資源比較緊張的系統(tǒng)來說,真是最合適不過了。在busybox的編譯過程中,可以非常方便地加減它的“插件”,最后的符號鏈接也可以由編譯系統(tǒng)自動生成。1.Busybox的配置和交叉編譯Busybox的編譯過程與內核的編譯過程很接近,都是先makemenuconfig進行配置,然后在make進行編譯。(1)從/downloads/下載busybox工具。這里選擇busybox-1.1.0.tar.bz2(注:交叉編譯器用arm-linux-gcc3.4.1/3.3.2)。(2)解壓busybox-1.1.0.tar.bz2,使用命令是:tarjxvfbusybox-1.1.0.tar.bz2。(3)進入busybox目錄,修改Makefile中的ARCH和CROSS_COMPILE,改成:ARCH?=armCROSS_COMPILE?=/usr/local/arm/3.4.1/bin/arm-linux-當然CROSS_COMPILE可由開發(fā)者的編譯器位置決定。(4)Makemenuconfig進行配置,可以選擇靜態(tài)編譯,如果是動態(tài)編譯則要拷貝相應的庫文件,默認配置保存即可。圖4.3配置菜單1.選擇Busybox的編譯方式:BuildOptionsBuildBusyBoxasastaticbinary(nosharedlibs)缺省配置為使用鏈接庫。2.配置交叉編譯器:BuildOptions[*]DoyouwanttobuildBusyBoxwithaCrossCompiler?(/usr/local/arm/3.4.1/bin/arm-linux-)CrossCompilerprefix3.安裝路徑:InstallationOptions(./_install)BusyBoxinstallationprefix4.配置其他工具集:ArchivalUtilitiesCoreutilsConsoleUtilitiesDebianUtilitieEditorsFindingUtilitiesInitUtilitiesLogin/PasswordManagementUtilitiesMiscellaneousUtilitiesLinuxModuleUtilitiesNetworkingUtilitiesProcessUtilitiesShellsSystemLoggingUtilitiesLinuxSystemUtilitiesInitUtilities[*]init[*]Supportreadinganinittabfile?[*]Supportrunninginitfromwithinaninitrd?5.配置其他工具集:●ArchivalUtilities工具:tar、zip、unzip●Coreutils

常用命令:basenamecatchgrpchmoddatedddfechoenvlnlsmkdirmknodmvpwdrmrmdirsleepsortsyncwcwhoami等等。●Editors編輯命令:viawksed等。●FindingUtilities查找命令:findgrepxargs●Login/PasswordManagementUtilitiesLogin:gettyloginpasswd●NetworkingUtilities

網絡命令集:hostnameifconfiginetdnetstatpingroute●ProcessUtilities進程命令:freepssysctltop●Shellsshell工具:ash等●SystemLoggingUtilities

日志工具:syslogdklogd

●LinuxSystemUtilities

系統(tǒng)工具:dmesgfdiskgetoptmoremountumount(5)#makedep(6)#make(7)#makeinstall之后,在busybox目錄下生成_install文件夾。其結構(_install)為:/bin/linuxrc/sbin/usr/usr/bin/usr/sbin也可用makeallinstall命令完成編譯。2.文件系統(tǒng)打包用Busybox配置和交叉編譯創(chuàng)建的根文件系統(tǒng)還需用cramfs工具對根文件系統(tǒng)進行打包成root.cramfs文件。步驟如下。(1)從/cramfs/下載cramfs工具。(2)解壓cramfs-1.1.tar.gz使用命令:tarzxvfcramfs-1.1.tar.gz。(3)進入cramfs工具的根目錄執(zhí)行make。(4)Make后在cramfs工具的根目錄中就會生成一個mkcramfs文件,這就是根文件系統(tǒng)的打包工具。(5)打包,即執(zhí)行命令mkcramfs_installrootfs之后就可產生打包后的根文件系統(tǒng)root.cramfs。4.2.4根文件系統(tǒng)啟動流程KERNEL起來之后,將運行第一個進程init,實際上執(zhí)行的為Busybox的/sbin/init。init的工作是根據/etc/inittab腳本來進行系統(tǒng)的初始化,其格式和命令的含義如下:::runlevels:action:processsysinit:指定運行的第一個程序/腳本。respawn:如果process字段指定的進程不存在,則啟動該進程,init不等待處理結束,而是繼續(xù)掃描inittab文件中的后續(xù)進程,當這樣的進程終止時,init會重新啟動它,如果這樣的進程已存在,則什么也不做。ctrlaltdel:指定在用戶按下Ctrl-Alt-Del時執(zhí)行的命令。shutdown:當系統(tǒng)關機時,執(zhí)行相應的進程。restart:當init重新啟動時,執(zhí)行相應的進程,通常此處所執(zhí)行的進程就是init本身。askfirst:類似respawn,不少系統(tǒng)上執(zhí)行的終端應用程序的數量。注意:加上“-”的語句會在登錄終端之后調用/etc/目錄下的profile文件,而不加“-”的不會執(zhí)行這個腳本。[/etc]catinittab::sysinit:/etc/init.d/rcS::respawn:-/bin/sh::restart:/sbin/inittty2::askfirst:-/bin/sh::ctrlaltdel:/bin/umount-a–r::shutdown:/bin/umount-a–r:shutdown:/sbin/swapoff–a這個inittab執(zhí)行下列動作功能如下:(1)將/etc/init.d/rcS設置成系統(tǒng)的初始化文件。(2)一直啟動shell。(3)在虛擬終端上啟動askfirst動作的shell。(4)如果init重新啟動,將/sbin/init設置成它會執(zhí)行的程序。(5)告訴init,在系統(tǒng)關機或重啟的時候執(zhí)行umount命令卸載所有文件系統(tǒng),并且在卸載失敗時用只讀模式沖新安裝以保護文件系統(tǒng)。init進程運行腳本是/etc/init.d/rcS,在rcS中掛載文件系統(tǒng),并且執(zhí)行腳本/usr/etc/rc.local;在rc.local中繼續(xù)設置,最后運行用戶的啟動運行腳本init.sh。登錄終端之前運行腳本/etc/profile。4.3

Linux內核及啟動過程Linux系統(tǒng)實際上由兩個比較獨立的部分組成,即內核部分和系統(tǒng)部分。通常一個Linux系統(tǒng)的啟動過程如下:首先一個不隸屬于任何操作系統(tǒng)的加載程序將Linux部分內核調入內存,并將控制權交給內存中Linux內核的第一行代碼,加載程序的工作就完成了。此后Linux要將自己的剩余部分全部加載到內存、初始化所有的設備、在內存中建立好所需的數據結構(有關進程、設備、內存等)。到此為止,Linux內核的工作告一段落,內核已經控制了所有硬件設備。至于操作和使用這些硬件設備,則是系統(tǒng)部分任務。內核加載設備并啟動init守護進程,init守護進程會根據配置文件加載文件系統(tǒng)、配置網絡、服務進程、終端等。也就是說,內核部分初始化并控制大部分硬件設備,為內存管理、進程管理、設備讀、寫等工作做好一切準備;系統(tǒng)部分加載必需的設備,配置各種環(huán)境以便用戶可以使用整個系統(tǒng)。4.3.1Linux內核結構Linux內核主要由五個子系統(tǒng)組成:進程調度,內存管理,虛擬文件系統(tǒng),網絡接口,進程間通信?!襁M程調度(SCHED):控制進程對CPU的訪問。當需要選擇下一個進程運行時,由調度程序選擇最值得運行的進程??蛇\行進程實際上是僅等待CPU資源的進程,如果某個進程在等待其它資源,則該進程是不可運行進程。Linux使用了比較簡單的基于優(yōu)先級的進程調度算法選擇新的進程?!駜却婀芾恚∕M):允許多個進程安全的共享主內存區(qū)域。Linux的內存管理支持虛擬內存,即在計算機中運行的程序,其代碼、數據、堆棧的總量可以超過實際內存的大小,操作系統(tǒng)只是把當前使用的程序塊保留在內存中,其余的程序塊則保留在磁盤中。必要時,操作系統(tǒng)負責在磁盤和內存間交換程序塊。內存管理從邏輯上分為硬件無關部分和硬件有關部分。硬件無關部分提供了進程的映射和邏輯內存的對換;硬件相關的部分為內存管理硬件提供了虛擬接口?!裉摂M文件系統(tǒng)(VirtualFileSystem,VFS):隱藏了各種硬件的具體細節(jié),為所有的設備提供了統(tǒng)一的接口,VFS提供了多達數十種不同的文件系統(tǒng)。虛擬文件系統(tǒng)可以分為邏輯文件系統(tǒng)和設備驅動程序。邏輯文件系統(tǒng)指Linux所支持的文件系統(tǒng),如ext2,fat等,設備驅動程序指為每一種硬件控制器所編寫的設備驅動程序模塊。●網絡接口(NET):提供了對各種網絡標準的存取和各種網絡硬件的支持。網絡接口可分為網絡協議和網絡驅動程序。網絡協議部分負責實現每一種可能的網絡傳輸協議。網絡設備驅動程序負責與硬件設備通訊,每一種可能的硬件設備都有相應的設備驅動程序。●進程間通訊(IPC):支持進程間各種通信機制。處于中心位置的進程調度,所有其它的子系統(tǒng)都依賴它,因為每個子系統(tǒng)都需要掛起或恢復進程。一般情況下,當一個進程等待硬件操作完成時,它被掛起;當操作真正完成時,進程被恢復執(zhí)行。例如,當一個進程通過網絡發(fā)送一條消息時,網絡接口需要掛起發(fā)送進程,直到硬件成功地完成消息的發(fā)送,當消息被成功的發(fā)送出去以后,網絡接口給進程返回一個代碼,表示操作的成功或失敗。其他子系統(tǒng)以相似的理由依賴于進程調度。各個子系統(tǒng)之間的依賴關系如下:●進程調度與內存管理之間的關系:這兩個子系統(tǒng)互相依賴。在多道程序環(huán)境下,程序要運行必須為之創(chuàng)建進程,而創(chuàng)建進程的第一件事情,就是將程序和數據裝入內存。●進程間通信與內存管理的關系:進程間通信子系統(tǒng)要依賴內存管理支持共享內存通信機制,這種機制允許兩個進程除了擁有自己的私有空間,還可以存取共同的內存區(qū)域?!裉摂M文件系統(tǒng)與網絡接口之間的關系:虛擬文件系統(tǒng)利用網絡接口支持網絡文件系統(tǒng)(NFS),也利用內存管理支持RAMDISK設備?!駜却婀芾砼c虛擬文件系統(tǒng)之間的關系:內存管理利用虛擬文件系統(tǒng)支持交換,交換進程(swapd)定期由調度程序調度,這也是內存管理依賴于進程調度的唯一原因。當一個進程存取的內存映射被換出時,內存管理向文件系統(tǒng)發(fā)出請求,同時,掛起當前正在運行的進程。除了這些依賴關系外,內核中的所有子系統(tǒng)還要依賴于一些共同的資源。這些資源包括所有子系統(tǒng)都用到的過程。例如:分配和釋放內存空間的過程,打印警告或錯誤信息的過程,還有系統(tǒng)的調試例程等等。Linux內核源代碼位于/usr/src/linux-*.*.*(*.*.*代表內核版本,如2.4.18)目錄下。其中子目錄如下:●/include子目錄包含了建立內核代碼時所需的大部分包含文件,這個模塊利用其他模塊重建內核?!?init

子目錄包含了內核的初始化代碼,這是內核工作的開始的起點?!?arch子目錄包含了所有硬件結構特定的內核代碼。如:i386,alpha和ARM?!?drivers子目錄包含了內核中所有的設備驅動程序,如:塊設備和SCSI設備?!?fs子目錄包含了所有的文件系統(tǒng)的代碼。如:ext2,vfat等。●/net子目錄包含了內核的連網代碼。●/mm子目錄包含了所有內存管理代碼。●/ipc子目錄包含了進程間通信代碼?!?kernel子目錄包含了主內核代碼。在Linux內核的實現中,以下數據結構使用非常頻繁?!駎ask_struct:Linux內核利用task_struct數據結構代表一個進程,用task_struct指針形成一個task數組。當建立新進程的時候,Linux為新的進程分配一個task_struct結構,然后將指針保存在task數組中。調度程序維護current指針,它指向當前正在運行的進程?!駇m_struct:每個進程的虛擬內存由mm_struct結構代表。該結構中包含了一組指向vm-area_struct結構的指針,vm-area_struct結構描述了虛擬內存的一個區(qū)域?!駃node:虛擬文件系統(tǒng)(VFS)中的文件、目錄等均由對應的索引節(jié)點(inode)代表。每個VFS索引節(jié)點中的內容由文件系統(tǒng)專屬的例程提供。VFS索引節(jié)點只存在于內核內存中,實際保存于VFS的索引節(jié)點高速緩存中。如果兩個進程用相同的進程打開,則可以共享inade的數據結構,這種共享是通過兩個進程中數據塊指向相同的inode完成。4.3.2

Linux內核配置、編譯

1.Linux內核的配置系統(tǒng)的組成(1)Makefile:分布在

Linux

內核源代碼中的

Makefile,定義

Linux

內核的編譯規(guī)則?!耥攲?/p>

Makefile

讀取

.config中的配置選項,如:CROSS_COMPILE?=/usr/local/arm-linux/bin/arm-linux-是指定編譯內核所用的編譯器。include

arch/(ARCH)/Makefile包含了特定

CPU

體系結構下的

Makefile,指定了平臺相關的信息。●各個子目錄下的Makefile:比如drivers/Makefile,負責所在子目錄下源代碼的編譯管理。

(2)配置文件:給用戶提供配置選擇的功能?!?config:內核配置文件,包含由用戶選擇的配置選項,用來存放內核配置后的結果(如makemenuconfig)?!馬ules.make:規(guī)則文件,被所有的Makefile使用。

(3)配置工具:包括配置命令解釋器(對配置腳本中使用的配置命令進行解釋)。常用的Linux內核的配置工具按其配置用戶界面的不同主要有以下3種:①基于字符的界面make

config:進入命令行,可以一行一行的配置,但使用不十分方便。②基于

Ncurses

的文本模式圖形用戶界面make

menuconfig:大多數開發(fā)人員使用的Linux內核編譯菜單,使用方便。③基于

Xwindows

圖形界面的用戶配置界面make

xconfig:在2.4.X以及以前版本中xconfig菜單是基于TCL/TK的圖形庫的。2.Linux內核的配置與裁減所有Linux內核配置都是通過Config.in經由不同腳本解釋器產生.config。而目前剛剛推出的2.6.X內核用QT圖形庫。由KConfig經由腳本解釋器產生。這兩版本差別還挺大。2.6.X的xconfig菜單結構清晰,使用也更方便。但基于目前2.4.X版本比較成熟,穩(wěn)定,用的最多。xconfig界面比較友好,易掌握。但它卻沒有menuconfig菜單穩(wěn)定。所以大多數嵌入式開發(fā)人還是使用以2.4.X版本為基礎的menuconfig菜單進行相關Linux內核的配置。在啟動配置菜單后,選擇相應的配置時,有三種選擇方式,它們分別代表的含義如下?!馧——不將該功能編譯進內核●Y——將該功能編譯進內核●M——將該功能編譯成可以在需要時動態(tài)插入到內核中的模塊

從/pub/linux/kernel/v2.4/linux-2.4.24.tar.gz下載內核源碼,然后復制linux-2.4.24.tar.gz到/usr/src目錄下,并解壓linux-2.4.24.tar.gz(tarzxvflinux-2.4.24.tar.gz)。再進入目錄/usr/src/linux-2.4.24,,執(zhí)行makemrproper命令,其目的是清除原先此目錄下殘留的.config和.o文件(object文件),如果是第一次編譯內核,那么這一步就可以省略,但是如果已經編譯過多次內核的話,這一步一定要,不然以后出現很多小問題。而后再執(zhí)行makemenuconfig命令,進入圖形配置界面,可按需要對Linux內核進行配置裁減,如圖4.4所示。下面以Linux2.4.X版本為例詳細介紹使用makemenuconfig對linux內核的配置過程。運行makemenuconfig進入配置界面,各選項如下。(1)Codematurityleveloptions:代碼成熟等級。此處只有一個選項:promptfordevelopmentand/orincompletecode/drivers,若為試驗階段,比如khttpd、IPv6等,則該項選擇Y;否則選擇N。(2)Loadablemodulesupport:對模塊的支持。有三個選項:●Enableloadablemodulesupport:除非準備把所有需要的內容都編譯到內核里面,否則該選項應該是必選的。●SetversioninFORMationonallmodulesymbols:可以不選它。●Kernelmoduleloader:讓內核在啟動時有自己裝入必需模塊的能力,建議選上。(3)SystemType:系統(tǒng)類型。主要選項如下:●Processorfamily:選擇所需CPU類型?!馠ighMemorySupport:大容量內存的支持??芍С值?G、64G,一般可以不選?!馦athemulation:協處理器仿真。現在一般不選?!馦TTRsupport:MTTR支持。可不選?!馭ymmetricmulti-processingsupport:多處理支持。若有多個CPU必選,否則不選。圖4.4makemenuconfig的圖形界面(4)Generalsetup:普通的屬性設置。主要選項如下:●Networkingsupport:網絡支持。必選,即使沒有網卡也建議選上。●PCIsupport:PCI支持。如果使用了PCI的卡,當然必選。●PCIaccessmode:PCI存取模式。有BIOS、Direct和Any選項,一般選Any?!馭upportforhot-pluggabeldevices:熱插拔設備支持。可不選?!馪CMCIA/CardBussupport:PCMCIA/CardBus支持。有PCMCIA,必選?!馭ystemVIPCBSDProcessAccountingSysctlsupport:如果不使用BSD,選缺省。

●PowerManagementsupport:電源管理支持?!馎dvancedPowerManagementBIOSsupport:高級電源管理BIOS支持。(5)MemoryTechnologyDevice(MTD):MTD設備支持??刹贿x。(6)Parallelportsupport并口支持。如果不打算使用并口,就不選。(7)PlugandPlayconfiguration即插即用支持。一般選。(8)Blockdevices塊設備支持。根據配置系統(tǒng)的應用情況來選。(9)Networkingoptions:網絡選項。配置的是網絡協議。通常選中TCP/IPnetworking。(10)TelephonySupport電話支持。linux下可支持電話卡,可在IP上使用普通的電話提供語音服務了。(11)ATA/IDE/MFM/RLLsupport:各種接口的硬盤/光驅/磁帶/軟盤支持的,使用缺省的選項。(12)SCSIsupport:SCSI設備的支持。若沒有SCSI的設備,則不選用。(13)FusionMPTdevicesupport:需要FusionMPT兼容PCI適配器,不用選。(14)I2Cdevicesupport:I2C接口適配器支持。(15)Networkdevicesupport:網絡設備支持。選擇了所用到的網卡時,一般編譯到內核,再選Y。(16)AmateurRadiosupport:配置業(yè)余無線廣播。(17)IrDA(infrared)support:紅外線支持。(18)ISDNsubsystem:如果使用ISDN上網,則必選。(19)OldCD-ROMdrivers(notSCSI、notIDE):若用IDE的CD-ROM可不用選。(20)Characterdevices:字符設備。一般使用缺省設置,可按需要修改。(21)Filesystems:文件系統(tǒng)。一般使用缺省設置,可按需要修改。(22)Consoledrivers:控制臺驅動。一般使用VGAtextconsole,標準的80*25的文本控制臺。(23)Sound:聲卡驅動。最好在列表中選擇所用的聲卡驅動,否則就試用OSS。(24)USBsupprot:USB支持。按需要選擇。(25)Kernelhacking:配置了這項,即使在系統(tǒng)崩潰時,也可以進行一定的工作了。普通用戶是用不著這個功能的。配置完后,存盤退出。3.Linux內核的編譯在完成內核的裁減之后,內核的編譯就只要執(zhí)行以下幾條命令:●makedep:對內核原代碼的文件進行完整性和依賴性進行檢驗,確保關鍵文件在正確的位置?!駇akeclean:編譯內核之前先把環(huán)境給清理干凈。有時也可用makerealclean或makemrproper來徹底清除相關依賴,保證沒有不正確的.o文件存在?!駇akezImage:創(chuàng)建內核鏡像文件●makemodules:創(chuàng)建內核模塊,若不創(chuàng)建內核模塊,這步可以不要。下面是進行makemodules_install的操作,安裝module的過程如下。(1)cp/usr/src/linux/arch/i386/boot/bzImage/boot/bzImage-2.4.24。拷貝新內核文件“/usr/src/linux/arch/i386/boot/bzImage”到啟動目錄,并改為合適的名字。(2)makeinstall:把相關文件拷貝到默認的目錄。在給嵌入式設備編譯時這步可以不要。因為具體的內核安裝還需要你手工進行。(3)修改/boot/grub/grub.conf文件的內容,如下:default=0timeout=30splashimage=(hd0,6)titleRedHatLinux(2.4.20-8)root(hd0,0)kernel/vmlinuz-2.4.20-8roroot=/LABEL/initrd/initrd-2.4.20-8.imgtitleRedHatLinux(2.4.24)root(hd0,0)kernelvmlinuz-2.4.24roroot=/dev/hda0initrd/initrd-2.4.24.img

設置完成,然后就可以重啟計算機,看是否能進入新編譯的內核了。4.3.3基于ARM開發(fā)板的Linux內核移植1.Linux移植準備●先到.uk上下載Linux2.6.0內核及其關于ARM平臺的補?。ㄈ纾篜atch-2.6.0-rmk1.gz)?!窠oLinux2.6.0打補?。簔cat../patch-2.6.0-rmk1.gz|patch–p1(前面../表示補丁文件放在內核文件上一層目錄)●準備交叉編譯環(huán)境。交叉編譯環(huán)境工具鏈一般包括binutils(含AS匯編器,LD鏈接器等),arm-gcc,glibc等?!裥薷膬群四夸浵碌膍akefile文件,主要是以下幾行:注釋掉ARCH:=$(shelluname–m|sed–es/i.86/i386/-es/sun4u/sparc64/-es/arm.*/arm/-es/sa110/arm/)這一行。ARCH:=改為ARCH:=armCROSS_COMPILE:=改為CROSS_COMPILE=交叉編譯工

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論