在寫一個嵌入式Linux構建的初級教程,先放上兩篇,請大家拍拍轉。

構建嵌入式Linux系統初級實踐教程(一) 

通過動手實踐來學習嵌入式Linux系統,是一個行之有效的方法。本文以O'REILLY出版的經典書籍Building embedded linux systems(第二版)爲藍本,從動手實踐的角度,循序漸漸地介紹了嵌入式Linux系統的構建方法,可以作爲初學者的入門指導。
本文爲初級教程,後續還會有中級和高級教程。初級教程的目標是“學會”,中級教程瞄準於能實際應用的系統,而高級教程則希望能討論一些有創新性的高級專題。本文采用我喜歡的step by step的敘述方式,便於讀者理解和掌握,對概念性的內容則不做過多說明,讀者可參考Building embedded linux systems(第二版)的相關內容。

1、準備目標單板
學習嵌入式Linux系統的前提是有一塊目標單板。對於初學者而言,使用軟件模擬器做目標單板是不錯的選擇,既不花費額外的金錢,又不用擔心損壞硬件。
本文的目標單板選擇QEMU軟件模擬器的ARM VersatilePB單板,它的硬件構成是:
- ARM926E, ARM1136 or Cortex-A8 CPU 
- PL190 Vectored Interrupt Controller 
- Four PL011 UARTs 
- SMC 91c111 Ethernet adapter 
- PL110 LCD controller 
- PL050 KMI with PS/2 keyboard and mouse. 
- PCI host bridge. Note the emulated PCI bridge only provides access to PCI memory space. It does not provide access to PCI IO space. This means some devices 

(eg. ne2k_pci NIC) are not usable, and others (eg. rtl8139 NIC) are only usable when the guest drivers use the memory mapped control registers. 
- PCI OHCI USB controller. 
- LSI53C895A PCI SCSI Host Bus Adapter with hard disk and CD-ROM devices. 
- PL181 MultiMedia Card Interface with SD card. 


一般的Linux發行版都有QEMU軟件,可直接安裝使用。如果要使用最新版本,可以到QEMU的主頁下載源碼自行編譯。

2、準備交叉編譯工具鏈
我們選用CodeSourcery出品的ARM 交叉編譯工具鏈,可從http://www.codesourcery.com/sgpp/lite/arm 下載。我使用的是2009q1版本,現在已有更新的版本。下載軟件壓縮包後,在主目錄解壓:
tar xf arm-2009q1-203-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2
然後修改 ~/.bash_profile 文件,把工具鏈的bin目錄加到PATH中
export PATH=${PATH}:~/arm-2009q1/bin

3、讓目標板跑起來!
有了交叉編譯工具鏈,我們就可以編譯一個最簡單的內核,讓目標板跑起來了。從http://www.kernel.org下載Linux內核源碼,我用的是2.6.29.4版本。解壓後,進入Linux內核源
碼目錄,執行
make ARCH=arm allnoconfig
然後再執行
make ARCH=arm menuconfig
增加下面的內核配置項:
System Type --> Versatile platform type --> Support Versatle/PB platform
Device Drivers --> Character devices --> Serial drivers --> ARM AMBA PL011 serial port support --> support for console on AMBA serial port

保存配置,退出後,執行下面的命令編譯內核:
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
內核編譯成功後,用下面的命令啓動QEMU模擬器
qemu-system-arm -M versatilepb -kernel ~/linux-2.6.29.4/arch/arm/boot/zImage -nographic -append "console=ttyAMA0"
目標板開始啓動內核運行起來了,但最後卻掛死,打出 kernel panic 信息。這並不奇怪,因爲我們還沒有構建根文件系統呢。不過,目標板運行到 kernel panic,說明了兩件事
情:
(1)交叉編譯工具鏈能正常工作
(2)模擬器的目標板能正常工作
因爲我們把目標板的串口輸出定向到當前的命令命令行終端,所以在目標板掛死後,可直接關閉此命令行終端退出目標板的運行;也可以另開一個命令行終端,執行
killall qemu-system-arm
命令來退出目標板的運行。

(原文在: http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-5168172.html


構建嵌入式Linux系統初級實踐教程(二) 

4、構建根文件系統 
準備一個rootfs的作爲根文件系統的構建目錄: 
mkdir ~/rootfs 
現在我們可以開始構建根文件系統了。 

我們先把交叉編輯工具鏈裏爲target準備的庫文件拷到構建目錄中。 
mkdir ~/rootfs/lib 
cd ~/arm-2009q1/arm-none-linux-gnueabi/libc/lib 
cp -a * ~/rootfs/lib 
cd ~/rootfs/lib 
arm-none-linux-gnueabi-strip *.so
 

有了庫文件,我們再來構建命令程序。我們選用busybox,並使用它的缺省配置。進入busybox源碼目錄,執行 
make ARCH=arm defconfig 
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 
在我環境下,有兩個命令編譯失敗,爲了簡單,我們直接禁用它們。執行 
make ARCH=arm menuconfig 
然後禁選下面兩項: 
Miscellaneous Utilities --> inotifyd 
Networking Utilities --> ip tunnel
 
保存配置後,再重新編譯: 
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 
編譯完成後,安裝到rootfs目錄中: 
make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- CONFIG_PREFIX=~/rootfs install 
(關於busybox更詳細的說明,請參考:精通initramfs構建step by step (三):busyboxhttp://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-630156.html) 

現在rootfs已經有了一些目錄和文件,我們再補充一些關鍵的目錄和文件。 
cd ~/rootfs 
mkdir dev sys proc etc mnt 
mknod dev/console c 5 1
 (這條命令需要以root權限執行) 

至此,一個基本的根文件系統已經構建好了。爲了儘快看到效果,我們把根文件系統打包成initramfs。在打包前,我們要在rootfs的根目錄中創建一個名爲init的文件,其內容是: 
#!/bin/sh 
mount -t proc proc /proc 
mount -t sysfs sysfs /sys 
mdev -s 
exec /sbin/init 
好了,開始打包: 
find . | cpio -H newc -o | gzip -9 > ../arm-busybox.cpio.gz 
(關於initramfs更詳細的說明,請參考:精通initramfs構建step by step :總目錄http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-1100709.html) 

前面編譯的內核,還需要增加新的配置項: 
Kernel Features --> Use the ARM EABI to compile the kernel 
Userspace binary formats --> Kernel support for ELF binaries 
General Setup --> initial RAM filesystem and RAM disk (initramfs/initrd) support
 
保存配置後,再重新編譯內核。 

內核和initramfs都有了,我們再次讓目標板跑起來: 
qemu-system-arm -M versatilepb -kernel ~/linux-2.6.29.4/arch/arm/boot/zImage -initrd ~/arm-busybox.cpio.gz -nographic -append "console=ttyAMA0" 
——你看到了什麼? 


(原文在: http://linuxman.blog.ccidnet.com/blog-htm-do-showone-uid-60710-type-blog-itemid-5861227.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章