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