You are on page 1of 76

2010 NTUST B9702111 林可昀

Porting 流程簡介
 Building Embedded Linux System 五步驟

 必須先建立開發系統

 確認目標板

 建構開發環境
 Building Embedded Linux for Target
 燒寫至儲存裝置

 在建構 Embedded Linux 之前,必須先了解其開機運作流程,再

開始建構其所需要工具及整個根檔案系統。

 其中包括 Bootloader、Kernel、Root Filesystem

建構完成後,再燒寫至 Nand Flash,即可動作。


2010 NTUST B9702111 林可昀

Bootloader 介紹

 開機第一個執行的開機載入程式,通常並沒有限定要用何種

Bootloader,

 X86 平台上有 LILO、GRUB 等,

 ARM 平台上則有 U-Boot、VIVI 等。

 功能為硬體初始化, 將 kernel 從 flash 上讀到 RAM 空間中.

再跳至 kernel 第一條指令處執行等。

Linux Kernel 介紹

 主要動作有驅動週邊硬體設備、Network,掛載根檔案系統(Root

Filesystem)等。

 其中還包括記憶體管理程式,如分頁等。核心最後一步驟

就是掛載 Root Filesystem,

Root Filesystem 介紹

 根檔案系統包含了許多元件,其中包含系統函式庫,裝置節點

檔(device node),系統啓動檔,設定檔,系統應用程式及客製

應用程式等。
2010 NTUST B9702111 林可昀

使用教學
規格介紹

作業系統: Win7

Linux 版本: Ubuntu10.04

Kernel 版本: Linux 2.6.22

工作站: hp compaq Presario CQ45 筆電

ARM 編號: AT91SAM9263


2010 NTUST B9702111 林可昀

Let’s Start!

A. 安裝 vmware

B. 安裝 Ubuntu 10.04 LVS

安裝完成後關機

如果你直接讀光碟裡的 LINUX_IMAGE 檔。你可能會遇到一些狀況如下:

虛擬機文件在兩個不同版本的虛擬機上不能互用

如何解決
從別人處拷貝的虛擬機往往會出現以下提示錯誤:

Invalid configuration file: File "d:\My Documents\My Virtual Machines\Red Hat


Linux\Red Hat Linux.vmx" was created by a VMware product with more features than this
version of VMware Workstation and cannot be used with this version of VMware
Workstation.
Cannot open configuration file d:\My Documents\My Virtual Machines\Red Hat
2010 NTUST B9702111 林可昀

Linux\Red Hat Linux.vmx. 如圖所示:

出現這樣的錯誤怎麼解決呢?這種錯誤是版本不一樣造成的,解決辦法只
需要用記事本打開虛擬機目錄下的.vmx 文件,將“virtualHW.version =
"7"”中的“=”後邊的數字改為你現在使用的虛擬機的版本號即可。

C. 到 Vmware 設定光碟機,讀取 arm 廠商光碟

D. 此時會遇到一個問題,OS 還不是完整的中文版。此問題是在於 Ubuntu 的

語言支援檔不足,解決辦法如下:連上網路,update 支援檔!

語言問題
安裝後,由於語言支援檔不足的問題,畫面大部分都還是英文字。解決方法如下:
1. 點選上方選單的「System->Administration->Language Support」
2. 程式變會幫你偵測你的語言完整度,接著會跳出要讓你下載完整語言的視
窗,此時只要打個密碼,讓它自動下載完後,重新開機即可。

有/無線網路設定 for HP Presario CQ45


使用 DHCP 上網:
2010 NTUST B9702111 林可昀

I.
開機完成後

點選 vmware 右下方網路卡圖示(綠色的卡,左鍵點兩下)
2010 NTUST B9702111 林可昀

II.
使用 DHCP 上網,請選擇 bridged。

III.
選擇 AUTO eth0
2010 NTUST B9702111 林可昀

IV.
即可上網!!!

V.
NTUST 無線網路或家裡的 DHCP 無線網路設定都會一起完成

使用 DSL 撥接上網:
2010 NTUST B9702111 林可昀

I.
點選上方選單的「System->Preferences->Network Connections」

II.

選 DSL,再選 Add

III.
2010 NTUST B9702111 林可昀

輸入 username & password

在設定完成語言和網路後:

E. 重開機後,讀取 ARM 光碟中的 Linux 資料夾。

並安裝以下檔案到[檔案系統->opt->AT91SAM->linux_src]資料夾內
2010 NTUST B9702111 林可昀

檔案一共四個:清單如下
1 Linux-2.6.22.bar.bz2
2 2.6.22-at91.patch.gz
3 2.6.22-at91-exp.2.patch.gz
4 At91sam9263ek_defconfig

Q: opt 裡面沒有 AT91SAM 的資料夾!?

A: 是的,我們必須自己建立這個資料夾

如何建立資料夾?(透過終端機)
首先介紹常用檔案管理指令
cd 變換目錄
pwd 顯示目前位置
mkdir 建立資料夾
rmdir 刪除空資料夾

指令說明:
cd 是 change directory 的縮寫,用來變換工作路徑的指令。
cd .. 回到上一層
cd fish 進入 fish 資料夾
cd /usr/sbin 使用絕對路徑方式

pwd 是 print working directory 的縮寫

mkdir [-mp] [目錄名稱]


mkdir test 建立名稱為 test 的目錄
mkdir -m 711 testqq 建立權限為 711 的目錄
mkdir -p test1/test2/test3/test4 直接建立 test2...等上層目錄

rmdir [-p] [目錄名稱]


rmdir test 刪除名為 test 的目錄
被刪除的目錄裡面必定不能還有其他的目錄或檔案!

此時你可能會遇到這個狀況:
2010 NTUST B9702111 林可昀

