Download presentation
Presentation is loading. Please wait.
1
Building Embedded Linux(1)
2
Outline Introduction 開發系統 S3C2410X介紹 NAND & NOR FLASH 開發環境
3
Introduction
4
Introduction Building Embedded Linux System五步驟 必須先建立開發系統 確認目標板 建構開發環境
Building Embedded Linux for Target 燒寫至儲存裝置
5
建立開發系統 開發Embedded Linux,首先要在個人電腦上建立標準版Linux,以標準Linux 做為開發Embedded Linux的本機端(Host),而被開發的稱為目標板(Target)。 Linux Embedded Linux
6
確認目標板 現今的嵌入式開發板眾多,較為廣泛使用包括Xscale、ARM、MIPS及PPC等不同微處理器組合而成的嵌入式開發板,因此在開發前必須先確認目標板。
7
建構開發環境 在開發Embedded Linux的過程中,必須要編譯、組譯及連結等動作,所以本機端(Host)需要有Cross-Toolchain。
8
Cross-Toolchain 跨平台工具鏈,包括Binutils、GCC及Glibc,是跨平台開發時所需要使用到的工具。
而這些工具卻是相輔相成的,又因為這些工具無法單獨執行跨平台開發,表面上看來這些工具就像是一串互相連結的鏈,所以才會通稱為跨平台工具鏈。
9
Building Embedded Linux for Target
建立一個基於Linux Kernel所產生的Embedded Linux,並不限定要用哪些工具及套件。 但基本上會包含 Bootloader Linux Kernel UNIX utilities Native Library GUI Library (Option)
10
燒寫至儲存裝置 將已經完成跨平台編譯的Bootloader、Linux Kernel及Root filesystem分別各自燒寫至目標板上的儲存裝置,通常是使用Flash。
11
Building Embedded Linux System
必須先建立開發系統 確認目標板 建構開發環境 Building Embedded Linux for Target 燒寫至儲存裝置
12
開發系統 開發系統通常不限定是何種Linux 發行套件,像是Mandrake、SuSE、Red Hat或Fedora。在此是用Fedora 1開發。若對開發過程所需用的套件不清楚,建議直接完全安裝。(安裝過程省略)
13
Building Embedded Linux System
必須先建立開發系統 確認目標板 建構開發環境 Building Embedded Linux for Target 燒寫至儲存裝置
14
確認目標板 選用的目標板是凱思嵌入式系統開發網所代理的SBC-2410開發板。 出處:
15
確認目標板 SBC-2410開發板,會選用作目標板的原因,體積小(120mmx90mm) 、採用ARM920T Core、有64MB Nand Flash儲存空間。下頁有詳細列表。
16
SBC-2410 Samsung S3C2410X ARM920T 32-bit CPU (200MHz)
64Mbytes NAND Flash 1Mbytes NOR Flash 64MB SDRAM(133MHz) RS-232C port x1 USB Host x1 USB Slave x1 RJ-45 10M Base-T Ethernet interface
17
SBC-2410 Button x4 and Reset Button x1 Led x4 SD card connector
LCD port Keyboard Port Other RS-232C port 可額外接出 JTAG connector 20Pin Board size 120mmx90mm
18
S3C2410X SAMSUNG所製造的一顆16/32 bit RISC Microprocessor,並採用ARM920T Core,價格低廉、低功率及高效能的特性。
19
FEATURES Architecture
Enhanced ARM architecture MMU to support WinCE, EPOC 32 and Linux ARM920T CPU core supports the ARM debug architecture. Internal Advanced Microcontroller Bus Architecture (AMBA) (AMBA2.0, AHB/APB)
20
FEATURES System Manager Little/Big Endian support
Address space: 128M bytes for each bank (total 1G bytes) Supports external wait signals to expend the bus cycle Supports self-refresh mode in SDRAM for powerdown
21
FEATURES NAND Flash Boot Loader
Supports booting from NAND flash memory 4KB internal buffer for booting Supports storage memory for NAND flash memory after booting
22
FEATURES Cache Memory 64-way set-associative cache with I-Cache (16KB) and D-Cache (16KB) 8words length per line with one valid bit and two dirty bits per line Write-through or write-back cache operation to update the main memory
23
NAND-Flash & NOR-Flash
NOR-Flash和NAND-Flash是現在市場上兩種主要的快閃記憶體技術 Intel於1988年開發出NOR flash技術。 隔年,1989年東芝公司發表了NAND flash結構。
24
NAND-Flash & NOR-Flash
NOR Flash在執行抹除時,必須把目標區塊內所有位元都設為0。而NAND-Flash抹除操作較為簡單。 抹除NOR Flash是以64~128KB區塊進行,執行一個寫入/抹除的操作時間大約為5S。而NAND Flash是以8~32KB區塊進行,同樣動作執行時間最多只需4ms。
25
NAND-Flash & NOR-Flash差異
NAND Flash使用複雜的I/O存取資料,NOR Flash容易存取任何一個位元組。 NAND Flash比較便宜。 NAND Flash每區塊最大抹寫次數一百萬次,NOR Flash為十萬次。
26
NAND-Flash & NOR-Flash
由上列幾點可得知NOR-Flash適合較少抹寫動作的資料存放,又常使用。所以通常NOR-Flash存放Bootloader。而NAND Flash放Root filesystem。
27
Building Embedded Linux System
必須先建立開發系統 確認目標板 建構開發環境 Building Embedded Linux for Target 燒寫至儲存裝置
28
建構開發環境 在建構Embedded Linux之前,必須先設定好開發環璄,即是設置Cross-toolchain,當設置完之後,就可以進行Cross Compile及根檔案目錄的建置。
29
Cross Compile 跨平台編譯實際上跟正常編譯流程相同,只需把編譯時所需的工具更改即可。
30
Cross-Toolchain 在這裡使用的套件有以下 : GNU Compiler Collection (gcc2.95.3)
GNU C Library (glibc2.1.3) GNU Binutils (binutils2.10.1) Linux Kernel 2.4
31
Cross-Toolchain 對各種目標板進行應用程式的跨平台編譯
跨平台編譯所需二元公用程式的組合,包括Binutils、Glibc、GCC。
32
GNU Compiler Collection(gcc)
GNU Compiler Collection是數個編譯器的集合, 裡頭包含C, C++, Java, Fortran, and Ada等。
33
GNU Compiler Collection(gcc)
硬體包括x86, ia64, alpha, hppa, m68k, Power PC, mips, IBM rs6000, sparc/sparc64等。 作業系統包含Microsoft 平台 到UNIX和IBM的 OS/2
34
GNU Compiler Collection(gcc)
其中很重要的是CPP,它是在編譯時期的前置處理器。 大部份會使用C/C++ compiler,在跨平台編譯的過程中,是用來編譯成組合語言。
35
GNU Binary Utilities(binutils)
用來操作二元目的檔 (binary object file)。程式經由編譯器(如gcc)編譯後,還得經由組譯、連結等動作,才能產生出機械語言。 Binutils裡頭就包含了組譯、連結等工具。
36
GNU Binary Utilities(binutils)
主要包括二支公用程式 assembler,linker其餘的有ar、ld 、gasp、ar、nm、objcopy、objdump、ranlib、readelf、size、strings、strip、c++filt及addr2line。
37
GNU Binary Utilities(binutils)
as (assembler) 組譯器,當程式經過編譯器後,輸出的是組合語言,還需要經過組譯器把組合語言轉換成機械語言,通常輸出結果為目的檔(object file)。 ld (Linker) 連結器,把一隻程式所有的目的檔及其所需要的系統函式庫都連結起來,才會產生出一個完整可執行的程式檔。
38
GNU Binary Utilities(binutils)
建立,操作靜態函式庫的內容,即是把原始碼編譯成目的檔時,把這些目的檔打包成一個靜態函式庫。 Addr2line 把內含除錯資訊的 程式中某個特定位址轉換成為原始碼的檔名以及其行號。
39
GNU Binary Utilities(binutils)
c++filt 它可以由組合標記反向對應出其原來的函式名稱,以便連結 器參考使用,而此反向過程即稱之為 demangling。 nlmconv 此工具程式可以將目的檔轉換成 NLM (NetWare Loadable Module) 的格式。
40
GNU Binary Utilities(binutils)
gprof 用來顯示程式的效率測試資訊 (profiling)。通常在我們要試圖提升程式的 執行效能時,我們必須要先知道程式的各部分到底花了多少時間來執行。 nm 此工具程式可以列出目的檔或函式庫中內含的物件名稱,包括所有的函式名稱與 全域變數的名稱 .... 等。
41
GNU Binary Utilities(binutils)
objcopy 此工具程式可以拷備、轉換不同格式的目的檔。 objdump 此工具程式可以列出目的檔內含的資訊。
42
GNU Binary Utilities(binutils)
ranlib 此工具程式可以產生包裹檔的內容索引,並加入該包裹檔中。此包裹檔即為 ar 程式所產生的包裹檔。通常產生靜態函式庫時需要用到它。 readelf 此工具程式可以顯示 ELF 格式的目的檔內含的資訊。
43
GNU Binary Utilities(binutils)
size 此工具程式可以列出目的檔或包裹檔中各節區的大小。 strings 此工具程式可以列出檔案中任何可印出的字串。 strip 此工具程式可以將目的檔或可執行檔中不必要的標記與資訊抽離,讓該目的 檔或可執行檔的大小縮小。通常是除錯資訊及其他符號標記。
44
GNU C Library (glibc) 凡是Unix族系的作業系統皆需要一個c函式庫, 在Embedded Linux中也不例外,通常也意指Native Library。 在此函式庫中定義了和System calls溝通的介面 , 和其它基本的功能像是open, malloc, printf, exit... 等等
45
GNU C Library (glibc) 西元1995年前GNU/Linux系統並不支援共享函式庫,當時應用程式都以靜態連結的方式。1995-1996年libc5問世,系統開始支援ELF可分享函式庫。
46
GNU C Library (glibc) Libc5問世後一兩年,GNU所開發的glibc做成C函式庫,此時glibc即為系統函式庫。比起libc5,glibc符合許多標準及規範。 ISO C POSIX Berkeley Unix SVID XPG
47
Cross-Toolchain 取得方式: 網路取得 (handhelds.org) 廠商提供 (開發板供應商) 自己制作 (不詳細介紹)
已編譯完成 廠商提供 (開發板供應商) 自己制作 (不詳細介紹) 需下載binutils、glibc、gcc等套件,並考慮其版本相依性。
48
Cross-Toolchain 網路取得 (handhelds.org) 註:解完後所放的位置是一定的,但必須依照原本 編譯時所存放的位置。
下載完後,使用下列步驟 : tar jxvf toolchain_name.tar.bz2 解完後放於/usr/local/arm/ export PATH=$PATH:/usr/local/arm/3.4.1/bin/ 設置完後即可使用toolchain。 註:解完後所放的位置是一定的,但必須依照原本 編譯時所存放的位置。 Toolchain網路位置:
49
Cross-Toolchain 廠商提供 同樣解開壓縮檔後,放於其指定的位置,因為相同是已編譯完成的跨平台工具鏈,所以要放在其編譯時期相同的位置。 設置 export PATH=$PATH:/toolchain位置/bin/ 設置完後即完成環境設置。
50
Cross-Toolchain 自己制作 必須至GNU網站下載GCC、Binutil及Glibc。 分別各自安裝,但互相會有相依性。
建立完成後,設置PATH Export PATH=$PATH:/toolchain路徑/bin PATH設置成功後,即可進行跨平台編譯。
51
Building Cross-Toolchain
設置核心標頭檔 (kernel header) 建立公用程式 (binutils) C編譯器的規劃 (C compile) 程式庫的規劃 (Glibc) 規模完整編譯器 (C / C++ compile) *一共包含 ar as gcc lib 等。
52
Building Cross-Toolchain
假設使用者為baw,建立編譯Cross-Toolchain所需要用到的目錄。 # mkdir -p /home/baw/Embedded_Linux_arm/Embedded_Project/tools/arm-linux 這樣將會循序地把沒有存在的目錄建立起來。 # ls /home/baw/Embedded_Linux_arm/Embedded_Project/tools/arm-linux 這樣即可知道是否已經建立起來,若沒有,會告知其目錄不存在。
53
Building Cross-Toolchain
設置編譯Cross-Toolchain的環境變數,將其寫於一個命令稿devel_cross PROJECT:表示此Project名稱 PRJROOT:表示編譯跨平台工具的根目錄 TARGET:表示目標板 PREFIX:表示安裝目錄 TARGET_PREFIX:表示因目標板改變的目錄 PATH:表示其環境變數
54
Building Cross-Toolchain
然後執行# . devel_cross,表示設環境變數 測試是否設定成功,如成功即會至指定目錄
55
Building Cross-Toolchain
設置Cross-toolchain各種套件原始碼放置位置於 $PRJROOT/build-source/ # mkdir $PRJROOT/build-source 下載各需要用到的套件至此目錄。 ftp://ftp.gnu.org/gnu/ 可下載 下載binutils、gcc、glibc和glibc-linuxthreads
56
Building Cross-Toolchain
接下來建立各套件所擺放位置,一共要建立Binutils、glibc、boot-gcc(中介編譯)及gcc #mkdir $PRJROOT/build-source/Binutils #mkdir $PRJROOT/build-source/Boot-Gcc #mkdir $PRJROOT/build-source/Glibc #mkdir $PRJROOT/build-source/Gcc
57
設置核心標頭檔 設置核心標頭檔,通常在Glibc編譯期間會用到核心標頭檔,但在此先設置。 下載核心原始碼。
至 在此下載Linux Kernel 建立於工作目錄的kernel目錄。 # mkdir $PRJROOT/kernel 把剛才下載的Kernel壓縮檔解壓縮,並放於目錄。 # tar zxvf linux tar.gz –C $PRJROOT/kernel/
58
設置核心標頭檔 更改kernel名稱 至kernel目錄 進行kernel組態 # cd $PRJROOT/kernel/
# mv linux linux 至kernel目錄 # cd $PRJROOT/kernel/linux 進行kernel組態 # make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig 進入組態畫面,需要選擇處理器及系統類型。 # make ARCH=arm CROSS_COMPILE=arm-linux- dep
59
設置核心標頭檔 組態畫面
60
設置核心標頭檔 建立核心標頭檔目錄 開始複製核心標頭檔 # mkdir $TARGET_PREFIX/include
# cp –r include/linux/ $TARGET_PREFIX/include # cp –r include/asm-i386/ $TARGET_PREFIX/include/asm # cp –r include/asm-generic/ $TARGET_PREFIX/include
61
Building binutils 解開原始碼,並解於工作目錄。 進入預設binutils工作目錄,並組態並安裝。
# cd $PRJROOT/build-source # tar zxvf binutils tar.gz 進入預設binutils工作目錄,並組態並安裝。 # cd Binutils # ../binutils /configure --target=$TARGET --prefix=$PREFIX # make # make install
62
Building binutils 組態畫面
63
Building binutils 當安裝成功後,在安裝目錄夾裡會有下列檔案。 安裝目錄夾為 $PREFIX/bin 一共有以下檔案:
arm-linux-addr2line arm-linux-ar arm-linux-as arm-linux-c++filt arm-linux-gasp arm-linux-ld arm-linux-nm arm-linux-objcopy arm-linux-objdump arm-linux-ramlib arm-linux-readelf arm-linux-size arm-linux-strings arm-linux-strip
64
Building C compiler 首先一樣解壓縮gcc套件。 進入gcc預設工作目錄,並組態。
# cd $PRJROOT/build-tools # tar zxvf gcc tar.gz 進入gcc預設工作目錄,並組態。 # cd Boot-Gcc/ # ../gcc /configure --target=$TARGET --prefix=$PREFIX --without-headers --with-newlib --enable-languages=c --without-headers 不使用標頭檔 --with-newlib 不使用glibc --enable-languages-c 只編譯C編譯器
65
Building C compiler Configure之後會產生其適當的Makefile,所以再來建立編譯器
# make all-gcc 編譯完成後,再接著安裝gcc # make install-gcc 可在$PREFIX/bin 裡頭查看是否有C Compiler。
66
Building Glibc 解開Glibc套件: 並再解開linuxthread套件: 移至glibc預訂工作目錄。
# cd $PRJROOT/build-source # tar zxvf glibc tar.gz 並再解開linuxthread套件: # tar zxvf glibc-linuxthreads tar.gz -C glibc-2.2.3/ 移至glibc預訂工作目錄。 # cd Glibc/
67
Building Glibc 開始建立C函式庫。 編譯glibc 安裝glibc
# CC=arm-linux-gcc ../glibc-2.2.3/configure --host=$TARGET --prefix=“/usr --enable-add-ons --with-headers=$TARGET_PREFIX/include 編譯glibc # make 安裝glibc # make install_root=$TARGET_PREFIX prefix=“” install
68
Building C/C++ Compiler
進入預設完整編譯器工作目錄,並組態。 # cd $PRJROOT/build-source/Gcc # ../gcc /configure --target=$TARGET --prefix=$PREFIX --enable-languages=c,c++ 組態完後編譯 # make all 編譯完後安裝 #make install
69
Building C/C++ Compiler
最後完全編譯成功後,目錄會有下列檔案
70
Cross-Toolchain $PRJROOT/tools 目錄的內容 bin cross-compile 工具
arm-linux 目標板的檔案 Include cross-compile 工具標頭檔 Info Gcc的info文件 Lib 讓cross-compile 工具使用 的函式庫 Man cross-compile線上文件 Share 無
71
Cross-Toolchain $PRJROOT/tools/arm-linux 目錄的內容 bin 和glibc有關的目標板二元檔
etc 只包括rpc include 目標板用以建應用程式的標 頭檔 info glibc 的 info lib 目標板使用的函式庫 libexec pt_chown檔 sbin 目標板的/sbin
72
Cross-Toolchain 每種不同版本套件組合成的Cross-Toolchain ,都會遇到不同的問題,最好利用Google搜尋解決法。 最好的方法還是利用已編譯好的Cross-Toolchain,但必須注意的是解壓縮後放置的位置,跟原始編譯的位置相不相同。
Similar presentations