Building Embedded Linux 2
Building Embedded Linux System五步驟 必須先建立開發系統 確認目標板 建構開發環境 Building Embedded Linux for Target (此章) 燒寫至儲存裝置(此章)
Outline 前言及介紹 Bootloader Kernel Root Filesystem 燒寫資料至flash
此章節使用套件 vivi bootloader(0.1.4) Linux kernel(2.4.18) Busybox(1.0.0) JFlash
前言 在建構Embedded Linux之前,必須先了解其開機運作流程,再開始建構其所需要工具及整個根檔案系統。 其中包括三個主要部份 一個是Bootloader,一個Kernel及另一個Root Filesystem。建構完成後,再燒寫至Nand Flash,即可動作。
熟悉開機流程 電源開啓 部份硬體初始化, 讀取Linux Kernel 驅動週邊裝置, network、掛載 Root FileSystem 不一定是init, 可以自行指定
Bootloader介紹 開機第一個執行的開機載入程式,通常並沒有限定要用何種Bootloader, X86平台上有LILO、GRUB等, ARM平台上則有U-Boot、VIVI等。 功能為硬體初始化, 將kernel從flash上讀到RAM空間中. 再跳至kernel第一條指令處執行等。
Linux Kernel介紹 主要動作有驅動週邊硬體設備、Network,掛載根檔案系統(Root Filesystem)等。
Root Filesystem介紹 根檔案系統包含了許多元件,其中包含系統函式庫,裝置節點檔(device node),系統啓動檔,設定檔,系統應用程式及客製應用程式等。
開發流程 步驟1 步驟2 步驟3 步驟4 建立Cross-Toolchain 使用Cross-Toolchain編譯目標板的Bootloader 步驟3 使用Cross-Toolchain編譯目標板的Kernel 步驟4 使用Cross-Toolchain建立目標板的Root Filesystem
開發流程 步驟5 步驟6 步驟7 使用工具燒寫Bootloader至目標板的Flash 使用工具燒寫Kernel至目標板的Flash 使用工具燒寫Root Filesystem至目標板的Flash
開發流程 步驟1 步驟2 步驟3 步驟4 步驟6 步驟7 步驟5 開發流程
開發方式 透過 rs232 開發
前言及介紹 Bootloader Kernel Root Filesystem 燒寫資料至flash
Bootloader (vivi) 支援ARM Core處理器的Bootloader眾多,在此以MIZI公司所開發的VIVI Bootloader為預設使用的Bootloader,沒有限定一定要何種Bootloader。
Bootloader (vivi) vivi – 韓國 MIZI公司所開發的bootloader專門使用在arm系列平台上,並且開放原始碼採用GPL授權,支援SA-1110, S3C2400, S3C2410, PXA250 Processors。 出處 : http://www.mizi.com/
Bootloader (vivi)特色 It's easy to add new Processor. It's easy to add new board. It's easy Porting Kernel device driver. It supports Various MTD. You can add sample source code or can load test code to RAM. 出處 : http://www.mizi.com/
Bootloader (vivi) 初始化硬體. 將kernel,rootfs從Flash複製到RAM, 並執行kernel. 設定CPU頻率, 點亮LED, 將kernel,rootfs從Flash複製到RAM, 並執行kernel. vivi 有能夠將資料寫入Flash的功能 經由serial port傳輸 提供一個能夠對目標板下command的介面 經由serial port
Bootloader (vivi) 能夠經由JTAG cable、Serial cable、 Ethernet cable 傳輸檔案。
Bootloader (vivi) 下載完後,置於$PRJROOT/boot/ 移至vivi位置 解開vivi # cd $PRJROOT/boot/ 解開vivi # tar jxvf vivi.tar.bz2 解開後,會出現vivi/目錄夾,則進入。 # cd vivi/
編譯 Bootloader (vivi) 選擇所需組態 編譯出映像檔 映像檔所在位置 # make menuconfig # make vivi所在目錄/vivi
Bootloader (vivi) System Type General setup Serial Port 處理器型號 General setup Cache Enable (Dual Cache) Serial Port Serial Port support Memory Technology Devices(MTD) support nand flash device。
選擇所需組態 # make menuconfig
選擇所需組態 進入System type 點選ARM system type 再選取S3C2410-based
選擇所需組態 進入System type 點選Implementations 支援NAND Boot
選擇所需組態 General setup s3c2410X有dual cache,I-cache、D-cache
選擇所需組態 Memory Technology Devices(MTD) NAND Flash Device Drivers
離開設定組態
選擇所需組態 當所有選項都選擇完畢後,離開時,請記得要儲存新的VIVI組態。選擇Yes。
編譯完成 當選擇組態完,即可編譯(make)出二元執行檔。編譯出的執行檔位於相同的vivi/目錄中,檔名也預設為vivi。 二元執行檔
Bootloader (vivi) 處於開機時,可按任何一鍵進入vivi的功能列,下圖為其功能。
Bootloader (vivi) 於vivi開機時可將檔案寫入Flash # Load flash PartitionName x flash = 所要載入的記憶體 PartitionName = 可在vivi開機時設定 有三個區塊可選,kernel、root及vivi x = 選擇以xmodem傳輸
Bootloader (vivi) 可使用Windows 裡的超級終端機傳送。也可使用linux中的minicom。
Bootloader (vivi) 於vivi開機時可進入vivi功能列,設定kernel的命令列(set parameter)。 # param set linux_cmd_line “命令列參數”
前言及介紹 Bootloader Linux Kernel Root Filesystem 燒寫資料至flash
Linux Kernel架構 在此簡略介紹Linux kernel源碼的架構。並不深入講解其原理。 Documentation、arch、drivers、fs、include、init、ipc、kernel、lib、mm、net及scripts。
Linux Kernel架構 arch include 包括所有和硬體結構相關的核心程式。每個子目錄都代表一種支援的硬體體系結構。例如S3C2410微處理器,如有支援則在 arm目錄下。 include 包括編譯核心時所需要的相關標頭檔。與平台無關的標頭檔在 include/linux 子目錄下。而和平台相關的,例如arm,則是在include/asm-arm/子目錄下。
Linux Kernel架構 init mm 目錄包含核心初始化程式,包含兩個檔案main.c和Version.c,這是研究核心的起點。 包括所有獨立於CPU結構的記憶體管理程式,如分頁等,而與CPU族系結構相關的記憶體管理程式則位於 arch/CPU_Name/mm/。
Linux Kernel架構 kernel drivers 主要的核心程式。實現大部份linux system核心函式,其中例如sched.c。和CPU族系結構相關的程式在arch/CPU_Name/kernel中 drivers 系統所有的週邊設備驅動程式。每種驅動程式都各自有一個獨立子目錄。其中包括音訊、MTD、網路及各週邊裝置等。
Linux Kernel 在開發Embedded Linux時,使用的Kernel必須要注意,是否支援所要開發目標板的微處理器, 可從kernel.org取得最新消息。 有支援處理器,不代表就有支援其週邊裝置。
Linux Kernel 各個不同的開發板,即使是相同微處理器,但未必週邊裝置都相同。 如要自己移殖Linux Kernel至開發板,必須對整個Kernel有深入了解,並且要有撰寫週邊裝置及移殖的能力。
Linux Kernel 標準版Linux Kernel,只有在2.6.6以後才有支援S3C2410X,在之前的所有版本皆沒有支援。 可以從網路上取得別的版本有支援的。或是從開發板的廠商取得。
Linux Kernel 一般而言,當購買開發板時,廠商必須提供完整並可在目標板運作的Linux kernel,並且包括其所有週邊裝置的Device driver。 在此預設使用的kernel為廠商所提供。
Linux Kernel組態及編譯 在kernel解開目錄下,設定kernel組態 產生相依性,編譯出映像檔. 映像檔所產生的位置 # make menuconfig 產生相依性,編譯出映像檔. # make dep;make bzImage 映像檔所產生的位置 /kernel source code/arch/arm/boot/zImage
Linux Kernel組態及編譯 如不是用開發商已修正過的kernel,編譯時需加參數。 # make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig # make ARCH=arm CROSS_COMPILE=arm-linux- dep 有以上參數後,也會連帶更改compiler,assembler等。
Linux Kernel 組態 # make menuconfig
Linux kernel 離開組態
Linux kernel 離開組態 離開時,同樣記得要儲存。
Linux Kernel 編譯不同處 標準kernel和修正過的kernel在make menuconfig時,某部份會產生出不同的選單。 特別是在和CPU族系結構有相關的選項,例如System type。
Linux Kernel 編譯不同處 如下圖,不同CPU族系,在System type會有不同的選項。下列舉列為S3C2410(ARM)
前言及介紹 Bootloader Kernel Root Filesystem 燒寫資料至flash
Root Filesystem 在建構Root Filesystem時,會在本地端(Host),也即是標準Linux平台上,建立一個自訂目錄,以這個目錄作為開發未來目標板根檔案系統的根目錄。 必須熟記此目錄,之後的跨平台編譯完的程式,都將安裝於此目錄。
標準Linux檔案系統結構 /dev /root /boot /bin /usr /lib /etc /tmp /proc…
Root Filesystem 假設在本地端(Host)所要開發根檔案系統的目錄設為$PRJROOT/rootfs_SBC-2410X。 # mkdir $PRJROOT/rootfs_SBC-2410X 建立根檔案系統所需的目錄。 # cd $PRJROOT/rootfs_SBC-2410X # mkdir bin boot dev etc home lib mnt opt proc root sbin tmp usr var
建構系統函式庫 系統函式庫,將Cross-Toolchain裡的library拿來使用,並依各自需求,分別取用該使用的library。並且分別放至下列。 $PRJROOT/root_SBC-2410X/lib $PRJROOT/root_SBC-2410X/usr/lib 通常除了實體library,還包括符號連結。 例如libm-2.2.3.so為實體函式庫 libm.so.6為符號連結
Glibc 介紹 ld libBrokenLocale libSegFault 動態連結檔 用來擷取記憶區段錯誤(segmentation fault)。
Glibc 介紹 libanl 非同步名稱查詢函式 libc 主要C程式的函式 libcrypt 密碼學函式
Glibc 介紹 libdl libm libmemusage 用來動態載入共享目的檔的函式 數學函式 進行Heap和Stack記憶統計的函式
Glibc 介紹 libnsl libpcprofile libpthread libthread_db NIS網路服務程式庫函式 程式計數器統計函式 libpthread Linux 的Posix 1003.1c執行緒常式 libthread_db 執行緒除錯函式
Glibc 介紹 libresolv 名稱解析器函式。 librt 非同步I/O函式。 libutil 登入函式。終端機連線管理會用到
建構裝置節點檔 Linux系統中,任何裝置皆可視為檔案,主要放置於根檔案系統中的/dev目錄中。 若編譯kernel時,在File systems裡選取了/dev file system support(devfs)的話,將其掛載後會動態產生其裝置節點檔。
devfs 如欲選取devfs。如下
建構裝置節點檔 /dev 裡所放置的是裝置檔. 必須先建構. # cd $PRJROOT/rootfs_SBC-2410X/dev # mknod ttyS0 c/b 4 64 ttyS0 = 裝置檔名稱 c/b = 字元裝置 or 區塊裝置 4 = major number 64 = minjor number *kernel source code/Documentaion/devices.txt 可在此查閱對應表,並可得知其主次編號。但額外寫的driver不一定會照此表。
基本裝置節點檔 mem null zero 實體記憶體存取 Null裝置,進入此裝置即會成無形。 以null byte為資料來源 類型 字元 主編號 1 次編號 1 權限 600 null Null裝置,進入此裝置即會成無形。 類型 字元 主編號 1 次編號 3 權限 666 zero 以null byte為資料來源 類型 字元 主編號 1 次編號 5 權限 666
建構裝置節點檔 random tty0 tty1 亂數產生器 現在的虛擬操控台 第一個虛擬操控台 類型 字元 主編號 1 次編號 8 權限 644 tty0 現在的虛擬操控台 類型 字元 主編號 4次編號 0權限 600 tty1 第一個虛擬操控台 類型 字元 主編號 4 次編號 1 權限 600
建構裝置節點檔 ttyS0 tty console 第一個UART序列埠 現行的TTY裝置 系統控制台 類型 字元 主編號 4 次編號 64 權限 600 tty 現行的TTY裝置 類型 字元 主編號 5 次編號 0 權限 666 console 系統控制台 類型 字元 主編號 5 次編號 1 權限 600
建構裝置節點檔 建構framebuffer,不指定權限。
建構裝置節點檔 建構tty,並且指定其權限。
系統應用程式 在此以Busybox套件,編譯成目標板所需的系統應用程式,使用Busybox套件所編譯出的程式十分微小,故非常符合使用在Embedded Linux裡。
BusyBox 由Bruce Perens於1996年所發起的計劃,目的在協助Debian發行套件建立安裝磁碟。 1999年開始,由uClibc的維護者Erik Andersen接手維護。 此計劃網站位於http://www.busybox.net/
BusyBox 包含了許多UNIX 微小版公用程式,其中包含了fileutils、shellutils及loginutils等。 所有公用程式都是連結檔,連結至單一執行檔 Busybox,此檔案只有數百k 大小。
BusyBox 在2004年10月13日 busybox1.0.0版釋出後, 做了二項重大改變,也讓使用上較為人性化 從純文字編輯選項 => 圖形化選取功能 busybox 結合 tinylogin (login套件)
Busybox定義函式
BusyBox V 1.0.0 安裝步驟 : make menuconfig, make all install. 跨平台參數 : TARGET_ARCH 目標版 (cpu 族系) CROSS 跨平台參數 PREFIX 安裝路徑 (make TARGET_ARCH=arm CROSS=arm-linux- PREFIX=/目標位置 all install )
BusyBox # make menuconfig
BusyBox Archival Utilities Coreutils Editors Linux System Utilities 例rpm,unzip,gunzip Coreutils 例chmod,chown,cp,env,mv,mknod Editors 例Vi Linux System Utilities 例mount,fdisk
BusyBox Finding Utilities Init Utilities 例find,grep Init Utilities 例init,reboot,poweroff Login/Passwd Management Utilities 例login,passwd Linux Module Utilities 例insmod,lsmod
BusyBox Networking Utilities Process Utilities 例wget,route,ifconfig,netstat Process Utilities 例Free,kill,ps Another Bourne-like Shell 例ash
BusyBox 原始編譯出來後,將會相依其系統函式庫,也即是/lib和/usr/lib裡的函式庫,如果換掉不同版本的函式庫後,就不能正常執行。 如果有特殊需求,也可編譯成靜態執行檔,不相依共享函式庫。
Build Options 選取此選項即可不相依共享函式庫。
Installation Options 不選取此選項,將會依照程式類型分別置於安裝路徑/lib和安裝路徑/usr/lib二個子目錄
Archival Utilities 依照各自需求,選取需使用的工具。
Coreutils 依照各自需求,選取需使用的工具。
Editors 依照各自喜好,選取所要使用之Editors
Init Utilities 待會會介紹Busybox init用途及用法。在此,我們不使用標準System V init。
Login/Password Management Utilities 在此是使用Tiny-Login,Busybox-1.0.0才合併的成果。
Linux Module Utilities 選取insmod,以利於未來要載入模組。
Networking Utitlities 包括基本網路工具,例telnet、ping等。
Process Utilities 有關於Process的工具,例kill,可移除程序
Another Bourne-like Shell
Busybox 和之前相同,離開時,務必記得儲存組態。
系統初始化 標準初始化工具為System V init 在此直接使用busybox提供的init 提供run-level 可在下列網址取得ftp://ftp.cistron.nl/pub/people/miquels/sysvinit/ 在此直接使用busybox提供的init 精簡微小 方便使用 不需額外安裝套件
BusyBox init /bin/init 是系統程序初始化,並讀取/etc/inittab此支設定檔。 runlevels 此欄位可忽略 設定檔內容格式如下 : <id>:<runlevels>:<action>:<process> runlevels 此欄位可忽略 action Process所要執行的動作 process 所要執行的Process
<action> sysinit, respawn, askfirst, 系統第一執行的Process
<action> once, restart, ctrlaltdel, shutdown. Process只會執行一次 按下ctrl + alt + del 所執行的Process shutdown. 當Poweroff時,所執行的Process
BusyBox 如/etc/inittab不存在則預設內容為下 ::sysinit:/etc/init.d/rcS ::askfirst:/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/sbin/swapoff -a ::shutdown:/bin/umount -a -r ::restart:/sbin/init tty2::askfirst:/bin/sh tty3::askfirst:/bin/sh tty4::askfirst:/bin/sh
Filesystem 當資料存在儲存裝置時,都必須要有一種檔案系統,請注意,並不是根檔案系統。此種檔案系統就像是檔案系統格式。 常見的有 : Jffs2 Jffs Ext3 RAM disk yaffs
CRAMFS 唯讀的格式 壓縮比約為50% GID只有8位元的寛度, 群組數不可超過255 至#kernel_source/scripts/cramfs/ # make (產生mkcramfs) # cp mkcramfs /bin # mkcrafs rootfs /目標位置/自定檔名
TMPFS 以虛擬記憶為基礎的檔案系統 大小可根據實際內容縮放 儲存暫時性檔案 掛載時不必指定所要掛載的裝置 # mount –t tmpfs /tmp
前言及介紹 Bootloader Kernel Root Filesystem 燒寫資料至flash
Writing data to flash memory 當root filesystem也開發完成後,只剩下最後步驟,就是把bootloader、Linux kernel和root filesystem燒寫至flash。 燒寫軟體可至samsung網站下載。 http://www.samsung.com/Products/Semiconductor/SystemLSI/MobileSolutions/MobileASSP/MobileComputing/S3C2410X/S3C2410X.htm
燒寫資料至 NAND FLASH 可以使用SJF (SEC JTAG FLASH ) 將vivi 透過JTAG 寫入 FLASH. # Jflash-s3c2410 vivi /t=5 vivi => 寫入之映像檔 /t=5 => /t 選擇寫入FLASH的型號, 5 : SMDK2410:K9S1208 64MB
Writing data to flash memory JFlash vivi to the flash memory # JFlash-s3c2410 vivi /t=5
SEC JTAG FLASH 燒寫畫面
Writing data to flash memory VIVI Bootloader燒寫完畢 當Bootloader已經燒寫至Flash後,即可使用VIVI將資料傳送至Flash。 VIVI 開機時 : 在Booting時,可隨意按任何鍵進入VIVI Command Mode,就可以選擇傳送資料至flash。
Writing data to flash memory Load kernel to the flash memory # load flash kernel x
Writing data to flash memory Load rootfs to the flash memory # load flash rootfs x
開機畫面
Graphical User Interface GUI(Graphical User Interface) 上述的根檔案系統(root filesystem),是不包括GUI(使用者繪圖介面),所以並不能在LCD上顯示畫面。 Embedded GUI System 成為嵌入式GUI系統,不外乎就是需要體積小,耗系統資源少 。
Graphical User Interface Embedded Linux有幾種較為廣泛使用的GUI系統: QT/Embedded Nano-X Mini-GUI Tiny-X
Nano-X Nano-X是Open Source的專案: 專門為小型裝置和平台製作而成。 原名為Microwindows ,和Microsoft 的windows商標相衝突,故在2005年1月30日重新命名為Nano-X Window System。 在此系統中有實作二種APIs,一種是Win32 API,另一種是Xlib-like API。 出處:http://www.microwindows.org/
Mini-GUI Mini-GUI 由飛漫軟體 維護,V1.3.0開始採用GPL授權方式,只要遵循GPL條款,就不需付任何授權費用。 可在 ARM、StrongARM、MIPS 等各種嵌入式硬體平台上運行。 出處:http://www.minigui.com/
QT/Embedded QT/Embedded Trolltech公司所開發,是一種跨平台的C++應用程式。 可在Windows, Linux, Unix, Mac OS X和 Embedded Linux上執行。 QT有許多版本,其中Embedded版是適合於嵌入式系統。
編譯QT/Embedded 組態 編譯 安裝 放置於root filesystem # ./configure -embedded arm -shared -debug -no-cups --prefix=安裝目錄夾 編譯 # make 安裝 # make install 放置於root filesystem 把編譯好的library,放置於root filesystem裡的LD_LIBRARY_PATH裡,通常指/lib
QT/Embedded 當設置於目標板的目錄後,即可開發QT/E的應用程式。 在QT/E Source code中,有範例可使用,目錄位於source code/example/。 位於http://doc.trolltech.com有教學文件及更詳細介紹