是使用者權限不足的問題。難不成是我沒權限嗎?可是明明從安裝到現在又沒輸
入 root 的密碼,只有設定第一個使用者的帳號跟密碼阿!那 root 的密碼是啥?

之前的類 UNIX 系統都會限定 root 這個帳號只能在 console 登入,不能遠端登


入,以避免增加被入侵的機會。但是現在 Ubuntu 更進一步的把 root 帳號給關
了,然後預設提供 sudo(execute a command as another user),讓使用者以 sudo 方
式切換執行身份到 root 來去執行程式,而不用以 root 的身份登入!

解決方案如下:

使用者身份切換
以我的例子來說,我是用 kevin 登入。以 su 的指令直接將身份變成 root 即可,
但是這個指令卻需要 root 的密碼,也就是說,如果你要以 su 變成 root 的話,
你的一般使用者 kevin 就必須要有 root 的密碼才行;

但是安裝過程中,我又沒有設過 root 的密碼,那該怎麼辦?

用「sudo passwd root」來變更 root 的密碼


2010 NTUST B9702111 林可昀

再修改過密碼之後,我們將進行兩個步驟:

1. 讓使用者從 kevin 跳到 root


2. 套入 root 的環境參數檔。這樣就能隨意新增刪除檔案囉。

輸入 su 按 enter ,密碼則是輸入剛剛設定的[新的 UNIX 密碼],即可跳入 ROOT

輸入 su - 套入環境參數,如果沒更新環境參數,那你依然不能刪增資料夾!

解決萬難之後,別忘了最初我們要建立的資料夾 AT91SAM 和 linux_src 喔


2010 NTUST B9702111 林可昀

等建立完資料夾 AT91SAM 和 linux_src


再來就是安裝之前提到的四個檔案到 linux_src 資料夾!!
檔案一共四個:清單如下
1 Linux-2.6.22.bar.bz2
2 2.6.22-at91.patch.gz
3 2.6.22-at91-exp.2.patch.gz
4 At91sam9263ek_defconfig

Q: 如何安裝這些檔案
A:
這些檔案是 LINUX 的壓縮檔,我們必須用壓縮檔的指令讀取檔案

壓縮檔的副檔名如下:
.bz2 bzip2 壓縮檔
.gz gzip 壓縮檔
.tar Tar 程式打包的資料,並沒壓縮過
.tar.gz Tar 程式打包,並經過 gzip 的壓縮
.Z Compress 程式壓縮檔

gzip [-d#] 檔名 壓縮解壓縮指令


zcat 檔名.gz 讀取壓縮檔內容
2010 NTUST B9702111 林可昀

參數說明:
-d :解壓縮的參數!
-# :壓縮等級, 1 最不好, 9 最好, 6 是預設值!
gzip man.config 產生 man.config.gz 這個檔案
gzip -d man.config.gz 解壓縮,產生 man.config 這個
gunzip man.config.gz 檔案
gzip -9 man.config 以最大壓縮比壓縮 testing 這
個檔案
zcat man.config.gz 讀取出 man.config 的內容

bzip2 [-dz] filename 壓縮解壓縮指令


bzcat 檔名.bz2 讀取壓縮檔內容
參數說明
-c :將壓縮的過程產生的資料輸出到螢幕上!
-d :解壓縮的參數
-k :保留原始檔案,而不會刪除原始的檔案喔!
-z :壓縮的參數
-v :可以顯示出原檔案/壓縮檔案的壓縮比等資訊;
-# :與 gzip 同樣的,都是在計算壓縮比的參數, -9 最佳, -1 最快!
bzip2 -z man.config man.config 會變成
man.config.bz2
bzcat man.config.bz2 顯示 man.config.bz2 解壓縮之
後的檔案內容
bzip2 -d man.config.bz2 檔案解壓縮

tar 的選項與參數非常的多!請參考鳥哥

[root@www ~]# tar [-j|-z] [cv] [-f 建立的檔名] filename... <==打包與壓縮


[root@www ~]# tar [-j|-z] [tv] [-f 建立的檔名] <==察看檔名
[root@www ~]# tar [-j|-z] [xv] [-f 建立的檔名] [-C 目錄] <==解壓縮
選項與參數:
-c :建立打包檔案,可搭配 -v 來察看過程中被打包的檔名(filename)
-t :察看打包檔案的內容含有哪些檔名,重點在察看『檔名』就是了;
2010 NTUST B9702111 林可昀

-x :解打包或解壓縮的功能,可以搭配 -C (大寫) 在特定目錄解開


特別留意的是, -c, -t, -x 不可同時出現在一串指令列中。
-j :透過 bzip2 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.bz2
-z :透過 gzip 的支援進行壓縮/解壓縮:此時檔名最好為 *.tar.gz
-v :在壓縮/解壓縮的過程中,將正在處理的檔名顯示出來!
-f filename:-f 後面要立刻接要被處理的檔名!建議 -f 單獨寫一個選項囉!
-C 目錄 :這個選項用在解壓縮,若要在特定目錄解壓縮,可以使用這個選項。

其他後續練習會使用到的選項介紹:
-p :保留備份資料的原本權限與屬性,常用於備份(-c)重要的設定檔
-P :保留絕對路徑,亦即允許備份資料中含有根目錄存在之意;
--exclude=FILE:在壓縮的過程中,不要將 FILE 打包!

我的整理:
壓 縮 tar -jcv -f filename.tar.bz2 要被壓縮的檔案或目錄名稱
tar -cvf bird.tar bird 將目錄轉成一個檔案,沒有壓縮
tar -zcvf bird.tar.gz bird
壓縮一整個目錄成為 .tar.gz 檔案
解壓縮 tar -jxv -f filename.tar.bz2 -C 欲解壓縮的目錄
tar -xvf bird.tar
tar -zxvf bird.tar.gz
2010 NTUST B9702111 林可昀

F. Installing kernel and patch


先確定資料夾內的東西有這些:

接著請依下述指定,逐一執行! 安裝 kernel &補丁


2010 NTUST B9702111 林可昀

過程中,你可能要先 install patch

Q:What is patch?
A:
patch 即 修補程式:
是透過更新電腦程式或支援檔案,用來修補軟體問題的資料程式。包括像是修
正漏洞、臭蟲、改善易用性或效能等。然而,設計不良的修補程式可能帶來新的
問題。patch 的等義翻譯名稱有補丁、修補程式、修補檔、升級程式、升級檔等。

Apt-get install patch


系統會自動下載 patch ,同時會直接安裝套件。

Apt-get 指令適用於安裝補丁、套件。由於下載完的檔案不會存到硬碟,不建
議用此方式安裝大型軟體。
2010 NTUST B9702111 林可昀

Ubuntu Linux 系统下 Apt-get 指令

安裝

在終端機裡輸入:

apt-get install <package>


這樣系統會自動下載 <package> 以及所有的依存套件,同時進行套件的安裝。

移除

在終端機裡輸入:

apt-get remove [--purge] <package>


這樣系統會自動移除 <package> 以及任何依此存套件的其它套件。 --purge
指明套件應被完全清除。

升級

在終端機裡輸入:

apt-get update
這樣系統會自動由 Ubuntu 對映點更新套件列表,如果想安裝最新套件,必須先
執行一次。每次修改了 /etc/apt/sources.list 後,也必須執行一次。

在終端機裡輸入:

apt-get upgrade [-u]


這樣系統會自動將所有已經安裝在系統內的套件升級為最新版本。如果一個套件
改變了依存關係,而需要安裝一個新的套件時,它將不會被升級,而是標識成
hold。如果某個套件被設置 hold 標號,就不會被升級。

在終端機裡輸入:

apt-get dist-upgrade [-u]


和 apt-get upgrade 類似,dist-upgrade 會安裝和移除套件來滿足依存關係,
因此具有一定的危險性。
2010 NTUST B9702111 林可昀

G. 安裝 GCC
確認你已經完成以下三個指令
#:tar jxvf /opt/AT91SAM/linux_src/linux-2.6.22.tar.bz2
#: zcat /opt/AT91SAM/linux_src/linux-2.6.22/2.6.22-at91.patch.gz | patch -p1
#: zcat /opt/AT91SAM/linux_src/linux-2.6.22/2.6.22-at91-exp.2.patch.gz | patch
-p1

接下來開始安裝交叉編譯器
交叉编译器使用 CodeSourcery 提供的符合 EABI 標準的
arm-none-linux-gnueabi-gcc-4.3.3 交叉編譯器,下載地址:
http://www.codesourcery.com/sgpp/lite/arm/portal/package4571/public/arm-none-linu
x-gnueabi/arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2

1)下載後,解壓到/opt/目錄:
# tar jxvf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 -C /opt/
2)輸出交叉編譯器的可執行文件的路徑到 PATH 環境變數:
# export PATH=/opt/arm-2009q1/bin:$PATH

