1.入門知識linux
1.1硬件構成bash
嵌入式系統硬件主控板主要由這些硬件構成:服務器
①ARM架構爲硬核的處理器,如TI/FreeScale等芯片廠商製造的處理器。網絡
②存儲芯片:包括內存RAM和閃存FLASH。內存RAM中是在上電時存儲程序運行的指令和數據的,掉電後數據消失,經常使用的是DDR2或DDR3芯片,低級一點的能夠用SRAM芯片;閃存FLASH存儲的是燒錄或拷貝的各類文件(包括指令和數據),上電後FLASH的文件會拷貝至RAM運行,掉電後FLASH中的數據不會消失,經常使用的是NOR FLASH和NAND FLASH。架構
③外設:主要是電源模塊、GPIO擴展口、ADC、RTC、TFT屏接口、JTAG燒錄口、通訊接口(UART/USB/I2C/CAN/網口等)。這些外設須要專門的驅動程序支持才能使用。工具
1.2 Bootloader佈局
bootloader是一個引導程序,它最主要的功能是加載內核,所謂加載內核就是讓內核代碼常駐內存,而且獲得執行。網站
每一種CPU都有本身的啓動方式,具體以下(網上看到的):操作系統
①CPU上電後從某個肯定的內存地址開始取指令運行,這樣的指令每每是已經固化的,由於RAM剛上電時,裏面的內容是沒有意義的,不少單片機是這樣方式。這種BOOT方式能夠認爲是固化模式,其實就是沒有所謂的BOOT過程。命令行
②CPU上電後從ROM讀代碼到RAM,而後跳到RAM裏開始執行。這種方式的CPU通常會拷貝固定長度的二進制代碼到RAM,由於它不知道有效代碼有多長,只有一個固定的長度拷貝完成後,CPU才知道拷貝工做完成,以便從RAM執行。這就是拷貝固定長度二進制代碼的BOOT過程。
③對方式②進行了改進,方式②只能拷貝固定長度的代碼到RAM運行,爲了拷貝更多的代碼到RAM運行,首先進入RAM的代碼不是一個功能固件,而是另外一個功能代碼的加載器(loader),這就是Bootloader。
1.2.1 ARM的Bootloader
ARM會拷貝4K長度的代碼運行。顯然arm不是爲4K的固件設計的。拷貝代碼到RAM並不須要不少指令,由於ARM對RAM的管理須要一個MMU控制器(可讓CPU訪問更多的RAM或許)而這個控制器須要配置相關寄存器,因此代碼可能要多一點,另外可能還有許多別的功能,因此代碼可能會更多。固然都不超過4K時都沒問題,但每每仍是要過4K的。因此真正arm-linux的bootloader通常有兩步驟:
①拷貝4K代碼到RAM,開始執行。 ② 拷貝另外一段代碼到RAM並初始化一些必須的硬件設置,開始執行 。
1.2.2 U-Boot
u-boot是一種很流行的bootloader,除了加載內核,它還提供了許多其餘功能。基本上u-boot是一個精簡的linux,源代碼佈局和Linux類似,它提供人機交換接口,通常如今linux開發都採用串口方式使用u-boot。
關於u-boot的說明有不少,我簡單說明一下:
①u-boot能夠被打斷,經過串口向u-boot輸入命令後,u-boot中斷,能夠執行各類命令,這些命令有專門的手冊能夠查詢。串口其實就是u-boot的一個遠程終端。
②u-boot能夠設置網絡,經過TFTP服務,u-boot能夠下載代碼到RAM而後執行,也能夠燒寫到flash。
③u-boot之因此有這麼多功能是由於裏面集成了許多驅動,若是要讓u-boot有更多的功能能夠在u-boot源代碼裏添加,若是要用硬件就須要添加驅動。
④ 嵌入式系統硬件千差萬別,使用U-Boot時須要修改(也就是移植),修改後須要從新編譯。
1.3 Linux內核
內核就是Linux操做系統的核心,也就是一組程序,負責驅動硬件、分配管理硬件資源和管理活動(進程、中斷)。內核直接做用於硬件,控制硬件的數字邏輯運算。若是讓用戶直接訪問操做硬件的話,對於複雜電路來講,這是很是困難甚至是不可能的;而內核經過硬件抽象(HAL/BSP)的方法屏蔽了用戶直接操做硬件的複雜性和多樣性。內核嚮應用程序(用戶程序)提供了統一和簡潔的接口,應用程序只需調用這個接口就能夠完成相應操做。用下圖形象表示:
1.3.1內核組成
Linux 內核由進程管理、內存管理、文件系統、網絡協議、進程間通訊、 設備驅動等模塊組成。以下圖所示:
各個組成部分的詳細講解能夠去搜索相關資料。
1.3.2 內核的交叉編譯
所謂的交叉編譯,就是在宿主機(PC機,Windows/Linux系統)平臺上使用某種特定的交叉編譯器,爲某種與宿主機不一樣平臺的目標系統編譯程序,獲得的程序在目標系統(ARM開發板,Linux系統)上運行而非在宿主機本地運行。這裏的平臺包含兩層含義:一是核心處理器的架構,二是所運行的系統。這樣,交叉編譯有 3 種情形:
①目標系統與宿主機處理器相同,運行不一樣的系統;
②目標系統與宿主機處理器不一樣,運行相同的系統;
③目標系統與宿主機處理器不一樣,運行不一樣的系統。
交叉編譯器命名方式通常遵循「處理器-系統-gcc」這樣的規則,通常經過名稱即可以知道交叉編譯器的功能。交叉編譯器在Linux操做系統中的下載及安裝過程:
①網站上下載編譯器,好比arm-linux-gcc 3.4.1;
②解壓安裝:sudo tar vxjf arm-linux-gcc 3.4.1.bz2;
③命令行編譯須要設置環境變量:sudo gedit /etc/bash.bashrc; 在文件最後添加:export PATH=$PATH:/usr/local/arm/3.4.1/bin 從新登陸。
④arm-linux-gcc –v 查看版本便知道交叉編譯器是否安裝成功 。
1.3.3內核裁剪(內核移植)
內核移植涉及到硬件驅動修改裁剪和內核配置Kconfig。這是一個很複雜的過程,須要專門的文章詳細介紹。
1.4 燒寫
燒寫內核有多種方式:USB燒寫、TF卡燒寫、鏡像文件燒寫等。
這些燒寫都要藉助必定的軟硬件工具來進行。以鏡像文件燒寫爲例:
①內核鏡像是被bootloader加載的,好比u-boot能夠把內核鏡像加載到RAM並執行。製做u-boot可加載的鏡像須要使用mkimage工具。 安裝:sudo cp ~/tools/mkimage /usr/bin;編譯:make uImage;
注意:若是mkimage權限不對make uImage是會出錯的,能夠設置一下權限 sudo chmod 777 /usr/bin/mkimage 若是一切成功那麼在linux-xxxx/arch/arm/boot下就有uImage文件了。
②U-Boot燒寫過程: a) 中斷u-boot ;b) 須要一個tftp服務器,好比Windows XP下能夠安裝tftpwin ;c) 調用u-boot命令啓動下載燒寫。(網上看到的,不必定準確)