




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第3章嵌入式系統(tǒng)設計主要內容1、Bootloader詳解及制作
嵌入式系統(tǒng)的存儲器結構Bootloader簡介Bootloader啟動常用Bootloader介紹Bootloader制作2、內核剪裁與編譯Linux內核功能結構Linux內核源代碼布局Linux內核的移植Linux的編譯和定制內核剪裁與編譯實例2主要內容3、根文件系統(tǒng)的構造根文件系統(tǒng)文件系統(tǒng)類型BusyBox根文件系統(tǒng)目錄結構根文件系統(tǒng)制作要點根文件系統(tǒng)制作實例制作根文件系統(tǒng)鏡像4、應用程序移植3存儲器系統(tǒng)的層次結構計算機系統(tǒng)的存儲器被組織成一個6個層次的金字塔形的層次結構。位于整個層次結構的最頂部S0層為CPU內部存放器S1層為芯片內部的高速緩存〔cache〕內存S2層為芯片外的高速緩存〔SRAM、DRAM、DDRAM〕S3層為主存儲器〔Flash、PROM、EPROM、EEPROM〕S4層為外部存儲器〔磁盤、光盤、CF、SD卡〕S5層為遠程二級存儲〔分布式文件系統(tǒng)、Web效勞器〕嵌入式系統(tǒng)的存儲器4存儲器系統(tǒng)的層次結構圖嵌入式系統(tǒng)的存儲器5在這種存儲器分層結構中,上面一層的存儲器作為下一層存儲器的高速緩存。CPU存放器就是cache的高速緩存,存放器保存來自cache的字;cache又是內存〔芯片外的高速緩存〕層的高速緩存,從內存中提取數(shù)據(jù)送給CPU進行處理,并將CPU的處理結果返回到內存中;內存〔芯片外的高速緩存〕又是主存儲器的高速緩存,它將經(jīng)常用到的數(shù)據(jù)從Flash等主存儲器中提取出來,放到內存中,從而加快了CPU的運行效率。嵌入式系統(tǒng)的存儲器6嵌入式系統(tǒng)的存儲器在這種存儲器分層結構中,上面一層的存儲器作為下一層存儲器的高速緩存。嵌入式系統(tǒng)的主存儲器容量是有限的,磁盤、光盤或CF、SD卡等外部存儲器用來保存大信息量的數(shù)據(jù)。在某些帶有分布式文件系統(tǒng)的嵌入式網(wǎng)絡系統(tǒng)中,外部存儲器就作為其他系統(tǒng)中被存儲數(shù)據(jù)的高速緩存。7存儲器部件的分類1.按在系統(tǒng)中的地位分類在微機系統(tǒng)中,存儲器可分為主存儲器〔MainMemory簡稱內存或主存〕和輔助存儲器〔AuxiliaryMemory,SecondaryMemory,簡稱輔存或外存〕。嵌入式系統(tǒng)的存儲器8主存儲器〔簡稱內存或主存〕:內存是計算機主機的一個組成局部,一般都用快速存儲器件來構成,內存的存取速度很快,但內存空間的大小受到地址總線位數(shù)的限制。內存通常用來容納當前正在使用的或要經(jīng)常使用的程序和數(shù)據(jù),CPU可以直接對內存進行訪問。系統(tǒng)軟件中如引導程序、監(jiān)控程序或者操作系統(tǒng)中的根本輸入/輸出局部BIOS都是必須常駐內存。更多的系統(tǒng)軟件和全部應用軟件那么在用到時由外存?zhèn)魉偷絻却妗?輔助存儲器〔簡稱輔存或外存〕:外存也是用來存儲各種信息的,存放的是相對來說不經(jīng)常使用的程序和數(shù)據(jù),其特點是容量大。外存總是和某個外部設備相關的,常見的外存有軟盤、硬盤、U盤、光盤等。CPU要使用外存的這些信息時,必須通過專門的設備將信息先傳送到內存中。10存儲器部件的分類2.按存儲介質分類根據(jù)存儲介質的材料及器件的不同,可分為磁存儲器〔MagneticMemory〕,半導體存儲器、光存儲器〔OpticalMemory〕及激光光盤存儲器〔LaserOpticalDisk〕。11存儲器部件的分類3.按信息存取方式分類存儲器按存儲信息的功能,分為:隨機存取存儲器〔RandomAccessMemory,RAM〕只讀存儲器〔ReadOnlyMemory,ROM〕。12常見的嵌入式系統(tǒng)存儲設備隨機存取存儲器〔RAM〕只讀存儲器〔ROM〕FlashMemory小型快速閃存卡〔CompactFlash,CF卡〕平安數(shù)據(jù)卡〔SecureDigitalCard,SD卡〕硬盤存儲器131.隨機存取存儲器〔RAM〕:隨機存取存儲器是一種在機器運行期間可讀、可寫的存儲器,且存取的速度與存儲單元的位置無關的存儲器,又稱讀寫存儲器。RAM通常都是在掉電之后就喪失數(shù)據(jù),主要用于存儲短時間使用的程序。141.隨機存取存儲器〔RAM〕:隨機存儲器按信息存儲的方式,可分為:靜態(tài)RAM〔StaticRAM,SRAM〕動態(tài)RAM〔DynamicRAM,DRAM〕雙倍速率RAM〔DoubleDataRateSDRAM,DDRAM〕15靜態(tài)RAM〔SRAM〕:SRAM速度非???,是目前讀寫最快的存儲設備了,但是它也非常昂貴,所以只在要求很苛刻的地方使用,譬如CPU的一級緩沖,二級緩沖。動態(tài)RAM〔DRAM〕:DRAM保存數(shù)據(jù)的時間很短,速度也比SRAM慢,不過它還是比任何的ROM都要快,但從價格上來說DRAM相比SRAM要廉價很多,計算機內存就是DRAM的。16雙倍速率RAM〔DDRAM〕:DDRAM是RAM的下一代產(chǎn)品。是在SDRAM內存根底上開展而來的,仍然沿用SDRAM生產(chǎn)體系,但運用了更先進的同步電路等。DDR本質上不需要提高時鐘頻率就能加倍提高SDRAM的速度,它允許在時鐘脈沖的上升沿和下降沿讀出數(shù)據(jù),因而其速度是標準SDRAM的兩倍。SDRAM,SynchronousDynamicRandomAccessMemory,同步動態(tài)隨機存儲器17例:軟件一般放在EEPROM中,我們打,有些最后撥打的號碼,暫時是存在SRAM中的,不是馬上寫入保存在EEPROM中通話記錄,因為當時有很重要工作〔通話〕要做,如果寫入,漫長的等待是讓用戶忍無可忍的。182.只讀存儲器〔ROM〕:在機器運行期間只能讀出信息,不能隨時寫入信息的存儲器稱為只讀存儲器。ROM在系統(tǒng)停止供電的時候仍然可以保持數(shù)據(jù)。ROM在燒入數(shù)據(jù)后,無需外加電源來保存數(shù)據(jù),斷電后數(shù)據(jù)不喪失,但速度較慢,適合存儲需長期保存的不變數(shù)據(jù)。19常見的只讀存儲器〔ROM〕有:掩模ROM〔MaskROM〕可編程ROM〔ProgrammableROM,PROM〕可擦寫ROM〔ErasableProgrammableROM,EPROM〕電可擦除可編程ROM〔EEPROM,也可表示為E2PROM〕FlashROM〔閃速存儲器〕20MaskROM一次性由廠家寫入數(shù)據(jù)的ROM,用戶無法修改。PROM出廠時廠家并沒有寫入數(shù)據(jù),而是保存里面的內容為全0或全1,由用戶來編程一次性寫入數(shù)據(jù)。即PROM是一次性的,也就是軟件灌入后,就無法修改了,EPROM可以通過紫外光的照射,擦掉原先的程序,芯片可重復擦除和寫入。21E2PROM是通過加電擦除原編程數(shù)據(jù),通過高壓脈沖可以寫入數(shù)據(jù),寫入時間較長。FlashROM斷電不會喪失數(shù)據(jù),可快速讀取,電可擦寫可編程。223.FlashMemory〔閃速存儲器〕是一種非易失性存儲器NVM〔Non-VolatileMemory〕,它結合了ROM和RAM的長處,不僅具備電子可擦除可編程〔EEPROM〕的性能,還不會斷電喪失數(shù)據(jù),同時可以快速讀取數(shù)據(jù)〔NVRAM的優(yōu)勢〕。U盤和MP3里用的就是這種存儲器。23FlashMemory〔閃速存儲器〕在過去的20年里,嵌入式系統(tǒng)一直使用ROM〔EPROM〕作為它們的存儲設備,然而近年來Flash全面代替了ROM〔EPROM〕在嵌入式系統(tǒng)中的地位,用作存儲Bootloader以及操作系統(tǒng)或者程序代碼或者直接當硬盤使用〔U盤〕。目前Flash主要有兩種NORFlash和NADNFlash。24FlashMemory〔閃速存儲器〕FlashMemory在物理結構上分成假設干個區(qū)塊,區(qū)塊之間相互獨立。NORFlash把整個存儲區(qū)分成假設干個扇區(qū)〔Sector〕,而NANDFlash把整個存儲區(qū)分成假設干個塊〔Block〕,可以對以塊或扇區(qū)為單位的內存單元進行擦寫和再編程。25NORFlashNOR的特點是芯片內執(zhí)行,這樣應用程序可以直接在flash閃存內運行,不必再把代碼讀到系統(tǒng)RAM中。NOR的傳輸效率很高,在1~4MB的小容量時具有很高的本錢效益,但是很低的寫入和擦除速度大大影響了它的性能。26NANDFlash沒有采取內存的隨機讀取技術,它的讀取是以一次讀取一塊的形式來進行的,通常是一次讀取512個字節(jié)。NAND結構能提供極高的單元密度,可以到達高存儲密度,并且寫入和擦除的速度也很快,采用這種技術的Flash比較廉價。用戶不能直接運行NANDFlash上的代碼,應用NAND的困難在于flash的管理和需要特殊的系統(tǒng)接口。一般小容量的用NORFlash,因為其讀取速度快,多用來存儲操作系統(tǒng)等重要信息,而大容量的用NANDFLASH。27NORFlash和NANDFlash的比照:〔1〕、讀寫性能比照flash閃存是非易失存儲器,可以對稱為塊的存儲器單元塊進行擦寫和再編程。任何flash器件的寫入操作只能在空或已擦除的單元內進行,所以大多數(shù)情況下,在進行寫入操作之前必須先執(zhí)行擦除。NAND器件執(zhí)行擦除操作是十分簡單的,而NOR那么要求在進行擦除前先要將目標塊內所有的位都寫為0。
28NORFlash和NANDFlash的比照:〔1〕、讀寫性能比照NORFlash擦除時是以64~128KB為單位的塊進行的,執(zhí)行一個寫入/擦除操作的時間為5s,NANDFlash擦除是以8~32KB的塊進行的,執(zhí)行相同的操作最多只需要4ms。NANDFlash的寫入速度比NORFlash快很多。NORFlash的讀速度比NANDFlash稍快一些,NANDFlash的隨機讀取能力差,適合大量數(shù)據(jù)的連續(xù)讀取。29除了NORFlash的讀,F(xiàn)lashMemory的其他操作不能像RAM那樣,直接對目標地址進行總線操作。例如執(zhí)行一次寫操作,它必須輸入一串特殊的指令〔NORFlash〕,或者完成一段時序〔NANDFlash〕才能將數(shù)據(jù)寫入到FlashMemory中。30NORFlash和NANDFlash的比照:〔2〕、接口比照NORFlash帶有SRAM接口,有足夠的地址引腳來尋址,可以很容易地存取其內部的每一個字節(jié)。NANDFlash地址、數(shù)據(jù)和命令共用8位/16位總線,每次讀寫都要使用復雜的I/O接口串行地存取數(shù)據(jù),8位/16位總線用來傳送控制、地址和數(shù)據(jù)信息。NAND讀和寫操作采用512字節(jié)的塊,這一點有點像硬盤管理此類操作,很自然地,基于NAND的存儲器就可以取代硬盤或其他塊設備。
31NORFlash和NANDFlash的比照:〔3〕、容量和本錢比照NANDflash的單元尺寸幾乎是NOR器件的一半,由于生產(chǎn)過程更為簡單,NAND結構可以在給定的模具尺寸內提供更高的容量,也就相應地降低了價格。
NORflash占據(jù)了容量為1~16MB閃存市場的大局部,而NANDFlash用在8MB以上的產(chǎn)品當中。在價格方面,NorFlash相比NandFlash來說較高。32NORFlash和NANDFlash的比照:〔4〕、可靠性性比照所有FlashMemory器件存在位交換現(xiàn)象。FlashMemory在讀寫數(shù)據(jù)過程中,偶然會產(chǎn)生一位或幾位數(shù)據(jù)錯誤,即位反轉〔一個bit位發(fā)生翻轉〕。位反轉無法防止,只能通過其他手段對產(chǎn)生的結果進行事后處理。位反轉的問題多見于NANDFlash,NAND的出現(xiàn)幾率要比NorFlash大得多。NANDFlash的供貨商建議使用NANDFlash的時候,同時使用EDC/ECC〔錯誤探測/錯誤糾正〕算法,以確??煽啃?。33如目前市場上一片4Mbyte的AM29lv320
NorFlash零售價在20元左右,而一片128MByte的k9f1g08
NandFlash零售價在30元左右。
34NORFlash和NANDFlash的比照:〔4〕、可靠性性比照FlashMemory在使用過程中,可能導致某些區(qū)塊的損壞。區(qū)塊一旦損壞,將無法進行修復。NANDFlash中的壞塊是隨機分布的,尤其是NANDFlash在出廠時就可能存在這樣的壞塊〔已經(jīng)被標識出〕。NANDFlash需要對介質進行初始化掃描以發(fā)現(xiàn)壞塊,并將壞塊標記為不可用。如果對已損壞的區(qū)塊進行操作,可能會帶來不可預測的錯誤。35NORFlash和NANDFlash的比照:〔5〕、應用方面比照NORFlash主要應用在代碼存儲介質中,應用程序可以直接在NORFlash內運行,不需要再把代碼讀到系統(tǒng)RAM中運行。NANDFlash適用于資料存儲。NANDFlash結構可以到達高存儲密度,并且寫入和擦除的速度也很快。NANDFlash讀和寫操作采用512B的塊,類似硬盤管理操作。因此,基于NAND的閃存可以取代硬盤或其他塊設備。36NORFlash和NANDFlash的比照:〔5〕、應用方面比照在NORFlash上運行代碼不需要任何的軟件支持。在NANDFlash上進行同樣操作時,通常需要驅動程序,也就是內存技術驅動程序〔MTD〕。NANDFlash和NORFlash在進行寫入和擦除操作時都需要MTD。37NORFlash和NANDFlash的比照:〔6〕、壽命比照在NANDFlash中每個塊的最大擦寫次數(shù)是一百萬次,而NORFlash的擦寫次數(shù)是十萬次。NANDFlash除了具有10:1的塊擦除周期優(yōu)勢,典型的NANDFlash塊尺寸要比NOR型閃存小8倍,每個NANDFlash的內存塊在給定的時間內刪除次數(shù)要少一些。384.小型快速閃存卡〔CompactFlash,CF卡〕CF卡由美國SanDisc公司開發(fā)的一種1英寸半見方的小型快速閃存卡,它是利用Flash技術的存儲卡。主要供數(shù)字相機和MP3播放機以及個人數(shù)字助理〔PDA〕裝用。有各種不同的存貯容量〔MB〕,其內部結構如以下圖所示。圖CF卡內部結構394.小型快速閃存卡〔CompactFlash,CF卡〕CF卡接口具有PCMCIA-ATA功能,可以工作在IDE接口模式,也可以工作在PCCard模式。衍生出來的CF+卡物理規(guī)格和CF完全相同,在手持設備上應用,如CF串口卡、CFModem.CF藍牙、CFUSB卡、CF網(wǎng)卡、CFGPS卡、CFGPRS卡等。按照CF+卡標準,它不一定要支持ATA接口。通常建議CF+卡工作在PCMCIA模式。CF卡可以看作是PCMCIA卡的一個子集,可以通過物理上的轉換器,直接轉換成PCMCIA卡使用。CF卡可分為I型和II型兩類,二者的規(guī)格和特性根本相同,只是II型比I型略厚一些〔5.0mm,3.3mm〕,II型插座可以同時兼容I型卡。405.平安數(shù)據(jù)卡〔SecureDigitalCard,SD卡〕由日本Panasonic公司、TOSHIBA公司和美國SanDisk公司共同開發(fā)研制的SD卡是一種全新的存儲卡產(chǎn)品,在MP3、數(shù)碼攝像機、數(shù)碼相機、電子圖書及AV器材等中應用。SD存儲卡采用一個完全開放的標準〔系統(tǒng)〕,外形與MultiMedia卡保持一致,比MMC卡略厚,具有更大的容量,兼容MMC卡接口標準。SD卡具有加密功能,可以保證數(shù)據(jù)資料的平安保密。SD卡具有版權保護技術,所采用的版權保護技術是DVD中使用的CPRM技術〔可刻錄介質內容保護〕。416.硬盤存儲器硬盤存儲器具有存儲容量大,使用壽命長,存取速度較快的特點,也是在嵌入式系統(tǒng)中常用的外存。426.硬盤存儲器硬盤存儲器的硬件包括硬盤控制器〔適配器〕、硬盤驅動器以及連接電纜。硬盤控制器〔HardDiskController,簡稱HDC〕對硬盤進行管理,并在主機和硬盤之間傳送數(shù)據(jù)。硬盤控制器以適配卡的形式插在主板上或直接集成在主板上,然后通過電纜與硬盤驅動器相連。硬盤驅動器〔HardDiskDrive,簡稱HDD〕中有盤片、磁頭、主軸電機〔盤片旋轉驅動機構〕、磁頭定位機構、讀/寫電路和控制邏輯等。43硬盤存儲器可分為溫徹斯特盤和非溫徹斯特盤兩類。溫徹斯特盤是根據(jù)溫徹斯特技術設計制造的,它的磁頭、盤片、磁頭定位機構、主軸、甚至連讀/寫驅動電路等都被密封在一個盤盒內,構成一個頭一盤組合體。溫徹斯特盤的防塵性能好,可靠性高,對使用環(huán)境要求不高。非溫徹斯特盤磁盤的磁頭和盤片等不是密封的,通常只能用于中型、大型計算機機房中。最常見的硬盤接口是IDE〔ATA〕和SCSI兩種,一些移動硬盤采用PCMCIA或USB接口。44IDE〔IntegratedDriveElectronics,電子集成驅動器〕接口也稱為ATA接口,是一個通用的硬盤接口。SCSI〔SmallComputerSystemInterface,小型計算機系統(tǒng)接口〕不是專為硬盤設計的,是一種總線型接口。SCSI獨立于系統(tǒng)總線工作,其系統(tǒng)占用率極低,但其價格昂貴,具有這種接口的硬盤大多用于效勞器等高端應用場合。45Bootloader簡介一個嵌入式Linux系統(tǒng)從軟件的角度看通??梢苑譃樗膫€層次:1.引導加載程序。包括固化在固件中的boot代碼(可選),和BootLoader兩大局部。2.Linux內核。特定于嵌入式板子的定制內核以及內核的啟動參數(shù)。3.文件系統(tǒng)。包括根文件系統(tǒng)和建立于Flash內存設備之上文件系統(tǒng)。4.用戶應用程序46Bootloader簡介引入:對于計算機系統(tǒng)來說,從開機上電到操作系統(tǒng)啟動需要一個引導過程。嵌入式Linux系統(tǒng)同樣離不開引導程序,這個引導程序就叫做BootLoader。47Bootloader簡介比照:PC機中的引導加載程序由BIOS(其本質就是一段固件程序)和位于硬盤中的OSBootLoader一起組成。BIOS在完成硬件檢測和資源分配后,將硬盤中的BootLoader讀到系統(tǒng)的RAM中,然后將控制權交給OSBootLoader。BootLoader的主要運行任務就是將內核映象從硬盤上讀到RAM中,然后跳轉到內核的入口點去運行,也即開始啟動操作系統(tǒng)。48Bootloader簡介而在嵌入式系統(tǒng)中,通常并沒有像BIOS那樣的固件程序。因此整個系統(tǒng)的加載啟動任務就完全由BootLoader來完成.49Bootloader簡介Bootloader的概念和功能BootLoader是在操作系統(tǒng)內核運行之前運行的一段小程序。它的作用是初始化硬件設備、建立內存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個適宜的狀態(tài),以便為最終調用操作系統(tǒng)內核準備好正確的環(huán)境。50Bootloader簡介Bootlaoder的不統(tǒng)一性/不通用性通常BootLoader是依賴于硬件而實現(xiàn)的,特別是在嵌入式領域,為嵌入式系統(tǒng)建立一個通用的BootLoader是很困難的。當然,我們可以歸納出一些通用的概念來,以便我們了解特定BootLoader的設計與實現(xiàn)。當前在嵌入式Linux系統(tǒng)中,有了一些流行和通用的Bootloader框架?,F(xiàn)實開發(fā)中,我們都是采用現(xiàn)有的BootLoader進行修改。51Bootloader啟動嵌入式Linux系統(tǒng)中系統(tǒng)加電或復位后,所有CPU都會從某個地址開始執(zhí)行,具體的地址值是由處理器設計決定的。比方,X86復位向量在高端地址開始,ARM的CPU在復位時通常都從地址0x00000000取它的第一條指令。基于ARM處理器構建的嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設備(比方:ROM、EEPROM或FLASH等)被映射到這個預先安排的地址上。所以bootloader通常是放在flash中的最前面的位置,CPU將首先執(zhí)行Bootloader程序。52Bootloader啟動用戶可以利用串口和Bootloader進行交互比方:輸出打印信息到串口,從串口讀取用戶控制字符等。53Bootloader啟動Bootloader多數(shù)是兩階段的啟動過程,既能提供復雜的功能又有很好的可移植性第一個啟動階段是和硬件平臺相關的,大都采用匯編程序編寫第二個啟動階段是和硬件平臺無關的,大都采用C語言編寫。54stage1的步驟(匯編)硬件設備初始化。為加載BootLoader的stage2準備RAM空間??截怋ootLoader的stage2到RAM空間中。設置好堆棧。跳轉到stage2的C入口點。
Bootloader啟動55stage2的步驟(c語言)初始化本階段要使用到的硬件設備。檢測系統(tǒng)內存映射(memorymap)。將kernel映像和根文件系統(tǒng)映像從flash上讀到RAM空間中。為內核設置啟動參數(shù)。調用內核。
Bootloader啟動56Bootloader啟動bootloader在執(zhí)行第一個局部的時候,也就是stage1的時候,會把bootloaderstage2這局部copy到ram中去運行。stage2的時候,會將kernel也copy到內存中。在結束的階段,讓執(zhí)行地址跳轉到操作系統(tǒng)的入口地址,操作系統(tǒng)也就啟動來了。57Bootloader啟動大多數(shù)Bootloader都包含兩種不同的操作模式:啟動加載模式下載模式58Bootloader啟動啟動加載〔Bootloading〕模式也稱為“自主〞〔autonomous〕模式:BootLoader從目標機上的某個固態(tài)存儲設備上將操作系統(tǒng)加載到RAM中運行,整個過程并沒有用戶的介入。這種模式是BootLoader的正常工作模式,因此在嵌入式產(chǎn)品發(fā)布的時侯,BootLoader顯然必須工作在這種模式下。59Bootloader啟動下載〔Downloading〕模式:在這種模式下,目標機上的BootLoader將通過串口連接或網(wǎng)絡連接等通信手段從主機〔Host〕下載文件,比方:下載內核映像和根文件系統(tǒng)映像等。從主機下載的文件通常首先被Bootloader保存到目標機的RAM中,然后再被Bootloader寫到目標機上的FLASH類固態(tài)存儲設備中。BootLoader的這種模式通常在第一次安裝內核與根文件系統(tǒng)時被使用;此外,以后的系統(tǒng)更新也會使用BootLoader的這種工作模式。60BootLoader的stage1代碼分析1〕根本的硬件初始化這是BootLoader一開始就執(zhí)行的操作,其目的是為stage2的執(zhí)行以及隨后的kernel的執(zhí)行準備好一些根本的硬件環(huán)境。它通常包括以下步驟〔以執(zhí)行的先后順序〕:
61BootLoader的stage1代碼分析1〕根本的硬件初始化〔1〕.屏蔽所有的中斷。為中斷提供效勞通常是OS設備驅動程序的責任,因此在BootLoader的執(zhí)行全過程中可以不必響應任何中斷。中斷屏蔽可以通過寫CPU的中斷屏蔽存放器或狀態(tài)存放器〔比方ARM的CPSR存放器〕來完成?!?〕.設置CPU的速度和時鐘頻率。62BootLoader的stage1代碼分析1〕根本的硬件初始化〔3〕.RAM初始化。正確設置內存控制器的控制存放器,使CPU能夠正常訪問內存?!?〕.初始化LED。典型地,通過GPIO來驅動LED,其目的是說明系統(tǒng)的狀態(tài)是OK還是Error。如果板子上沒有LED,那么也可以通過初始化UART向串口打印BootLoader的Logo字符信息來完成這一點?!?〕.關閉CPU內部指令/數(shù)據(jù)cache。63BootLoader的stage1代碼分析2〕為加載stage2準備RAM空間為了獲得更快的執(zhí)行速度,通常把stage2加載到RAM空間中來執(zhí)行,因此必須為加載BootLoader的stage2準備好一段可用的RAM空間范圍。由于stage2通常是C語言執(zhí)行代碼,因此在考慮空間大小時,除了stage2可執(zhí)行映象的大小外,還必須把堆??臻g也考慮進來。此外,空間大小最好是memorypage大小(通常是4KB)的倍數(shù)。一般而言,1M的RAM空間已經(jīng)足夠了。具體的地址范圍可以任意安排,推薦將stage2安排到整個RAM空間的最頂1MB。必須確保所安排的地址范圍確實是可讀寫的RAM空間。64BootLoader的stage1代碼分析RAM空間范圍的大小記為:stage2_size(字節(jié)),把起始地址和終止地址分別記為:stage2_start和stage2_end(這兩個地址均以4字節(jié)邊界對齊)。因此:
stage2_end=stage2_start+stage2_size65BootLoader的stage1代碼分析3〕拷貝stage2到RAM中拷貝時要確定兩點:(1)stage2的可執(zhí)行映象在固態(tài)存儲設備的存放起始地址和終止地址;(2)RAM空間的起始地址。66BootLoader的stage1代碼分析4〕設置堆棧指針sp堆棧指針的設置是為了執(zhí)行C語言代碼作好準備。通常把sp的值設置為stage2_end-4。此外,在設置堆棧指針sp之前,也可以關閉led燈,以提示用戶我們準備跳轉到stage2。67BootLoader的stage1代碼分析5〕跳轉到stage2的C入口點在上述一切都就緒后,就可以跳轉到BootLoader的stage2去執(zhí)行了。比方,在ARM系統(tǒng)中,這可以通過修改PC存放器為適宜的地址來實現(xiàn)。68BootLoader的stage1代碼分析bootloader的stage2可執(zhí)行映象剛被拷貝到RAM空間時的系統(tǒng)內存布局
69BootLoader的stage2代碼分析1〕初始化本階段要使用到的硬件設備這通常包括:〔1〕初始化至少一個串口,以便和終端用戶進行I/O輸出信息;〔2〕初始化計時器等。在初始化這些設備之前,也可以重新把LED燈點亮,以說明我們已經(jīng)進入main()函數(shù)執(zhí)行。設備初始化完成后,可以輸出一些打印信息,程序名字字符串、版本號等。70BootLoader的stage2代碼分析2〕檢測系統(tǒng)的內存映射〔memorymap〕32位CPU空間大?。核^內存映射就是指在整個4GB物理地址空間中有哪些地址范圍被分配用來尋址系統(tǒng)的RAM單元。比方,在SamsungS3C44B0XCPU中,從0x0c00,0000到0x1000,0000之間的64M地址空間被用作系統(tǒng)的RAM地址空間。71BootLoader的stage2代碼分析2〕檢測系統(tǒng)的內存映射〔memorymap〕雖然CPU通常預留出一大段足夠的地址空間給系統(tǒng)RAM,但是在搭建具體的嵌入式系統(tǒng)時卻不一定會實現(xiàn)CPU預留的全部RAM地址空間。也就是說,具體的嵌入式系統(tǒng)往往只把CPU預留的全部RAM地址空間中的一局部映射到RAM單元上,而讓剩下的那局部預留RAM地址空間處于未使用狀態(tài)。因此BootLoader的stage2必須在它想干點什么之前檢測整個系統(tǒng)的內存映射情況,也即它必須知道CPU預留的全部RAM地址空間中的哪些被真正映射到RAM地址單元,哪些是處于"unused"狀態(tài)的。72BootLoader的stage2代碼分析3〕加載內核映像和根文件系統(tǒng)映像規(guī)劃內存占用的布局,包括兩個方面:〔1〕內核映像所占用的內存范圍;〔2〕根文件系統(tǒng)所占用的內存范圍。Flash設備上拷貝映像73BootLoader的stage2代碼分析4〕設置內核的啟動參數(shù)在將內核映像和根文件系統(tǒng)映像拷貝到RAM空間中后,就可以準備啟動Linux內核了。但是在調用內核之前,需要設置Linux內核的啟動參數(shù)。74BootLoader的stage2代碼分析4〕設置內核的啟動參數(shù)Linux2.4.x以后的內核都以標記列表的形式來傳遞啟動參數(shù)。啟動參數(shù)標記列表以標記ATAG_CORE開始,以標記ATAG_NONE結束。每個標記由標識被傳遞參數(shù)的tag_header結構以及隨后的參數(shù)值數(shù)據(jù)結構來組成。數(shù)據(jù)結構tag和tag_header定義在Linux內核源碼的include/asm/setup.h頭文件中75BootLoader的stage2代碼分析4〕設置內核的啟動參數(shù)在嵌入式Linux系統(tǒng)中,通常需要由BootLoader設置的常見啟動參數(shù)有:ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。76BootLoader的stage2代碼分析5〕調用內核BootLoader調用Linux內核的方法是直接跳轉到內核的第一條指令處。在跳轉時,以下條件要滿足:〔1〕CPU存放器的設置:R0=0;R1=機器類型ID;關于MachineTypeNumber,可以參見linux/arch/arm/tools/mach-types。R2=啟動參數(shù)標記列表在RAM中起始基地址;〔2〕CPU模式:必須禁止中斷〔IRQs和FIQs〕;CPU必須SVC模式;77BootLoader的stage2代碼分析5〕調用內核BootLoader調用Linux內核的方法是直接跳轉到內核的第一條指令處。在跳轉時,以下條件要滿足:〔3〕Cache和MMU的設置:MMU必須關閉;指令Cache可以翻開也可以關閉;數(shù)據(jù)Cache必須關閉;78常用Bootloader介紹嵌入式系統(tǒng)世界已經(jīng)有各種各樣的Bootloader,種類劃分的方法也不是唯一的。一般可以按照它所支持處理器體系結構不同進行劃分。嵌入式比較常見的有ARMBoot、Redboot、Uboot、Blob和Vivi等79常用Bootloader介紹ARMboot是一個ARM平臺的開源固件工程,它基于PPCBOOT,已經(jīng)與PPCBOOT工程合并,新的工程為U-Boot。ARMboot支持的處理器構架有StrongARM、ARM720T和PXA250等ARMboot的目標是成為通用的、容易使用和移植的引導程序,非常輕便地運用于新的平臺上。ARMboot是GPL下的ARM固件工程中唯一支持Flash閃存、BOOTP、DHCP和TFTP網(wǎng)絡下載PPCBoot是功能十分強大的Bootloader
80常用Bootloader介紹Redboot是在ECOS的根底上剝離出來的,繼承了ECOS的簡潔、輕巧、可靈活配置、穩(wěn)定可靠等品質優(yōu)點。Redboot支持的處理器構架有ARM,MIPS,MN10300,PowerPC,x86等,是一個完善的嵌入式系統(tǒng)BootLoader。eCOS-嵌入式可配置操作系統(tǒng),由Redhat推出的小型即時操作系統(tǒng)(Real-Timeoperatingsystem),最低編譯核心可小至10K的級別,適合用于作bootloader增強,微小型系統(tǒng)。81常用Bootloader介紹U-Boot,UniversalBootLoaderU-Boot是由開源工程PPCBoot開展起來的,ARMboot并入了PPCBoot。2002年12月17日第一個版本發(fā)布,同時PPCBoot和ARMboot停止維護。U-Boot被認為是功能最多,最具彈性以及開發(fā)最積極的開放源碼bootloader。是德國DENX小組開發(fā)的用于多種嵌入式CPU的Bootloader引導程序,它已經(jīng)停止開發(fā),轉而開發(fā)U-boot.基于PPCboot,它只支持ARM.如同PPCboot,它的開發(fā)目前已經(jīng)終止,轉而開發(fā)u-boot.82常用Bootloader介紹U-Boot支持的處理器構架包括PowerPC,ARM,MIPS,x86等。U-Boot的功能強大,涵蓋了絕大局部處理器構架,提供大量外設驅動,支持多個文件系統(tǒng),附帶調試、腳本和引導等工具。U-boot可配置性非常強,它所支持的命令也可以通過配置來增減。U-boot的命令主要包括以下幾類:信息類命令、環(huán)境變量類命令、存儲器命令、Flash專用命令、載類命令、啟動類命令和Cache類命令。83常用Bootloader介紹Blob(BootLoaderObject)是由Jan-DerkBakker和ErikMouw發(fā)布的,是專門為StrongARM構架下的LART設計的BootLoader。Blob功能比較齊全,代碼較少,比較適合做修改移植,用來引導Linux,目前大局部S3C44B0板都用移植的Blob來加載uClinux。84常用Bootloader介紹各種Bootloader所支持處理器85U-Boot介紹U-Boot(UinversalBootLoader)U-Boot特點代碼結構清晰,易于移植支持多種處理器體系結構〔見程序結構cpu〕支持眾多參考版〔目前官方包中有200多種,見程序結構board目錄〕命令豐富,有監(jiān)控功能支持網(wǎng)絡協(xié)議、USB、SD等多種協(xié)議和設備支持多種文件系統(tǒng)更新活潑,使用者眾多86U-Boot介紹U-Boot目錄結構平臺相關board、cpu、lib_arm、include平臺無關common、net、fs、drivers工具和文檔tools、docu-boot起始代碼在此87U-Boot上電啟動后,敲任意鍵可以退出自動啟動狀態(tài),進入命令行,并出現(xiàn)相應的命令提示符。在命令行提示符下,可以輸入U-Boot的命令并執(zhí)行。U-Boot可以支持幾十個常用命令,通過這些命令,可以對開發(fā)板進行調試,可以引導Linux內核,還可以擦寫Flash完成系統(tǒng)部署等功能。掌握這些命令的使用,才能夠順利地進行嵌入式系統(tǒng)的開發(fā)。U-Boot的常用命令介紹88輸入help命令,可以得到當前U-Boot的所有命令列表。每一條命令后面是簡單的命令說明。Uboot>helpU-Boot還提供了更加詳細的命令幫助,通過help命令還可以查看每個命令的參數(shù)說明。
Uboot>
helpcp//為cp命令提供輔助說明
cp[.b,.w,.l]sourcetargetcount
-copymemorycp.b、cp.w、cp.l分別可用來復制byte、word和long類型的數(shù)據(jù)。U-Boot的常用命令介紹8921U-Boot的常用命令介紹1〕protect:protect命令用于對Flash進行寫保護,可以使能和解除寫保護。2〕erase:erase命令可以擦除Flash。3〕setenv:setenv命令可以設置環(huán)境變量。4〕printenv:printenv命令可以打印全部環(huán)境變量,也可以只打印參數(shù)中列出的環(huán)境變量。5〕saveenv:saveenv命令保存環(huán)境變量及其值到flash中。9021U-Boot的常用命令介紹6〕tftpboot:tftpboot命令能夠使用TFTP協(xié)議通過網(wǎng)絡下載二進制格式的文檔。另外,使用這個命令,必須配置好相關的環(huán)境變量。例如serverip和ipaddr。其命令格式為:tftpboot[loadAddress][bootfilename]第1個參數(shù)loadAddress是下載到的內存地址。第2個參數(shù)是要下載的文件名稱,必須放在TFTP效勞器相應的目錄下。9121U-Boot的常用命令介紹7〕bootm:
bootm命令可以引導啟動存儲在內存中的程序映像。這些內存包括RAM和可以永久保存的Flash。其命令格式為:bootm[addr[arg...]]8〕go:go命令能夠執(zhí)行應用程序。其命令格式為:goaddr[arg...]9〕loads:loads命令可以通過串口線下載S-Record格式的文件。922210〕loadb:loadb命令能夠通過串口線下載二進制格式的文檔。其命令格式為:loadb[off][baud]11〕flinfo:flinfo命令打印全部Flash組的信息,也可以只打印其中某個組的信息。一般嵌入式系統(tǒng)的Flash只有一個組。12〕cp:cp命令可以在內存中復制數(shù)據(jù)塊,包括對Flash的讀寫操作。U-Boot的常用命令介紹932313〕cmp:cmp命令可以比較兩塊內存中的內容。.b表示以字節(jié)為單位;.w表示以字為單位;.l表示以長字為單位。14〕mw:mw命令可以按照字節(jié)、字、長字寫內存,.b,w,l的用法與cp命令相同。15〕nfs:nfs命令可以使用NFS網(wǎng)絡協(xié)議通過網(wǎng)絡啟動映像。16〕nm:nm命令用于修改內存,可以按照字節(jié)、字、長字操作。17〕run:run命令可以執(zhí)行環(huán)境變量中的命令,后面參數(shù)可以是幾個環(huán)境變量名。18〕sleep:sleep命令可以延遲N秒鐘執(zhí)行,N為十進制數(shù)。U-Boot的常用命令介紹94printenv打印環(huán)境變量。
Uboot>printenv
baudrate=115200
ipaddr=
ethaddr=12:34:56:78:9A:BC
serverip=
Environmentsize:80/8188bytes
U-Boot的常用命令介紹95setenv設置新的變量
Uboot>setenvmyboardAT91RM9200DK
Uboot>printenv
baudrate=115200
ipaddr=
ethaddr=12:34:56:78:9A:BC
serverip=
myboard=AT91RM9200DK
Environmentsize:102/8188bytes
U-Boot的常用命令介紹96saveenv保存變量
命令將當前定義的所有的變量及其值存入flash中。用來存儲變量及其值的空間只有8k字節(jié),不要超過。例:setenvethaddr12:34:56:78:9A:BC//設置開發(fā)板的物理地址setenvipaddr//設置開發(fā)板的IPsetenvserverip54//設置效勞器的IPsaveenv//保存U-Boot的常用命令介紹97U-Boot命令介紹tftp通過網(wǎng)絡下載程序需要先設置好網(wǎng)絡
Uboot>setenvethaddr12:34:56:78:9A:BC
Uboot>setenvipaddr
Uboot>setenvserverip54〔tftp效勞器的地址〕下載bin文件到地址0x20000000處。
Uboot>tftp20000000application.bin〔application.bin應位于tftp效勞器相應的目錄下〕把server〔IP=環(huán)境變量中設置的serverip〕中/tftpdroot/下的vmlinux通過TFTP讀入到物理內存32000000處。Uboot>tftp32000000vmlinux98Bootloader制作用u-boot實現(xiàn)Bootloader有兩種啟動方式:SDcard啟動:通過擴展槽插入、外置NANDFLASH啟動:內存啟動
99Bootloader制作u-boot源碼結構介紹:board:是和一些已有開發(fā)板相關的文件,在里面可以找到samsung目錄;進入此目錄,我們用到的是smdk6410,在里面可看到相應的Makefile,U-boot.lds等。
common是與體系結構無關的文件,實現(xiàn)各種命令的C文件
100Bootloader制作u-boot源碼結構介紹:CPU:在這目錄下都是以u-boot所支持的CPU為名,本開發(fā)板6410就是用了s3c64xxcpu.c是初始化CPU,設置指令Cache和數(shù)據(jù)Cache等;interrupt.c設置系統(tǒng)的各種中斷和異常;start.S是u-boot啟動時執(zhí)行的第一個文件,主要是設置系統(tǒng)堆棧和工作方式,為進入C程序奠定根底。101Bootloader制作u-boot源碼結構介紹:disk:是disk驅動的分區(qū)處理代碼;doc:是文檔;drivers:是通用設備驅動程序;fs:是支持文件系統(tǒng)的文件;net:是網(wǎng)絡有關的代碼lib_arm:是ARM體系結構相關的代碼;tools:存放制作S-Record或者U-Boot格式的映像等工具,例如mkimage102Bootloader制作u-boot源碼結構介紹:include:是頭文件、對各種硬件平臺支持的匯編文件、系統(tǒng)的配置文件和對文件系統(tǒng)支持的文件。在里面的configs里有smdk6410.h。在這個頭文件里面可以確定教學平臺是從SDcard或nandflash啟動。查看:#vi/include/configs/smdk6410.h當CONFIG_BOOT_MOVINAND被宏定義,那么板子是從SDcard啟動。反之,從nandflash啟動。設置行號:setnu439行,#defineCONFIG_BOOT_MOVINAND103Bootloader制作配置和編譯將拷貝到工作目錄下解壓:#tar-zxvf解壓完后在當前目錄下生成一個目錄104Bootloader制作配置和編譯include頭文件,里面的configs里有smdk6410.h,這個文件決定開發(fā)板是由SD卡啟動還是NandFlash啟動
viinclude/configs/smdk6410.h
#defineCONFIG_BOOT_MOVINAND用makedistclean命令清理一下編譯設置頂層目錄makefile中交叉工具的路徑
exportCROSS_COMPILE在161行105Bootloader制作配置和編譯配置uboot:#makesmdk6410_config
從makefile文件中的smdk6410_config位置開始執(zhí)行編譯uboot:#make將所有.C文件編譯成.O文件;將.O文件編譯成可執(zhí)行文件在此目錄下生成Bootload文件u-boot.bin106Bootloader制作配置和編譯把u-boot.bin改為u-boot-movi.bin,以表示從SD啟動
#mvu-boot.binu-boot-movi.bin107Bootloader制作配置和編譯設置頂層目錄makefile中交叉工具的路徑
exportCROSS_COMPILE查看源碼結構:#vi/include/configs/smdk6410.h當CONFIG_BOOT_MOVINAND沒被宏定義,而定義的是CONFIG_BOOT_NAND,說明從nandflash啟動。Bootargs配置,默認#defineCONFIG_BOOTARGS“root=/dev/mtdblock2rootfstype=yaffs2init=/linuxrcconsole=ttySAC0,115200〞查看或修改/include/configs/smdk6410.h文件108Bootloader制作配置和編譯從makefile文件中的smdk6410_config位置開始執(zhí)行
在目錄下
#makesmdk6410_config編譯uboot:在目錄下
#make生成u-boot.bin109Bootloader制作把生成的u-boot.bin文件改為u-boot-nand.bin,以表示從NANDFLASH啟動#mvu-boot.binu-boot-nand.bin將生成的兩個文件u-boot-movi.bin和u-boot-nand.bin拷出110Bootloader制作加載帶QT的根文件系統(tǒng)的bootloader制作源碼:u-boot-1.1.6-Linux-s3c6410-nand-yaffs2修改/include/configs/smdk6410.h文件#defineCONFIG_BOOTARGS“root=/dev/mtdblock3rootfstype=cramfsinit=/linuxrcconsole=ttySAC0,115200〞說明/dev/mtdblock3:表示MTD分區(qū)的第3個分區(qū)存儲根文件系統(tǒng)rootfstype=cramfs:分區(qū)是cramfs類型init=/linuxrc:啟動的首個腳本即根目錄下的linuxrcconsole=ttySAC0,115200:使用串口1作為串口調試,波特率設置為115200;(現(xiàn)在已經(jīng)摒棄了以前使用ttyS0的寫法)111加載帶QT的根文件系統(tǒng)的bootloader制作配置和編譯從makefile文件中的smdk6410_config位置開始執(zhí)行
在目錄下
#makesmdk6410_config編譯uboot:
在目錄下
#make生成u-boot.bin112加載帶QT的根文件系統(tǒng)的bootloader制作把生成的u-boot.bin文件改為u-boot-nand_qt.bin#mvu-boot.binu-boot-nand_qt.bin113內核剪裁與編譯內核移植有體系結構級〔arch〕、板級〔BSP〕、芯片級〔SOC〕。大多是板級。/arch/arm/下plat-XXmach-XX內核節(jié)拍、中斷管理、時鐘、GPIO、DMA、IO內存映射plat-XX下,通用局部mach-XX,不通用局部BSP級相關代碼分布在plat-XXmach-XX體系結構級分布在/kernel、/mm114內核剪裁與編譯Linux內核功能結構Linux內核源代碼布局Linux內核的移植Linux的編譯和定制內核剪裁與編譯實例115Linux內核功能結構內核〔kernel〕是操作系統(tǒng)的內部核心程序,它向外部提供了對計算機系統(tǒng)資源進行請求和管理的調用接口和效勞116Linux內核功能結構可以將操作系統(tǒng)的代碼分成兩局部:內核所在的地址空間稱為內核空間;而在內核以外,剩下的程序統(tǒng)稱為外部管理程序,它們大局部是對外圍設備的管理和界面操作,外部管理程序與用戶進程所占據(jù)的地址空間稱為外部空間。通常,一個程序會跨越兩個空間。當執(zhí)行到內核空間的一段代碼時,稱程序處于內核態(tài)當程序執(zhí)行到外部空間代碼時,稱程序處于用戶態(tài)。117Linux內核功能結構在Linux中,可以動態(tài)裝入和卸載內核中的局部代碼。Linux中將這樣的代碼段稱做模塊〔module〕,并對模塊給予了強有力的支持。在Linux中,可以在需要時自動裝入和卸載模塊。118Linux內核功能結構Linux內核的結構119Linux內核功能結構Linux內核主要由5個模塊構成,它們分別是:進程調度模塊:進程調度控制系統(tǒng)中的多個進程對CPU的訪問,使得多個進程能在CPU中微觀串行,宏觀并行地執(zhí)行。內存管理模塊:控制多個進程平安地共享主內存區(qū)域。當CPU提供內存管理單元時,Linux內存管理完成為每個進程進行虛擬內存到物理內存的轉換。一般而言,每個進程享有4GB的內存空間,0-3GB屬于用戶空間,3-4GB屬于內核空間。120Linux內核功能結構Linux內核主要由5個模塊構成,它們分別是:文件系統(tǒng)模塊:支持對外部設備的驅動和存儲進程間通信模塊:進程間多種通信機制,包含信號量、共享內存、管道等,可協(xié)助多個進程、多資源的互斥訪問、進程間的同步和消息傳遞網(wǎng)絡接口模塊:提供對多種網(wǎng)絡通信標準的訪問并支持許多網(wǎng)絡硬件
121Linux內核功能結構內核模塊之間的依賴關系122Linux內核功能結構內核模塊之間的依賴關系所有的模塊都與進程調度模塊存在依賴關系。因為它們都需要依靠進程調度程序來掛起〔暫停〕或重新運行它們的進程。通常,一個模塊會在等待硬件操作期間被掛起,而在操作完成后才可繼續(xù)運行。進程調度子系統(tǒng)需要使用內存管理器來調整一特定進程所使用的物理內存空間123Linux內核功能結構內核模塊之間的依賴關系進程間通信子系統(tǒng)那么需要依靠內存管理器來支持共享內存通信機制。虛擬文件系統(tǒng)也會使用網(wǎng)絡接口來支持網(wǎng)絡文件系統(tǒng)〔NFS〕,同樣也能使用內存管理子系統(tǒng)來提供內存虛擬盤〔ramdisk〕設備。而內存管理子系統(tǒng)也會使用文件系統(tǒng)來支持內存數(shù)據(jù)塊的交換操作。124Linux內核源代碼布局安裝的時候,如果選擇了KernelDevelop,那么會在/usr/src/linux下找到源代碼。根據(jù)各個目錄的名字,可以容易猜出各個目錄里面的文件的功能125Linux內核源代碼布局Linux用來支持各種體系結構的源代碼包含大約4500個C語言程序,270個左右子目錄,大約200萬行代碼ubuntu不帶linux內核源碼,需要自己下載安裝不同版本目錄會有些小差異126Linux內核源代碼布局文件顏色白色:表示普通文件藍色:表示目錄綠色:表示可執(zhí)行文件紅色:表示壓縮文件淺藍色:代表鏈接紅色閃爍:表示鏈接的文件有問題黃色:表示設備文件灰色:表示其他文件
127Linux內核源代碼布局128Linux內核源代碼布局
/include子目錄包括編譯內核所需要的大局部頭文件。/init子目錄包含了內核的初始化代碼,這是內核工作的開始的起點。/arch子目錄包括所有與體系結構相關的內核代碼,它的每一個子目錄都代表一個支持的體系結構。/drivers子目錄包含了內核中所有的設備驅動程序,如塊設備和SCSI設備。129Linux內核源代碼布局/fs子目錄包含了所有的文件系統(tǒng)的代碼。如:ext2,vfat等。/net子目錄包含了內核的連網(wǎng)代碼。/mm子目錄包含所有獨立于CPU體系結構的內存管理代碼,如頁式存儲管理內存的分配和釋放等。
/ipc子目錄包含了進程間通信代碼。/kernel子目錄包括主要的內核代碼,此目錄的文件實現(xiàn)大多數(shù)Linux系統(tǒng)的內核函數(shù)。/char:字符設備驅動程序。如串口、鼠標等。130Linux內核源代碼布局/cdrom:包含Linux所有的CD-ROM代碼。/pci:PCI卡驅動程序代碼,包含PCI子系統(tǒng)映射和初始化代碼等scsi:包含所有的SCSI代碼已經(jīng)Linux所支持的所有的SCSI設備驅動程序代碼。sound:聲卡設備驅動程序。lib目錄放置內核的庫代碼;ipc目錄包含內核進程通信的代碼Documentation此目錄是一些文檔,起參考作用
131內核剪裁與編譯Linux內核和功能結構Linux內核源代碼布局Linux內核的移植Linux的編譯和定制內核剪裁與編譯實例132Linux內核的移植Linux移植:就是把Linux操作系統(tǒng)針對具體的目標平臺做必要改寫之后,安裝到該目標平臺,使其正確地運行起來,即把內核從一種硬件平臺轉移到另外一種硬件平臺上運行。對于嵌入式Linux系統(tǒng)來說,有各種體系結構的處理器和硬件平臺,并且用戶需要根據(jù)需求自己定制硬件板。只要硬件平臺有些變化,即使非常小,可能也需要做一些移植工作。133Linux內核的移植內核移植工作主要是修改跟硬件平臺相關的代碼,一般不涉及Linux內核通用的程序。移植的難度也取決于兩種硬件平臺的差異。目前Linux內核的社區(qū)已經(jīng)對常見的硬件平臺做了很多工作,移植工作已經(jīng)簡單了通常都可以找到相同處理器的參考板,并且可以獲取到Linux內核源代碼。134Linux內核的移植移植的準備工作:選擇參考板,獲取到Linux內核源代碼分析內核代碼,弄清楚哪些設備有驅動程序,哪些還沒有。確信Linux對參考板的支持情況,配置編譯Linux內核,在目標板上運行測試??赡茏钚碌腖inux內核版本支持的最好,但是也可能需要在老內核版本上打補丁。分析平臺相關的局部代碼實現(xiàn);分析內核編譯組織方式;分析內核啟動的初始化程序;分析驅動程序的實現(xiàn)。135Linux內核的移植移植過程的根本內容:根據(jù)具體目標平臺對內核源碼進行必要的改寫〔主要是修改體系結構相關局部〕。添加一些外設的驅動,打造一款適合需要的目標平臺〔可以是嵌入式便攜設備也可以是其它體系結構的PC機〕的新操作系統(tǒng),對該系統(tǒng)進行針對具體目標平臺的交叉編譯,生成一個內核映象文件最后通過一些手段把該映象文件燒寫〔安裝〕到目標平臺中。136Linux內核的移植通常,對Linux源碼的改寫工作難度較大,它要求不僅對Linux內核結構要非常熟悉,還要求對目標平臺的硬件結構要非常熟悉,同時還要求對相關版本的匯編語言較熟悉,因為與體系結構相關的局部源碼往往是用匯編寫的。所以這局部工作一般由目標平臺提供商來完成。開發(fā)者所要做的就是從目標平臺提供商的網(wǎng)站上下載相關版本Linux內核的補丁〔Patch〕。把它打到Linux內核上,再進行交叉編譯就行。137編譯內核前的準備工作如果用戶想要使用內核的一些新特性,或想根據(jù)自己的系統(tǒng)量身定制一個更高效或更穩(wěn)定的內核,就需要重新編譯內核。
編譯內核包含兩大項內容:第一步:配置內核第二步:編譯內核。
138編譯內核前的準備工作編譯內核前先要了解自己系統(tǒng)的硬件配置情況,比方CPU的類型、主板芯片、顯卡和聲卡的型號以及其他相關參數(shù)等。也要了解現(xiàn)有內核的版本號uname-aLinuxlocalhostlocaldomain2.6.32-2c1generic#32-UbuntuSMPFriApr1608:10:28EST2003i686i686i686GNU/Linux把下載好的打包的內核解開。壓縮的內核、補丁和解開的源代碼總共要占70M左右的硬盤空間。139用root登錄,解開的源代碼應該在/usr/src/Linux2.4.20-8下面:#tar-zxvfLinux2.4.20-8.tar.gz或者#gzip-tLinux2.4.20-8.tar.gz#tar-xLinux2.4.20-8.tar140編譯內核第一步:配置內核在開始配置內核之前,首先需要通過下面的命令去除所有的臨時文件、中間件和配置文件。#makemrproper對于一個剛從網(wǎng)上下載的內核來說,它肯定是干凈的,這么做只會多此一舉。但是這是一個良好習慣,而且不會有壞結果。141編譯內核第一步:配置內核刪除的文件范圍從小到大依次為:makeclean<makemrproper<makedistclean執(zhí)行makemrproper,會先執(zhí)行makeclean,執(zhí)行makedistclean之前,會先執(zhí)行makemrpropermakeclean:刪除大多數(shù)的編譯生成文件,但是會保存內核的配置文件.config,還有足夠的編譯支持來建立擴展模塊;makemrproper:刪除所有的編譯生成文件,還有內核配置文件,再加上各種備份文件;makedistclean:mrproper刪除的文件,加上編輯備份文件和一些補丁文件。142編譯內核第一步:配置內核配置內核可以根據(jù)需要與愛好使用以下命令中的一個:makeconfig:基于文本的最為傳統(tǒng)的配置界面,不推薦使用makemenuconfig:一個文本模式、簡單的菜單模式的配置界面,字符終端下推薦。makexconfig:基于圖形窗口的模式的配置界面,Xwindow下推薦。makeoldconfig:如果只想在原來內核配置的根底上修改一些小地方,會省去不少麻煩。通過命令界面配置內核,但是會自動載入既有的.config配置文件,并且只有在遇到先前沒有設定過的選項時,才會要求你手動設定。143編譯內核第一步:配置內核makemenuconfig:一個文本模式、簡單的菜單模式的配置界面,字符終端下推薦。144編譯內核第一步:配置內核makexconfig:基于圖形窗口的模式的配置界面,Xwindow下推薦。145編譯內核第一步:配置內核每個選項前面都有一個“[]〞或“<>〞“[]〞表示該選項有兩種選擇:[*]直接編譯進內核[]不編譯“<>〞表示該選項有三種選擇:<*>直接編譯進內核<>不編譯<M>編譯成模塊形式,但不編譯進內核Y選擇,N不選擇146編譯內核第一步:配置內核配置內核內容:設置編譯工具路徑〔.cross_compile〕確定目標板類型〔Makefile〕選擇cpu系列設置文件系統(tǒng)設備驅動:設備驅動類型、網(wǎng)口驅動、鼠標驅動、攝像頭驅動、顯示屏驅動、聲卡驅動147編譯內核第二步:編譯內核編譯內核的軟件環(huán)境:構建一個完整并能夠運行的Linux內核所需要的一切資源。這些資源包括構建程序、腳本、中間件、配置文件和Makefile。148編譯內核第二步:編譯內核與編譯有關的命令makedep:讀取配置過程生成的配置文件,來創(chuàng)立對應于配置的依賴關系樹,從而決定哪些需要編譯而哪些不需要編譯makebzImage、makezImage:編譯內核,生成的內核是使用gzip壓縮的;前者可以生成大一點的內核makeall:
編譯所有了,包括kernel以及modules了。make149與編譯有關的命令makemodules和makemodules_install:分別生成相應的模塊和把模塊拷貝到需要的目錄中。depmod–a:嚴格說來,depmod-a命令和編譯過程并沒有關系,它是生成模塊間的依賴關系,這樣你啟動新內核之后,使用modprobe命令加載模塊時就能正確地定位模塊。makeinstall:安裝編譯好的內核,他會在/boot下安裝vmlinuz以及System.map文件。當然你也可以自己手動的方式進行cp了。
150內核剪裁與編譯Linux內核和功能結構Linux內核源代碼布局Linux內核的移植Linux的編譯和定制內核剪裁與編譯實例151內核剪裁與編譯實例解壓內核修改隱藏文件.cross_compile設置頂層Makefile中ARCH:配置內核編譯內核152解壓內核建立工作目錄,解壓內核:將拷貝到工作目錄下;通過tar-zxvf解壓;解壓完后,在當前目錄生成一個目錄。
153修改隱藏文件進入內核源碼目錄,修改隱藏文件.cross_compilesudovi.cross_compile確保編譯工具的路徑是正確的,保存退出。
確保頂層Makefile里
ARCH:=arm
不然編譯的是X86架構的內核,這是不能在ARM架構上運行的154內核剪裁與編譯實例
解壓內核修改隱藏文件.cross_compile配置內核編譯內核155配置內核編譯配置內核前系統(tǒng)需安裝libncurses5-dev這個庫,否那么makemenuconfig這個命令用不了連網(wǎng)安裝如下:#sudoapt-getinstalllibncurses5-dev156配置內核在頂層目錄(htx-linux-2.6.24-yaffs2)下執(zhí)行清理#sudomakeclean進入圖形的配置內核界面。這時默認翻開的配置文件是頂層目錄的.config,這是個隱藏文件,可以用#ls–a查看#sudomakemenuconfig如果沒有在Makefile設置ARCH=arm這里就執(zhí)行makemenuconfigARCH=arm157配置內核〔1〕SystemTypeSystemType>ARMsystemtype確保選中的是SamsungS3C24xx,S3C64xx,表示我們實驗平臺使用的cpu體系是SAMSUNGs3c24xxs3c64xx系列的。SystemType>S3C6410Machines,cpu是s3c6410。內核源碼路徑為:arch/arm/mach-s3c6410/,arch/arm/plat-s3c64xx/。158配置內核〔2〕Filesystems>Miscellaneousfilesystems,我們主要用到的文件系統(tǒng)是yaffs2。內核源碼路徑為:fs/yaffs2/。YAFFS,YetAnotherFlashFileSystem,是一種類似于JFFS/JFFS2的專門為Flash設計的嵌入式文件系統(tǒng)。與JFFS相比,它減少了一些功能,因此速度更快、占用內存更少。YAFFS和JFFS都提供了寫均衡,垃圾收集等底層操作。AFFS2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋中介公司雇傭合同
- 個人授信額度借款合同
- 個人房屋出租協(xié)議書
- 鋁合金方管施工方案
- 懸挑翼緣板施工方案
- 廠房照明施工方案
- 瓷磚干掛施工方案
- 海西輕鋼別墅施工方案
- 沈陽地源熱泵井施工方案
- 河南省平頂山市汝州市2024-2025學年八年級上學期期末生物試題(原卷版+解析版)
- 2025年常州機電職業(yè)技術學院單招職業(yè)傾向性測試題庫參考答案
- 2025年安徽衛(wèi)生健康職業(yè)學院單招職業(yè)技能測試題庫及參考答案1套
- 課件-DeepSeek從入門到精通
- 17J008擋土墻(重力式、衡重式、懸臂式)圖示圖集
- 【MOOC】理解馬克思-南京大學 中國大學慕課MOOC答案
- 三八婦女節(jié)主題班會PPT課件
- 員工考勤與請休假管理制度
- 50MW茶光互補光伏發(fā)電項目建議書寫作模板-定制
- LS框架斷路器技術資料_圖文
- 品質異常(8D)改善報告
- 彎頭重量和表面積明細表
評論
0/150
提交評論