以後要用到 arm-linux-gcc-4.3.3 交叉編譯器時都應該先在終端上執行上面一句!


3)檢查是否安裝成功 GCC:
方法一: 指令輸入#:gcc,連按 tab 鍵多次,會自動顯示你安裝的相關檔案

方法二: 指令輸入#:gcc –v,顯示你已安裝的 gcc 版本


2010 NTUST B9702111 林可昀

H. About the Makefile


接下來你要修改Makefile的內容:
在 linux-2.6.22 中,支援各種市面上常見的處理器,而我們所使用的處理
是 arm,故需編輯 Makefile,修改 ARCH 及 CROSS_COMPILE 兩行,在 ARCH 那
欄輸入處理器的名稱“arm",而 CROSS_COMPILE 為工具鍊(tool chain)存放
的位置,需指至上一步解壓縮後的資料夾裡的 arm-2009q1/bin/arm-none-linux-g
nueabi-。(注意,其路徑未必與使用者相同)
#:cd opt/AT91SAM/linux_src/linux-2.6.22
#:gedit Makefile &

原 makefile 如上 修改後如下
2010 NTUST B9702111 林可昀

Q:What is the Makefile?


A:
Makefile 文件
Make 工具最主要也是最基本的功能就是通過 makefile 文件來描述源程序
之間的相互關係並自動維護編譯工作。而 makefile 文件需要按照某種語法進行
編寫,文件中需要說明如何編譯各個源文件並連接產生可執行文件,並要求定義
源文件之間的依賴關係。

makefile 文件是許多編譯器--包括 Windows NT 下的編譯器--維護編譯資


訊的常用方法,只是在整合開發環境中,用戶通過友好的界面修改 makefile 文
件而已。

Q:What is MAKE?
A:
無論是在 Linux 還是在 Unix 環境中,make 都是一個非常重要的編譯指令。
不管是自己進行項目開發還是安裝應用軟體,我們都經常要用到 make 或 make
install。利用 make 工具,我們可以將大型的開發項目分解成為多個更易於管
理的模組,對於一個包括幾百個源文件的應用程式,使用 make 和 makefile 工
具就可以簡潔明快地理順各個源文件之間紛繁複雜的相互關係。
2010 NTUST B9702111 林可昀

而且如此多的源文件,如果每次 都要按鍵輸入 gcc 指令進行編譯的話,那對程


序員來說簡直就是一場災難。而 make 工具則可自動完成編譯工作,並且可以
只對程序員在上次編譯後修改過的部分進行編譯。
因此,有效的利用 make 和 makefile 工具可以大大提高項目開發的效率。

I. AT91SAM Linux – Configure kernel


