dfasdfasdfsda

Download Report

Transcript dfasdfasdfsda

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