一、 實驗目的
1.了解嵌入式系統的開發環境、核心的下載下傳和啟動過程;
2.了解Linux核心源代碼的目錄結構及各目錄的相關内容,了解Linux核心各配置選項内容和作用,了解Linux核心各配置選項内容和作用,并掌握Linux核心的編譯過程;
3.了解嵌入式作業系統中檔案系統的類型和作用,了解JFFS2檔案系統的優點及其在嵌入式系統中的作用,掌握利用BusyBox軟體制作嵌入式檔案系統的方法,掌握嵌入式Linux檔案系統的挂載過程。
二、 實驗環境
1. 硬體:EELIOD,基于Intel高性能的PXA270處理器的多功能嵌入式開發平台;一台Linux作業系統的PC。
2. 軟體:
(1) Arm-linux-gcc:交叉編譯工具
(2)Bootloader:嵌入式系統中,通常并沒有像BIOS那樣的固件程式,是以整個系統的加載啟動任務完全由bootloader來完成。用于引導嵌入式作業系統的bootloader有U-Boot、vivi、RedBoot等等。其主要作用初始化硬體裝置,建立記憶體空間的映射圖,并完成核心的加載,為核心設定啟動參數。
(3) Minicom: Linux 系統用minicom 軟體實作序列槽通信,運作minicom,進入minicom的設定界面。
(4)tftp :基于UDP協定的簡單檔案傳輸協定,目标闆作為客戶機,bootloader預設采用tftp協定。
(5)NFS伺服器架設:NFS是一項用于在不同機器、不同作業系統之間通過網絡共享檔案的服務系統。Nfs-server也可以看作是一個檔案伺服器,它可以讓PC通過PC通過網絡将遠端的nfs server共享出來的檔案挂載到自己的系統中。
(6)Linux核心:Linux-2.4.21-51Board EDR
(7)BusyBox: busybox_1.00-pre5和busybox-1.1.2
三、 實驗内容
1. Linux核心的配置和編譯,用make menuconfig 對核心進行逐項配置,并用make zImage 編譯核心。
2. 配置編譯Busybox,進行編譯(make)和安裝(make install);接着,配置檔案系統,并制作ramdisk檔案映像。
3. 将制作好的核心zImage4和檔案系統ramdisk_img4.gz放在tftpboot目錄下;開機後在bootloader下配置主機和宿機的IP位址,然後進行tftp下載下傳,boot開機後并調試。
四、 實驗步驟
1. Linux核心的配置:
利用make menuconfig對Linux核心進行配置,系統将會産生配置檔案“.config”。之前的配置檔案備份到“.config.old”,一邊恢複上一次的配置。配置檔案(.config)中有許多配置變量設定,用來說明配置使用者的結果。例如“CONFIG_MODULES=y”表明使用者選擇了Linux核心的子產品功能。其中每個配置變量具有四種不同的取值:
y——表示本編譯選項對應的核心代碼被靜态編譯進Linux核心;
m——表示本編譯選項對應的核心代碼被編譯成子產品;
n——表示不選擇此編譯選項;
如果根本沒有選擇,那麼就配置變量的值為空。
$ make menuconfig
以下是核心(Linux-2.4.21)配置項的具體配置:
(1)Code maturity level options --->
[*] Promprt for development and/or incomplete Code/drivers
代碼成熟度選擇。可以選擇正在開發的核心代碼。這個選擇表示是否包含beta 版本的程式。
(2) Loadable module support --->
[*] Enable Loadable moduLe Support
使用子產品的形式可以将不經常使用的裝置驅動或功能元件編譯為一個子產品,而不加載到核心中。當需要該功能的時候,可以動态的加載到記憶體中調用。
[ ] Set version information on all Symbols for modules
[*] Kernel module Loader
該功能表示核心可以實作子產品加載的功能。不使用insmod 和rmmod 指令,kerneld 程式可以在需要的時候自動調用子產品,而在不用該功能的時候,自動解除安裝該子產品。可以有效地使用記憶體,同時減小了核心的大小。
(3) System Type ---> 系統選型
(PXA270/250/210-based) ARM system type
Intel PXA270/250/210 Implementations --->
(XSBase270-EDR) XSBase270 Board Type
(4) General setup ---> 通用設定
設定網絡、總線協定、電源管理功能等。
将核心中預設的核心指令行 “ root=1f02 rw console=ttyS0,115200 mem=64M”修改為:
root=/dev/ram0 rw console=ttyS0,115200 mem=64M
(5) Memory Technology Devices (MTD) ---> 存儲器技術裝置
RAM/ROM/Flash chip drivers --->
[*]Support 32-bit buswidth
[*]Support 2-chip flash leave
[*]Support for Intel/Sharp flash chips
Mapping drivers for chip access --->
[*] CFI Flash device rmpped on the XScale XSbase270 board
(6) Block devices ---> 塊儲存設備
<*>RAM disk support
(8192) Default RAM disk size
配置系統支援RAM DISK。預設的RAM DISK 容量為8M(8192),改變該值以改變RAM DISK容量。
(7) Networking options ---> 網絡配置
[*] Network device support
(8) Network device support ---> 網絡裝置驅動
Ethernet (10 or 100Mbit) --->
<*> SMSC LAN91C111 Support for XSBase270 Board
支援SMSC LAN91C111 裝置驅動。
(9) Character devices ---> 字元裝置驅動
[*] VirtuaL terminaL
支援以字元處理的裝置,包括超級終端,滑鼠,列印機等。
[*] Standard/generic (dumb) SeriaLSupport
使能MODEM,串行滑鼠和串行裝置。
[*] Support for console on virtual terminal
系統console接受所有kernel資訊和警告資訊,允許以單獨使用者模式登入。
[*] Support for console on serial Support
該功能使能序列槽為系統控制終端。系統控制終端是可以接收核心發出的資訊的裝置。他使用的單使用者子產品登陸。例如多個消息可以通過一個序列槽列印機列印出來。系統的預設控制終端通常是/dev/tty0.假如需要改變系統控制終端為序列槽2 的話,在核心配置中,使用“ console=ttys1”。使用序列槽當作控制終端的話,可以直接使用序列槽線連接配接到目标機的序列槽上,對系統進行控制。利用此選項可運作沒有VGA卡的Linux系統。
[*]Unix98 PTY Support
PTY 是由軟體驅動的虛拟裝置,有master和slave兩個部分組成,與實體終端的操作完全相同。
(10) File systems ---> 檔案系統
[*] KerneL automounter Support
自動挂載器(automounter) 是一個處理遠端系統挂載的工具。可以支援“NFSfilesystem support”
[*] Kernel automounter version 4 support (also supports v3)
核心版本自動挂載器是沒有必要的,是以在這樣選擇[N]
<*> Journalling Flash File System (JFFS2) support
JFFS 檔案系統是瑞典AXIS 通信公司開發出來提供電源斷電保護的檔案系統。他通用于沒有硬碟的嵌入式系統中。
[*] /proc file system support
/proc 是虛拟的檔案系統,他提供系統各種狀态資訊。說他是虛拟的是指他并不占用系統硬碟空間。當你通路/proc 檔案下檔案的時候,核心将建立該檔案。通常使用more 或者cat 程式來檢視資訊。
[*] /dev/pts file system for Unix98 PTYs
虛拟檔案系統可以使用“mount –t devpts”指令挂載在/dev/pts 上。該功能用來支援僞終端裝置。例如Unix98 标準。
Network File Systems --->
<*> NFS file system support
[*] Provide NFSv3 Client Support
[*] Root file System on NFS
(11) Console drivers ---> 終端裝置驅動
Frame-buffer support --->
[*] Support for frame buffer devices (EXPERIMENTAL)
[*] PXA LCD support
LCD type ―――>
(X)Sharp_8
(12) Sound ---> 聲音支援和聲霸卡驅動
<*>Sound support
<*>Intel PXA27x AC97
2. Linux核心的編譯:
$make clean: 清除以前構核所産生的所有的目标檔案、子產品檔案、核心及一些臨時檔案等,不産生任何新檔案;
$make dep : 建立依賴關系,産生兩個檔案“.depend”和“.hdepend”;
$make : 編譯核心,通過歌目錄的Makefile檔案進行,會在各個目錄下産生一大堆目标檔案,并産生vmlinux;
$make zImage:在make的基礎上産生壓縮的核心映像檔案,在目錄arch/arm/boot中産生zImage檔案。
3. BusyBox的配置編譯:
将下載下傳的BuysBox(busybox_1.00-pre5)軟體包解壓縮。進入解壓目錄,執行“make menuconfig”:
(1) Build Options
[*] Build BusyBox as a static binary (no shared libs)
此選項是一定要選擇的,這樣才能把busybox編譯成靜态連結的可執行檔案,運作時才獨立于其他函數庫.否則必需要其他庫檔案才能運作,在單一個linux核心不能使他正常工作;
(2) Installation Options
[*] Don't use /usr
(./_install) BusyBox installation prefix
這個選項也一定要選,否則make install 後busybox将安裝在原系統的/usr下,這将覆寫掉系統原有的指令.選擇這個選項後,make install後會在busybox目錄下生成一個叫_install的目錄,裡面有busybox和指向他的連結;
(3) Linux Module Utilities
[*] insmod
[*] lsmod
[*] modprobe
[*] rmmod
(4) Linux System Utilities
[*]mount
[*] Support mounting NFS file systems
[*]umount
[*] Support forced filesystem unmounting
(5) Editors
[*]vi
其他配置預設,配置好後退出并儲存。
$make clean
$make
$make install
4. 配置檔案系統:
(1) 建立etc目錄,在etc下建立inittab、rc、motd三個檔案。
/etc/inittab
此檔案由系統啟動程式init讀取并解釋執行,為linux初始化檔案系統時init初始化程式用到的配置檔案。這個檔案負責設定init初始化程式初始化腳本在哪裡;每個運作級初始化時運作的指令; 開機、關機、重新開機對應的指令;各運作級登陸時所運作的指令。
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
#tty4::respwan:/sbin/getty 38400 tty5
#tty5::respwan:/sbin/getty 38400 tty6
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff –a
/etc/rc
此檔案要求可執行屬性,是以執行“chmod 777 rc”指令修改其屬性。rc檔案(.sh)第一行的#不是注釋。
#!/bin/sh
hostname XScale270
mount -t proc proc /proc
/bin/cat /etc/motd
ifconfig eth0 192.168.207.136
mount 192.168.207.36:/exp /mnt -o nolock -o proto=tcp
/etc/motd
此檔案由/etc/rc調用列印在終端上。
/etc/motd
此檔案由/etc/rc調用列印在終端上。
Welcome to
=====================================================
ARM-LINUX WORLD
=====================================================
Bose on:Xsbsae270-EDR
ported by xxx xxx
在etc目錄下在建立init.d目錄,并将/etc/rc向/etc/init.d/rcS做符号連結。
$mkdir init.d
$cd init.d
$ln –s ../rc rcS
(2) 建立dev目錄,并在該目錄下建立必要的裝置:
mknod console c 5 1 mknod mixer c 14 0
mknod dsp c 14 3 mknod audio c 14 4
mknod fb0 c 29 0 ln -s fb0 fb
mknod hda b 3 0 mknod hda1 b 3 1
mkdir input mknod input/misc c 13 63
ln -s input/misc mouse mknod keypad c 151 0
mknod kmem c 1 2 mknod mem c 1 1
mknod mmcda b 241 0 mknod mtd0 c 90 0
mknod mtd1 c 90 2 mknod mtd2 c 90 4
mknod mtd3 c 90 6 mknod mtdblock0 b 31 0
mknod mtdblock1 b 31 1 mknod mtdblock2 b 31 2
mknod mtdblock3 b 31 3 mknod null c 1 3
mknod zero c 1 5 mknod ram0 b 1 0
mknod ram1 b 1 1 ln -s ram0 root
mknod rom0 b 31 0 mknod rom1 b 31 1
mknod rtc c 250 0 mknod sda b 8 0
mknod sda1 b 8 1 mkdir touchscreen
mknod touchscreen/ucb1x00 c 10 24 mknod tty c 5 0
mknod tty0 c 4 0 mknod tty1 c 4 1
mknod tty2 c 4 2
(3) 建立proc空目錄,供proc檔案系統使用。
$mkdir proc
(4) 建立lib目錄,将交叉編譯器連結庫路徑下的下面幾個庫複制到lib目錄:
ld-2.3.2.so
libc-2.3.2.so
libm-2.3.2.so
再做如下軟連結:
ln -s ld-2.3.2.so ld-linux.so.2
ln -s libc-2.3.2.so libc.so.6
ln -s libm-2.3.2.so libm.so.6
ln -s libm-2.3.2.so libm.so
(5) 建立mnt空目錄:
$mkdir mnt
用于挂載/exp
5. 制作ramdisk檔案映像:
在主機上建立一個空檔案并将它格式化成ext2fs檔案系統映像。格式化後的檔案就可以像普通檔案系統一樣在主機上進行挂載和解除安裝。挂載後可以進行正常的檔案和目錄操作,解除安裝後,如果原映像檔案仍然存在,則更新到解除安裝之前的操作内容。最後将修改确定的ramdisk檔案映像用gzip壓縮,留待bootloader下載下傳。
$dd if=/dev/zero of=ramdisk_img bs=1k count=8192
$ /sbin/mke2fs ramdisk_img
$mount ramdisk_img
(複制檔案系統目錄和檔案,及其他一些必要的設定)
$umount /mnt/ramdisk
$gzip ramdisk_img
6. tftp下載下傳:
51Board> tftp ramdisk_img4.gz ramdisk
tftp start...
my ip address : 192.168.207.136
server ip address : 192.168.207.36
filename : ramdisk_img4.gz
store at : 0xA1000000
loading start...
1335204 (0x00145FA4) bytes received. done.
51Board> tftp zImage4 kernel
tftp start...
my ip address : 192.168.207.136
server ip address : 192.168.207.36
filename : zImage4
store at : 0xA0008000
loading start...
772916 (0x000BCB34) bytes received. done.
五、 實驗總結
1. 核心配置的過程中要注意各個選項的選擇,要兼顧後面檔案系統的配置、以及後續核心驅動程式的配置問題,使得在以後的開發中能夠順利的進行;對于開機圖檔的改換,需一張同等像素640*480,并且格式為ppm的圖檔;
2. BusyBox的配置中主要對于一些指令的選擇上,特别注意mount指令中的NFS的支援,否則不能夠進行挂載;對于不需要的指令可以舍棄,不要太貪心,做到精簡最好;如果重新配置後,最好執行make clean 指令,再進行make和make install;
3. 在制作ramdisk檔案系統時,将ramdisk_img挂載後的操作,需要複制檔案系統目錄和檔案,但有些檔案,如dev目錄不能夠直接複制過去,需要在挂載點目錄下重新進行配置,這個有些麻煩;
4. 在tftp下載下傳過程中,先下載下傳zImage或是ramdisk_img.gz沒有特别的要求,但當下載下傳時沒有反應,可以調換次序,重新下載下傳;對于tftp下載下傳,一定要注意檢查主機和目标機的IP位址是否配置準确,在bootloader界面下,用“set myipaddr”和“set destipaddr”設定IP位址,不然無法下載下傳到對應的目标機上;進入目标機系統後,reboot操作後,要進行tftp重新下載下傳;
5. 在Bootloader界面下可以設定default Kernel和default Filsystem,這樣可以使今後的操作簡單,無需用tftp指令進行下載下傳。