設定初始設定,需要複製at91sam9263ek_defconfig檔案至linux-2.6.22路徑
下,在安裝之前,需更新目錄清單,以便安裝基本的C compiler相關工具。
#:apt-get update(更新目錄清單)

#:apt-get install build-essential(接下來安裝c的函式庫)

安裝完後對at91sam9263ek_defconfig執行編譯
#:make at91sam9263ek_defconfig 註:at91sam9263ek_defconfig為版子的基本設定

#:apt-get install ncurses-base ncurses-bin ncurses-hexedit ncurses-term libncurses5

apt-get install libncursesw5 libncurses5-dev(註:如果無法執行,請先安裝此工具)


下載 http://packages.ubuntu.com/lucid/libncurses5-dev 安裝 i386 的版本即可
註:This package contains the header files, static libraries and symbolic links

輸入指令: #:make menuconfig (開啟 menu)


2010 NTUST B9702111 林可昀

開啟 menu 後,進入 Kernel Features 並開啟 EABI。


Q: 為何是 EABI
A:
因為 EABI 有 3 個優點:
1. 支持硬體軟體浮點功能
2. 系統效率提高
3. 編譯工具相容提升

其他的各種功能勾選,詳見下一步驟

J. AT91SAM Linux Kernel Setting


如果 kernel 版本為 2.6.22 menu 如下

這裡以 kernel 2.6.22 說明:


Code maturity level options 預設相同
General setup 預設相同
Load level module support 預設相同
Block layer 預設相同
System type 
Atmel AT91 System-on-chip 
2010 NTUST B9702111 林可昀

Bus support  預設相同

Kernel features 

Boot options 
2010 NTUST B9702111 林可昀

改成:
Mem=64M console=ttyS0,115200 initrd=0x21100000,20000000
root=/dev/mtdblock0 rw init=/sbin/init

Floating point emulation 預設相同


Userspace binary format 預設相同
Power management option 預設相同

Networking 

1. networking option 
2010 NTUST B9702111 林可昀

2. Wireless 

先選 generic ieee 802.11 networking stack 無(mac80211) 才會出現


紅色框框的選單

Device driver Generic driver option 


2010 NTUST B9702111 林可昀

Device driver 
Memory technology device (mtd) support Ram/ rom /flash chip drivers 

Device driver  Memory technology device (mtd) support mapping driver for chip
access 

Device driver  Memory technology device (mtd) support self-contained mtd


device driver  全部勾選起來!
2010 NTUST B9702111 林可昀

Device driver  block devices 

Device driver  block devices 

Device driver network device support  wireless lan 


2010 NTUST B9702111 林可昀

Device driver usb network adapters 

Device driver input device support hardware i/o ports

Device driver SPI support 


2010 NTUST B9702111 林可昀

Device driver Multimedia devices 


<*> Video For Linux

[*] Enable Video For Linux API 1 (DEPRECATED)

--- Enable Video For Linux API 1 compatible Layer

Video Capture Adapters →

V4L USB devices →

<*> USB Logitech Quickcam Messenger

<*> USB SN9C10x PC Camera Controller support

Device Drivers → Graphics support →

<*> Support for frame buffer devices

[*] Enable Video Mode Handling Helpers

[*] Enable Tile Blitting Support

<*> AT91/AT32 LCD Controller support

[*] Frame Buffer in internal SRAM

Console display driver support →

<*> Frambuffer Console support

[*] Frambuffer Console Rotation

[*] Select compiled-in fonts


2010 NTUST B9702111 林可昀

[*] VGA 8x8 font

[*] VGA 8x16 font

[*] Mac console 6x11 font (not supported by all dirvers)

[*] console 7x14 font (not supported by all drivers

[*] Pearl (old m68k) console 8x8 font

[*] Acorn console 8x8 font

[*] Mini 4x6 font

[*] Sparc console 8x16 font

[*] sparc console 12x12 font (not supported by all drivers)

[*] console 10x18 font (not supported by all drivers)

Logo configuration →

[*] Bootup logo

[*] Standard black and white Linux logo

[*] Standard 16-color Linux logo

[*] Standard 224-color Linux logo

Device driver real time clock 


2010 NTUST B9702111 林可昀

File systems 
2010 NTUST B9702111 林可昀

File systems Pseudo filesystems

File systems Miscellaneous filesystems 

File systems  Network File Systems


2010 NTUST B9702111 林可昀

其餘選項皆與預設相同!!

K. Kernel menu debuging


在此請特別注意:
1. kernel menu 如果沒有勾選好,依然可以順利作出 uImage,但最後
uboot 會無法開啟 kernel,下圖為開啟死當的狀況:
2010 NTUST B9702111 林可昀

Panic :死當
2. 特別注意關於 filesystem NFS 的設定是否開啟。對嵌入式 linux 系統
而言,目標系統可使用 NFS 協定從 NFS 伺服器來掛載根目錄檔案
系統。在此我們實驗版即是使用 NFS 掛載,如上圖 No NFS server
available,導致 kernel 開啟失敗。因此推斷 NFS 必須有正確的組態
設定。

Q:What is NFS?
A: NFS 是 Network File System。NFS 就好像是 UNIX 系統中的網路芳鄰,
您可以使用 NFS 將伺服器上的資料夾匯出,讓其他 UNIX 主機可以將所匯出的
資料夾掛入。當您有多台 UNIX 主機時,使用 NFS 可以讓您共享同一個資料夾。
2010 NTUST B9702111 林可昀

如此一來,同一份資料就不必放在多台機器上,而可以經由 NFS 來節省空間並


達到資料的同步。使用 NFS 不僅可以分享一個系統中的目錄,您也可以用來分
享光碟機、軟碟機等裝置。

3. 掛載命令列上(boot options),指定了 root=/dev/mtdblock0。這是一個


MTD 區塊驅動程式,可以讓我們利用區塊設備來存取 MTD 分割
區。MtdblockXX 是虛擬驅動程式,以區塊為基礎的方式存取快閃記
憶體的分割區。由於 mount 是透過區塊驅動程式來操作,所以 MTD
設定非常重要,如果 MTD 在 KERNEL MENU 沒有設定正確,同樣
會失敗。
Q: What is MTD driver?
A: MTD 是 Memory Technology Devices 的縮寫,是一種為 Flash File
System 設計的區塊驅動程式。每組 MTD 驅動程式包含一個字元類型與區塊類型
的驅動程式。字元類型屬於一種連續性的存取模式,可連續讀取寫入,一次 1byte.
區塊類型的存取方式即是硬碟所採用的方式,一次可以讀取寫入幾個區塊大小的
bytes.

4. 還有一個重點。Mount(掛載)命令使用唯讀選項(read only)。所謂的
ext2 影像檔正好非常適用在唯讀的目的。不過 mtdblock 驅動程式不
支援 ext2。因為 ext2 無法處理快閃記憶體的抹除區塊。我們必須使
用可存取快閃記憶體的檔案系統,像是 JFFS2 就是一種以快閃記憶
體為基礎的檔案系統。所以說,有關 JFFS2 的功能設定也是非常重
要。如果設定錯誤,可能導致無法讀取 EXT2 檔、實驗版同樣無法
進入 LINUX 系統。
Q: What is 抹除區塊?
A: 快閃記憶體有一種限制,即使它可以單一位元組的方式讀或寫入,但是抹
除一定是一整個區塊

L. Save the Kernel Setting


設定完畢後,請退出 如下圖
2010 NTUST B9702111 林可昀

記得存檔 如下圖
2010 NTUST B9702111 林可昀

M. 修改 Kernel Crystal 的設定


因 NT9263 是使用 18.432MHz crystal 不同於 ATMELAT91sam9263-EK 的板子,所以
我們必須更正設定。此設定位於/linux-2.6.27/arch/arm/mach-at91/下的
board-sam9263ek.c。
#gedit board-sam9263ek.c &
改成 18432000
2010 NTUST B9702111 林可昀

N.開始 Linux kernel build


在 cd /opt/AT91SAM/linux_src/linux-2.6.22
輸入指令#: make (1st build takes 5~10 minutes)

Make 完成,如上
此時會產生三個新檔案:
我們要燒錄到目標板的二進制内核鏡像文件 zImage
檔案位置:opt/at91sam/linux_src/linux-2.6.22/arch/arm/boot/

和編譯 kernel 生成的 kernel 鏡像文件 System.map 和 vmlinux


檔案位置:opt/at91sam/linux_src/linux-2.6.22/
2010 NTUST B9702111 林可昀

如上圖: zImage 位於:opt/at91sam/linux_src/linux-2.6.22/arch/arm/boot/

如上圖: System.map 和 vmlinux 位於 opt/at91sam/linux_src/linux-2.6.22/


2010 NTUST B9702111 林可昀

Q:What is kernel?
A:
kernel 是作業系統的核心元件,負責處理應用程式和硬體之間的溝通。在 Linux
系統中 kernel 是主要組成部分,它的功能幾乎表示整個系統的功能,它支援全部
系統裝置、S/W 協定和整個系統管理,然而有限記憶體空間不能允許我們把全
部的 kernel 功能放入系統內,幸好 GCC 提供一種聰明的編譯方法來建立必要的
功能,如果在編譯之前,不要選取不需要的項目,便會將這些項目忽略而不進行
編譯。Linux kernel 支援很多種不同的處理器,因應不同需求的平台,必須選擇
相對應的版本。

Q:What is vmlinux?
A:
Vmlinux 是核心的本尊,格式 ELE(二進位檔案的業界標準格式),包含符號、
註解、除錯訊息,以及所有架構皆共同的元件。
vmlinuz 是可引導的、壓縮的內核。“vm”代表“Virtual Memory”。Linux 支
持虛擬內存,不像老的操作系統比如 DOS 有 640KB 內存的限制。Linux 能夠
使用硬盤空間作為虛擬內存,因此得名“vm”。vmlinuz 是可執行的 Linux 內核,
它位於/boot/vmlinuz。

Q:What is System.map?
A:
System.map 用中文解釋就是 核心符號表
在進行程序設計時,會命名一些變量名或函數名之類的符號。Linux 核心是一個
很複雜的代碼塊,有許許多多的全局符號。
System.map 是存在於你的文件系統上的實際文件。當你編譯一個新核心時,
各個符號名的地址要發生變化,你的舊 System.map 具有的是錯誤的符號信
息。每次核心編譯時產生一個新的 System.map,你應當用新的 System.map
來取代舊的 System.map。
雖然核心本身並不真正使用 System.map,但其它程序比如 klogd, lsof 和
ps 等軟件需要一個正確的 System.map。另外少數驅動需要 System.map 來
解析符號,沒有為你當前運行的特定核心創建的 System.map 它們就不能正常
工作。
Q:What is zImage?
A:
kernel 的起始點有分兩種, 一種是沒有壓縮過的 vmlinux, 另外一種就是
zImage。zImage 提供開機載入程式下載的最終合成核心影像檔
2010 NTUST B9702111 林可昀

O. 製做 image 檔
在 cd /opt/AT91SAM/linux_src/linux-2.6.22
輸入指令 #:mkimage -A arm -O linux -C none -T kernel -a 20008000 -e 20008000
\-n linux-2.6 -d arch/arm/boot/zImage linux-2.6.22-uImage
或直接輸入: #:make uImage
如果遇到下圖這狀況

就依照指示安裝
2010 NTUST B9702111 林可昀

看到上圖的畫面,表示你已經完成 uImage 檔。
如下圖: 檔案位置:opt/at91sam/linux_src/linux-2.6.22/arch/arm/boot/

Q: What is the different between zimage and uimage?


A:
核心鏡像檔有兩種: zImage 和 uImage。其中 zImage 載到實驗版之後,可直接用
2010 NTUST B9702111 林可昀

uboot 的命令 go 來進行直接跳轉。這時候核心會直接解壓啟動。但無法掛載文件


系統,因為 go 命令沒有將核心所需的相關啟動參數傳給核心。傳遞啟動參數就
必須使用命令 bootm 來進行跳轉。Bootm 只能處理 uImage 鏡像檔。所以 uImage
適用於嵌入式

Q:How to use mkimage?


A:
mkimage 在製作映像文件的時候,是在原來的可執行映像文件的前面加上一個
0x40 字節的頭,記錄參數所指定的信息,這樣 uboot 才能識別這個映像是針對
哪個 CPU 體系架構,哪種 OS,哪種類型,載入記憶體中的哪個位置, 入口點
在記憶體的那個位置以及映像名是什麼

/mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d


data_file[:data_file...] image \

參數說明: -A 指定 CPU 的體系結構:


指定 CPU 的體系結構 參數表示的 CPU 體系結構
alpha Alpha
arm ARM
x86 Intel x86
ia64 IA64
mips MIPS
mips64 MIPS 64 Bit
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 Bit
m68k MC68000

-O 指定操作系統類型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、
ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos

-T 指定映像類型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
2010 NTUST B9702111 林可昀

-a 指定映像在記憶體中的載入地址,映像下載到記憶體時,要按照用 mkimage
製作映像時,這個參數所指定的地址值來下載

-C 指定映像壓縮方式,可以取以下值:
none 不壓縮
gzip 用 gzip 的壓縮方式
bzip2 用 bzip2 的壓縮方式

-e 指定映像運行的入口點地址
-n 指定映像檔名

-d 指定製作映像的源文件

其中指定參數 "-a 0x30008000 -e 0x30008000" 指定值不會隨軟體版本有所更


改,這個值是根據 CPU 的記憶體配置而指定的。
2010 NTUST B9702111 林可昀

P. 連接板子

1. USB-JTAG 接到電腦 USB、接好電源線和網路線


2. 安裝驅動程式:
WIN XP: 讓 OS 去光碟裡自動搜尋驅動
WIN7: 讓 OS 自動網路搜尋驅動
(等待約 10 分鐘,如果 WINDOWS 發現多個驅動版本,請選最新版本)

安裝完畢先重新開機,再到裝置管理員檢查:
應該會有兩個 USB Serial Port(COMXX)
2010 NTUST B9702111 林可昀

使用 PUTTY 連上版子
選 Serial  speed:115200  Serial line: COMXX (依電腦不同) OPEN

如果成功讀取,表示板子內已有 UBOOT,不須再燒入 UBOOT


如果畫面只出現 RomBOOT 的文字,表示板子沒有 UBOOT,須另外燒入!
2010 NTUST B9702111 林可昀

Q. Kernel 與 Root File System 搭配


除了 kernel 之外,讓作業系統能順利運作還需要另外一項元素-- filesystem,它
紀錄了一個作業系統在運作的過程中所需的程式、資料紀錄等。接下來我們將從
無到有建立一個最基本的 filesystem!

Q: What is root file system?


A:
Root filesystem 是構成 filesystem 的最小集合,它包含所有 Linux 開機時需要的
檔案及資料夾,如 initrd 、init.d 裡的各項服務,、/etc、/proc、/lib 等,而且位
置全都是從根目錄( / )開始,它可以算是整個 filesystem 的源頭。在嵌入式
系統中, root filesystem 通常包含了能滿足各種基本使用的工具,如 ls 、 mount
等,之後如果需要額外的儲存空間或檔案則是再透過 mount 來把其他的儲存裝
置掛載進來。

Q: How to build root file system?


A:
Root filesystem 大致上包含三部份
1. 各種常用的工具
2. 一些關於系統組態的設定檔
3. 基本的資料夾結構。
我們主要使用 busybox 來製作各項工具及生成基本的資料夾。

Q: What is Busybox?
A:
Busybox 是一套常被嵌入式系統使用的程式,它主要的功能是提供了各種常用的
指令來操作系統,並且將所有指令包成一個執行檔,因為他的各項指令經過改
寫,編譯出來的執行檔大小會較一般 Linux 上使用的指令來得小,很適合在嵌
入式系統這種資源有限的情況下使用。
 包含了許多 UNIX 微小版公用程式,其中包含了 fileutils、shellutils 及
loginutils 等。
 所有公用程式都是連結檔,連結至單一執行檔 Busybox,此檔案只有數百
k 大小。
2010 NTUST B9702111 林可昀

首先我們第一步是建立 Busybox 資料夾,可位於隨意資料夾,在此我習慣放在


/opt/AT91SAM/
#: mkdir busybox
在 Busybox 裡建立 install 及 src 兩個子目錄
#:mkdir src
#:mkdir install

我們要在在 install 裡建立 bin、mnt、sbin、tmp、var、dev、lib、proc、root、sys,


這些資料夾都是 linux 常見的目錄,藉由此方法完成基本的資料夾結構。在此請
注意,我們最後會掛載 install 資料夾內的資料到實驗板上。
# : mkdir bin/ etc/ mnt/ sbin/ tmp/ var/ dev/ lib/ proc/ root/ sys/

Q:What is mknod?
A:
/dev 裡所放置的是裝置檔,必須先建構。建立裝置檔案有時候系統裡沒有幫你
預先建立 某些裝置的對應檔案時,可以透過 mknod 指令自己建立。但是對應
的編號、類型可是有固定的。

進入 busybox/install/dev 中,輸入以下指令,建立裝置檔。
請注意這個部分,以下指令要確實輸入! 否則會導致缺少裝置、無法開機!
mknod fb0 c 29 0
mknod null c 1 3
mknod ram0 b 1 0
2010 NTUST B9702111 林可昀

mknod tty c 5 0
mknod tty0 c 4 0
mknod sda b 8 0
mknod sda1 b 8 1
mknod sda2 b 8 2
mknod sdb b 8 16
mknod sdb1 b 8 17
mknod sdb2 b 8 18
mknod dsp c 14 3
mknod ttyS0 c 4 64
chmod 644 ttyS0
ln -s ttyS0 console

基本裝置節點檔

mem

實體記憶體存取
類型 字元 主編號 1 次編號 1 權限 600

null

Null 裝置,進入此裝置即會成無形。

類型 字元 主編號 1 次編號 3 權限 666

zero

以 null byte 為資料來源

類型 字元 主編號 1 次編號 5 權限 666

random

亂數產生器

類型 字元 主編號 1 次編號 8 權限 644

tty0

現在的虛擬操控台

類型 字元 主編號 4 次編號 0 權限 600

tty1

第一個虛擬操控台
2010 NTUST B9702111 林可昀

類型 字元 主編號 4 次編號 1 權限 600

ttyS0

第一個 UART 序列埠

類型 字元 主編號 4 次編號 64 權限 600

tty

現行的 TTY 裝置

類型 字元 主編號 5 次編號 0 權限 666

console

系統控制台

類型 字元 主編號 5 次編號 1 權限 600

接下來將光碟內的 busybox-1.14.3.tar.tar 複製到 busybox/src 裡,並進行解壓縮


#: tar jxvf busybox-1.14.3.tar.tar

然後修改 Makefile 檔,選擇我們所需要的 cross_compiler


#:gedit Makefile &
CROSS_COMPILE ?= /opt/arm2009q1/bin/arm-none-linux-gnueabi- (位於 164 行)
ARCH ?= arm (位於 190 行)
2010 NTUST B9702111 林可昀
2010 NTUST B9702111 林可昀

選擇好我們所要的 cross_compiler 後,開始設定 busybox 組態選項:


#make menuconfig

1. 確認 Busybox Setting→Installation Options→Busybox installation prefix 的內


容為指到 busybox/install 的路徑

2. 確認 Busybox Settings Build Options  Cross Compiler prefix 的內容為


/opt/arm2009q1/bin/arm-none-linux-gnueabi-

3. 確認 Busybox Setting →Busybox library Tuning →

[*] Command line editing

[*] Additional editing keys

[*] vi-style line editing command

[*] History saving

[*] Tab completion

完成設定後選擇 exit 離開並存檔,如下圖


2010 NTUST B9702111 林可昀

輸入指令 #: make 編譯 busybox 的組態設定

編譯完成會如同上圖

輸入指令 #make install


將 Busybox 安裝至我們的 root filesystem 目錄(即 install/ 目錄)
2010 NTUST B9702111 林可昀

Install 完成如上圖!
然後去確認 install/bin 資料夾內是否安裝好 Busybox 指令,如下圖

出現上圖畫面,表示 busybox 安裝成功

Q: What is bashrc?
A:
登入 Linux 的 console 操作環境後,會出現一個提示符號,在這個提示符號之
後可以輸入指令,Linux 根據輸入的指令會做回應,這一連串的動作是由一個所
謂的 Shell 來做處理。 Shell 是一個程式,最常用的就是 Bash,這也是登入
系統預設會使用的 Shell。 profile 與 bashrc 都是 Shell 的啟動設定檔,角色
2010 NTUST B9702111 林可昀

類 MicrosoftDOS/Windows 下的 autoexec.bat 檔案
1.bashrc
系統啟動後就會自動執行。
2.profile
用戶登入後才會執行。

在 linux 介面如果常使用指令像是"ls -al"之類的指令,我們會把用習慣的指令


改成"ll"或"lm"等等,就把常用的指令直接寫入~/.bashrc,每次開機就會自動
載入你慣用的指令了。另外我們也可以把 bashrc 稱做系統的環境設置文件。

輸入指令 #gedit ~/.bashrc


最後一行輸入
export PATH=$PATH:/opt/arm-2009q1/bin

修改如上圖

存檔後,我們要重新啟動.bashrc 檔,才能套入剛才的新設定
#source ~/.bashrc

指令輸入後,立即重新啟動。如上圖

到install/bin下,輸入下列指令,檢查Busybox會使用到哪些函式庫
#arm-none-linux-gnueabi-objdump busybox –p
你可能會遇到下圖的狀況
2010 NTUST B9702111 林可昀

如果遇到此狀況
請改輸入#arm-none-linux-gnueabi-objdump –p busybox

輸入完指令後,會得到以下結果 (如上圖)
required from libm.so.6:
0x0d696914 0x00 03 GLIBC_2.4
required from libc.so.6:
0x0d696914 0x00 02 GLIBC_2.4
private flags = 5000002: [Version5 EABI] [has entry point]
2010 NTUST B9702111 林可昀

提示說,busybox 建置需要用到 libm.so.6、libc.so.6、ld-linux.so.3、libcrypt.so.1


將檔案複製到 opt/At91SAM/Busybox/install/lib

在 install/etc/下建立 fstab 文件 (系統初始表)

#vi fstab
填入內容
#
/dev/ram0 / ext2 defaults 1 1
proc /proc proc defaults 0 0
devpts /dev/pts devpts mode=0620,gid=5 0 0
usbdevfs /proc/bus/usb usbdevfs noauto 0 0
我們在 linux 中常常用 mount 命令把硬碟分區或者光碟掛載到文件系统中。
/etc/fstab 就是在開機引導的時候自動掛載到 linux 的文件系统。
2010 NTUST B9702111 林可昀

在 install/etc/內建立 inittab
# vi inittab
填入內容
# /etc/inittab
console::sysinit:/etc/rc.d/rc.init
ttyS0::respawn:/bin/sh

Q: /etc/inittab 的功能是甚麼?
A: init process

當 init 啟動時,會讀取系統的組態設定檔/etc/inittab

init 是在核心 mount 進 root 後,第一個執行的程式 (第一個 process),init 所負


責的工作包括:

 執行 /etc/rc.d/ 裡的 scripts
 將系統由開機狀態 (boot-up state) 切換至多使用者狀態 (multiuser state)
 負責載入 tty (本地端) 的 login shell
 負責開機與關機的程序 (procedure)。

開機完成後,init 仍會保持在背景執行,並同時監視與修改系統執行狀態。init 監
視許多系統的動作,適時改變系統的狀態,這些動作定義在 /etc/inittab 檔案裡。

在 install/etc/rc.d 內建立檔案 rc.init (開機啟動命令檔稿,開機時的組態設定工具)

# mkdir rc.d
# cd rc.d
# vi rc.init
填入內容
#! /bin/sh
# Set the Path
mount -t proc none /proc
mount -t sysfs none /sys
export PATH=/bin:/sbin:/usr/bin:/usr/sbin
export HOME=/home/root
echo “Configuring loopback interface”
ifconfig lo 127.0.0.1
# Start a shell
bin/sh
2010 NTUST B9702111 林可昀

R. 製作 Root Filesystem 映像檔


(Image File)
Let’s start:
目標: 將 install/目錄製作成 ext2 檔案格式的 root filesystem 映像檔
將工具檔案 genext2fs-1.4.1.tar.gz 解壓縮並編譯安裝

# tar zxvf genext2fs-1.4.1.tar.gz (如上圖)


# cd genext2fs-1.4.1
# ./configure check 標頭檔案、library、編譯器

Configure 完畢如上圖
2010 NTUST B9702111 林可昀

# make

Make 指令完成 如上
接著執行指令
# make install

Make install 完成如上


回到 Busybox 資料夾底下
使用 genext2fs 將 install/包裝成 ext2 格式的 root filesystem
# genext2fs -b 8192 -i 1024 -d install/ ext2fs
# genext2fs -b 17408 -i 1024 -d install/ ext2fs
# gzip -9c ext2fs > ext2fs.gz

完成!如上圖
2010 NTUST B9702111 林可昀

再來就是確認 opt/AT91SAM/Busybox 下有產生兩個檔案


ext2fs 和 ext2fs.gz
2010 NTUST B9702111 林可昀

S. 藉由 TFTP 使 Uboot 載入 Kernel


首先要把 ext2fs.gz 和 uImage 檔放到 win7 (pls 參考附錄 winSCP 教學)

將實驗板接到電腦

只要接網路線、MiniUSB to USB、電源 共三個


接著,想辦法讓實驗板和電腦連接變成區網
2010 NTUST B9702111 林可昀

開始搜尋並執行 cmd指令:ipconfig
2010 NTUST B9702111 林可昀

紀錄網卡 IP、MASK、GATEWAY
接著到控制台網路和網際網路檢視網路狀態及工作
2010 NTUST B9702111 林可昀

點選區域網路(紅色圈圈)內容網際網路通訊協定第四版 TCP/IPv4

改成剛才你所記錄的網卡資料
2010 NTUST B9702111 林可昀

這樣就設完區網了

接下來開始用 TFTP
下載 TFTPD32 軟體: http://tftpd32.jounin.net/tftpd32_download.html
解壓縮放到桌面後,將 uImage 和 ext2fs.gz 兩個檔案放到 tftpd32 同一個資料夾
底下

開啟 tftpd32.exe 後,會自動載入檔案資料(下圖)
2010 NTUST B9702111 林可昀

開啟 putty 連接到實驗板,uboot 會自動使用 tftp 傳送 uImage 和 ext2fs (下圖)

如果出現下圖畫面,表示 kernel 開啟失敗! 一些失敗原因的解釋,之前在 kernel


menu 的地方有提過,請回到第 K 步驟查看!
2010 NTUST B9702111 林可昀

如果出現下圖,最後一行出現#的符號,表示你已經 porting 成功!


2010 NTUST B9702111 林可昀

實驗版已經可以執行 linux 簡單的指令

End
2010 NTUST B9702111 林可昀

附錄:
如何將檔案從 VMware 複製到 windows?
兩種方法:
1. Use e-mail such as Yahoo!
2. Use winSCP (better!)

winSCP 教學
壹、 光碟內  Tools 資料夾  WINSCP418  winscp418setup 執行!

建議英文版!有些電腦安裝完簡體中文版,結果出現亂碼….一直按下一步!
2010 NTUST B9702111 林可昀
2010 NTUST B9702111 林可昀

貳、 開啟

會出現上圖畫面!

User name 是 ubuntu 中你所設定的使用者帳號


Password 是 ubuntu 中使用者帳號的密碼

Host name 是 ubuntu 在 vmware 的 ip


ip 查詢方法如下:
1. 進入 ubuntu
2. 輸入指令#: ifconfig
2010 NTUST B9702111 林可昀

參、

Tip: 如果嫌麻煩,可以把此設定存起來(save),方便下次使用
2010 NTUST B9702111 林可昀

如果成功連接到 ubuntu,會要求輸入密碼登入,如下圖,

肆、
如果登入成功,即進入下圖畫面。你已經可以在 windows 和 vmware 之間隨意移
動檔案!

You might also like