Written on 5:37 下午 by Yu Lai
今天在搞net-snmp所提供的mib2c tool,
用起來說實在的實在有點難用。
大概是我對它還不太熟的關係吧。
以下是今天弄的一些心得:
(因為開發需求,所以設定prefix為/opt/net-snmp。)
1.
首先,在安裝net-snmp時,需在configure時加入以下參數
$ ./configure --prefix=/opt/net-snmp/ --enable-embedded-perl --enable-shared --with-perl-modules
$ make
$ make test
# make install (should be root)
2.
在確定PATH設定好後,執行mib2c時,
通常會遇到訊息說沒有安裝Perl SNMP Module,
這是因為我們在configure時有設了prefix的關係,
導致perl找不到share library。
解決的方法是將net-snmp的lib目錄設定給ldconfig知道即可。
# echo /opt/net-snmp/lib > /etc/ld.so.conf.d/net-snmp.conf
# ldconfig -v
3.
最後就是mib2c操作方法,
據mib2c的manpage裡說明,
mib2c的功用是產生template code給agent來擴充功能使用。
Usage為
mib2c [-h] -c CONFIGFILE [-I PATH] [-f OUTNAME] [-i][q][-S VAR=VAL] MIBNODE
而mib2c的使用方法是以mib node為parameter來開始生成template code。
所以必須先將mib file放置在$HOME/.mibs/或/opt/net-snmp/share/snmp/mibs,
然後在環境變數中設定MIBS,
export MIBS=+NET-SNMP-TUTORIAL-MIB
接著麻煩的在這裡,
你必須依著你的的mib node來選定所產生的template code的CONFIGFILE。
下面是CONFIGFILE所支援的類型:
如果你要寫些scalars所需的code,請用:
mib2c -c mib2c.scalar.conf MIBNODE
如果你要用int scalars,請用:
mib2c -c mib2c.int_watch.conf MIBNODE
一般來講Table是建議採用MDF:
mib2c -c mib2c.mfd.conf MIBNODE
如果Table Data是在外部時:
mib2c -c mib2c.iterate.conf MIBNODE
如果Table Data是在agent裡:
mib2c -c mib2c.create-dataset.conf MIBNODE
承上,如果還需排序時:
mib2c -c mib2c.array-user.conf MIBNODE
如果是要產生Table上任一Column的header時:
mib2c -c mib2c.column_defines.conf MIBNODE
如果是要產生Column上任一Enum的header時:
mib2c -c mib2c.column_enums.conf MIBNODE
4.
結論,大概就是麻煩吧。
Net-SNMP不像其他商用的SNMP套件一樣提供簡易的開發擴充功能的環境,
像在EMANATE中打一個make就ok了,連型態都自動判斷。
不過也許是我對mib2c還不太熟的關係吧,Orz。
Posted in
技術,
Network
|
Written on 9:08 上午 by Yu Lai
[轉自Experiences of Code (http://blog.csdn.net/zblue78)]
學習使用SkyEye仿真
--------------------------------------------------------------------------------
SkyEye是一個可以運行嵌入式操作系統的硬件仿真工具,這樣就可以在沒有硬件條件下來進行嵌入式系統的開發。
以下操作均在Fedora Core 1.0里通過。
Skyeye項目資源列表
http://gro.clinux.org/projects/skyeye/
文檔摘要:
1、什麼是SkyEye?
2、SkyEye可以做什麼事情?
3、安裝SkyEye
4、安裝arm-elf交叉編譯器
5、測試你的arm-elf-gcc編譯器
6、執行你的hello程序
7、編譯並運行uClinux-dist-20030909.tar.gz
8、加入網絡功能
9、安裝完成SkyEye後,下一步將做什麼?
1、什麼是SkyEye?
SkyEye是開源軟件的一個項目,SkyEye的目標是在Linux和Windows操作系統裡提供一個完全的仿真環境。SkyEye仿真環境相當於一個嵌入式計算機系統,你可以在SkyEye裡運行一些嵌入式Linux操作系統,如ARMLinux,uClinux,uc/OS-II(ucos-ii)等,並能分析和調試它們的源代碼。
如果你想知道關於SkyEye和嵌入式系統更詳細的信息,請訪問下面的站點:
www.SkyEye.org
http://www.skyeye.org/index_cn.html
通過SkyEye能仿真下面的硬件:
CPU核心:ARM7TDMI, ARM720T, ARM9, StrongARM, XScale
CPU: Atmel AT91/X40, Cirrus CIRRUS LOGIC EP7312, Intel SA1100/SA1110, Intel XScale PXA 250/255, CS89712, samsung 4510B, samsung 44B0(還不全)
內存: RAM, ROM, Flash
周邊設備: Timer, UART, ne2k網絡芯片, LCD, 觸摸屏等
目前能在SkyEye上運行下面的操作系統和系統軟件:
uC/OSII-2.5.x(支持網絡)
uClinux(基於Linux2.4.x內核, 支持網絡)
ARM Linux 2.4.x/2.6.x
lwIP on uC/OSII
基於uC/OSII, uClinux, ARM Linux的應用程序
2.SkyEye可以做什麼事情?
1. 通過SkyEye可以幫助促進嵌入式系統的學習,在不需要額外硬件的情況下學習和分析uclinux操作系統和其它嵌入式操作系統,如ucosII等。
2. SkyEye可用於嵌入式系統的教學。
3. 希望通過skyeye促進操作系統的研究,如ucosII,uclinux+RTAI,uclinux2.5.x等。
4. 可以基於SkyEye進行仿真特定硬件模塊的研究。
5. SkyEye可以作為嵌入式集成開發環境開發嵌入式系統(當然需要對SkyEye做大量的工作)。
註:引自陳渝《SkyEye Project FAQ》
3、安裝SkyEye
到http://gro.clinux.org/projects/skyeye/下載skyeye-0.7.0.tar.bz2包:
tar jxvf skyeye-v0.7.0.tar.bz2
進入解壓後的skyeye目錄,如果SkyEye的版本低於0.6.0,則運行下面的命令:
./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest
如果SkyEye的版本高於0.6.0,則運行下面的命令:
./configure --target=arm-elf --prefix=/usr/local
接下來執行:
make
make install
安裝完成後執行skyeye
注意:
a.如果你使用的是Mandrake Linux發行版,那麼你在編譯SkyEye時遇到錯誤,並且錯誤與readline, ncurse, termcap等有關,你可以試試下面的方法:
ln -s /usr/include/ncurses/termcap.h /usr/local/include/termcap.h
接著再make和make install看能否成功!
b.如果你的Linux發行版是Debian Linux,那麼不要使用gcc 2.95或是gcc 3.0,請使用gcc 3.2+
c.gcc的版本要在2.96或以上
d.如果SkyEye的版本大於0.6.0,那麼使用LCD仿真需要在Linux系統裡安裝GTK軟件。
4、安裝arm-elf交叉編譯器
下載arm-elf-tools-20030314.sh
ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm
或到
ftp://166.111.8.229/OS/Embeded
執行:
chmod a+x arm-elf-tools-20030314.sh
然後:
./arm-elf-tools-20030314.sh
ls /usr/local/bin/
你應能看到以arm-elf開頭的可執行文件,其中arm-elf-gcc就是用來編譯你目標平台的編譯器的,當然還有一些小工具,後面將一一講來。
5、測試你的arm-elf-gcc編譯器
先寫一個小程序hello.c
#include
int main(void)
{
int i;
for(i = 0; i < 6; i++){
printf("i = %d ",i);
printf("Hello, embedded linux!\n");
}
return 0;
}
然後執行:
arm-elf-gcc -Wl,-elf2flt -o hello hello.c
-elf2flt參數是將elf文件格式轉為flat文件格式,這個工具是在你安裝交叉編譯器產生的。
或者你可以寫個Makefile文件,執行:
make
這裡是我的Makefile文件,僅供參考:
# begin
CC = arm-elf-gcc
CFLAGS = -D__PIC__ -fpic -msingle-pic-base -O2 -pipe -Wall -g
LDFLAGS = -Wl,-elf2flt
LIBS =
OBJS = hello.o
all: hello
hello: $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o hello $(OBJS) $(LIBS)
clean:
rm -rf *.o *.elf *.gdb hello
# end
如果編譯通過,就會產生hello可執行文件。用下面的命令:
file hello
你會發現,它是BFLT(binary FLAT),你目標平台所支持的文件格式。
6、執行你的hello程序
這裡,我們將借助genromfs這個小工具來完成測試,這個工具就是你在安裝交叉編譯器時產生的,你可以直接使用它。
到http://gro.clinux.org/projects/skye...0.4.tar.bz2包:
tar jxvf skyeye-binary-testutils-1.0.4.tar.bz2
cd testsuits/at91/uclinux2(當然你還可以用別的)
mkdir romfs(建一個目錄,後面用)
mount -o loop boot.rom /mnt/xxx
cp -r /mnt/xxx/* romfs
另外,把你編譯好的可執行程序拷貝到/romfs/bin目錄裡,這裡就是hello了!
genromfs -f boot.rom -d romfs/
註:可以用genromf -h來獲得幫助!
OK!執行下面的命令:
skyeye linux
(skyeye)target sim
(skyeye)load
(skyeye)run
kernel start.....
很熟悉了吧。。。
cd /bin
hello
可以看到結果了嗎?
其實到了這一步,你就可以開發自己的程序了!
7、編譯並運行uClinux-dist-20030909.tar.gz
到ftp://166.111.68.183/pub/embed/uclinux/soft/
或到ftp://166.111.8.229/OS/Embeded/uclinux/pub/uClinux/dist下載
uClinux-dist-20030909.tar.gz
假設把它下載到/usr/src/目錄下,然後依次執行下面的命令:
tar zxvf uClinux-dist-20030909.tar.gz
cd uClinux-dist/
在圖形方式下可用命令make xconfig
或
在命令行方式下用命令make menuconfig
vendor/product中選擇GDB/ARMulator
kernel版本選擇2.4
然後save and exit
運行下面這兩條命:
make dep
make
此時在/usr/src/uClinux-dist/linux-2.4.x目錄下會生成可執行文件linux
在/usr/src/uClinux-dist/images/會生成romfs.img等文件
在uClinux-dist目錄下建立仿真AT91的skyeye配置文件skyeye.conf,內容如下:
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
這個時候就可以用skyeye來調試運行kernel了,在/usr/src/uClinux-dist執行如下命令:
skyeye linux-2.4.x/linux
(skyeye)target sim
(skyeye)load
(skyeye)run
kernel start.....
注意:
要在skyeye.conf所在目錄下執行skyeye linux-2.4.x/linux
8、加入網絡功能
a.用root用戶進行操作。
b.你要看你的/lib/modules/'uname -r'/kernel/drivers/net/目錄裡有沒有tun.o
如果沒有的話你就需要編譯你的linux內核來獲得tun.o了。
c.(1)運行tun設備模塊:
#insmod /lib/modules/'uname -r'/kernel/drivers/net/tun.o
如果你沒有該設備,那你就要用下面的命令來創建它:
#mkdir /dev/net
#mknod /dev/net/tun c 10 200
(2)運行vnet(虛擬集線器)設備模塊(這一步不是必需的):
獲取vnet的源碼,然後創建設備:
#mknod /dev/net/vnet c 10 201
#chmod 666 /dev/net/vnet
創建vnet.o
#make vnet.o
插入模塊vnet.o
#insmod vnet.o
進入test目錄,用test來測度vnet.o
#cd test
#make
#./testvnet1
d.配置skyeye.conf文件
cpu: arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
# format: state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:4:3:2:1:f, ethmod=tun, hostip=10.0.0.1
下面將對上面的一些參數作下說明:
state=on/off意思是仿真的NIC(網絡接口板)是有線的還是無線的;
mac=仿真適配器的MAC地址;
ethmod=tuntap/vnet在主機環境裡使用的虛擬設備;
hostip=意思是主機環境與keyeye交互用的IP
格式: state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
For example:
#set nic info state=on/off mac=xx:xx:xx:xx:xx:xx ethmod=tuntap/vnet hostip=dd.dd.dd.dd
net: state=on, mac=0:4:3:2:1:f, ethmod=tun, hostip=10.0.0.1
或
net: state=on, mac=0:4:3:2:1:f, ethmod=vnet, hostip=10.0.0.1
注意:
如果你想在同一時刻運行兩個或更多的skyeye,那麼請為每一個skyeye使用不同的skyeye.conf
e.運行skyeye linux-2.4.x/linux
9、安裝完成SkyEye後,下一步將做什麼?
1、對於嵌入式操作系統的初學者和入門者和入門的學生而言,他們可以先看一些有關操作系統和嵌入式操作系統方面的教材和書籍,如與uC/OS、Minix、uClinux、Linux相關的書籍等。然後可以在Skyeye上開發一些簡單的應用程序例子(如進程間通信、進程優先級、死鎖情況、網絡應用等),對某些操作系統功能(如進程調度、內存管理、網絡子系統、文件子系統等)進行簡單的修改和擴展,並通過Skyeye進行運行和調試,看看會發生什麼情況。
2、對於有一定經驗的軟件工程師而言,在SkyEye上完成一定的應用系統原型開發是值得一做的事情。比如移植或開發一個文件子系統或網絡子系統到一個特定的操作系統中,相信比在一個真實的開發板上開發要容易一些。在Skyeye上進行一些操作系統的移植和開發(如移植RTLinux、RTAI等其它操作系統到Skyeye上)也是很有挑戰性的工作。
3、對於硬件工程師而言,對Skyeye進行擴充,設計新的硬件仿真(如USB、IDE硬盤等)使得Skyeye的硬件仿真功能更加強大,支持更多功能的軟件,是很有意義的事情。
參考:
SkyEye項目站點裡的一篇中文文檔;
陳渝《SkyEye Project FAQ》;
skyeye-0.7.0中的README文檔。
後記:
為了讓大家能快速上手,進行實際的開發工作,我趕湊了一篇文檔,很粗糙。但我堅信隨著更多的有經驗的人的加入;隨著我們自己水平的提高,一定會出現更多、更好的文章來。就讓我們快點行動起來吧!
最後,我再次建議大家看一下《嵌入式Linux技術與應用》這本書。
可以到http://www.skyeye.org/document.htm或是
ftp://166.111.68.183/pub/embed/skyeye/document/或是
http://www.huihoo.org/mirrors/skyeye/
下載文檔,可以獲得更多有關skyeye和嵌入式Linux開發的知識和經驗。
Posted in
技術,
Embedded,
Linux
|
Written on 9:00 上午 by Yu Lai
[轉自Experiences of Code (http://blog.csdn.net/zblue78)]
一步一步教你在skyeye上運行uboot
by faif
1. 簡介
skyeye是一個很好的,基於各種ARM系列CPU的,SOC和主板級的模擬器。uboot是一個可以在各種cpu(arm,mips,powerpc)的主板上運行的引導程序,相當於PC機的BIOS但是又遠遠的強於普通的BIOS,比如支持網絡引導,引導各種內核,甚至一個簡單的shell,等等。他們兩個都是基於GPL的開源自由軟件。
這篇文章教你怎樣在最少量的修改代碼的情況下,用skyeye模擬EP7312並在上面運行uboot,給接觸嵌入系統的新手一個感性的認識。
2. 建立開發環境
2.1 skyeye模擬器的安裝
開發環境是建立在Linux上的。首先下載安裝skyeyes-0.8.5.1的源代碼包,解壓,按照裡面的readme安裝,注意你的linux要有gtk的支持。安裝的時候要以root的身份。在各種linux發行版下的安裝注意事項參照論壇的相關帖子。安裝成功以後,把skyeye的目標目錄加入你的路徑,這樣你就可以在任何目錄下執行skyeye模擬器了。
2.2 交叉編譯器的安裝
交叉編譯器是運行在主機上編譯另外一種體系結構的編譯器。比如,我的主機是linux在x86上,我現在要編譯基於ARM的代碼,所以我就不能用普通的編譯器而需要交叉編譯器。我曾經試過自己從gcc的源代碼構建交叉編譯器,很麻煩和耗時。uboot的作者同樣也開發了一個很好的交叉編譯器叫ELDK(Embedded linux development kit)。我就使用這個,當然你也可以使用其他嵌入式公司提供的。你可以從以下的網址查看提供ELDK的鏡像:
ELDK Availability: http://www.denx.de/twiki/bin/view/DULG/ELDKAvailability
ELDK有三個版本分別編譯MIPS,PPC和ARM。我從下面的鏡像下載了基於ARM的交叉編譯器:
http://sunsite.utk.edu/ftp/pub/linux/eldk/3.1/arm-linux-x86/iso/
文件為"arm-2004-11-09.iso",它支持ARM7, ARM9, XScale, AT91RM9200 and other ARM based systems。
安裝交叉編譯器,我將交叉編譯器安裝到自己的目錄「/opt/x86-arm/」裡面:
/mnt/cdrom/install -d /opt/x86-arm/
等待安裝結束以後設置好用戶環境:
export PATH="${PATH}:/opt/x86-arm/usr/bin:/opt/x86-arm/bin"
export CROSS_COMPILE=arm-linux-
這樣你在任何目錄也可以訪問交叉編譯器了。
測試:
arm-linux-gcc -o testarm test.c
file testarm
testarm: ELF 32-bit LSB executable, ARM, version 1 (ARM), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), not stripped.
說明你編譯好的文件是ARM上的代碼了。你可以用arm-linux-gcc來編譯你的文件了。
3. 修改Uboot
從uboot的網站上可以下載到最新的uboot源代碼,你可以從以下的網址下載
http://u-boot.sourceforge.net/
ftp://ftp.denx.de/pub/u-boot/
uboot的源碼結構清晰,註釋詳細,是學習嵌入系統的很好的例子。我下載的是最新的U-Boot-1.1.2。因為我們要模擬EP7312的芯片,而uboot已經支持一個基於EP7312的板子了,所以我們只要對uboot裡面有關EP7312的板子的配置略作修改就可以了。uboot裡面有關主板的配置文件都在"include/configs/.h"下,所以我們找到include/configs/ep7312.h,對它進行修改。
找到
#define CONFIG_DRIVER_CS8900 1
改為
#define CONFIG_DRIVER_CS8900 0
找到
#define CONFIG_COMMANDS (CONFIG_CMD_DFL | CFG_CMD_JFFS2)
改為
#define CONFIG_COMMANDS (CONFIG_CMD_DFL) /*Skyeye doesn't have jffs2*/
然後回到uboot的根目錄下,配置,編譯:
make ep7312_config
make all
等待結束以後我們會發現u-boot.bin和u-boot兩個文件,其中u-boot.bin是raw的二進制文件。u-boot是ELF格式的。
4. 配置skyeye,並運行uboot
首先,新建一個目錄代表你的EP7312的主板。這樣也可以保持文件的清潔和有序。
mkdir board01
將你剛才編譯成功的u-boot.bin拷貝到這個目錄下來。skyeye支持raw binary和ELF的格式,這裡我們用raw binary的格式。
編輯skyeye.conf,這個文件是用來配置主板的,詳細說明見skyeye的相關文檔。我的skyeye.conf如下:
#skyeye config file for uboot
cpu: arm720t
mach: ep7312
mem_bank: map=I, type=RW, addr=0x80000000, size=0x00010000
#skyeye for uboot flash 16M bank 1
mem_bank: map=M, type=RW, addr=0x00000000, size=0x01000000, file=./u-boot.bin,boot=yes
#skyeye for uboot sdram 16m bank 1
mem_bank: map=M, type=RW, addr=0xc0000000, size=0x01000000
注意這裡的內存的地址和容量的分配都是根據uboot裡面的ep7312的配置文件調整的。這樣也可以是我們對uboot的代碼修改做到最小。
這時候你的skyeye-ep7312主板就配置好了。你可以試著運行了。在你現在的目錄下打入:
skyeye
然後在skyeye的界面下打入:
target sim
run
這時候你可以看到uboot的啟動界面,和提示符,如果你鍵入「hlep」,可以查看所有uboot支持的命令,鍵入「version」可以查看當前uboot的版本,等等。
5. 進一步的工作
由於本文是最基本的介紹性的一步一步的指導。有很多工作還要去嘗試。比如:
× 由於現在skyeye還不支持flash內存,所以我們是不是可以修改uboot上ep7312相對flash的代碼來臨時滿足我們的需要,不然的話,對於在uboot上面的環境參數的設置,我們只能去修改源碼裡面的缺省參數。
× Uboot支持8019AS的以太網控制器,skyeye也支持了這個硬件的模擬,我們要進一步的使uboot的網絡也在skyeye上用起來?
× 對於模擬flash的開發也可以用uboot來測試。uboot裡面各種板子有大量的flash驅動程序。
還望各位高手指教,我進一步修改和提高。
Posted in
技術,
Embedded
|
Written on 8:53 上午 by Yu Lai
[轉自Experiences of Code (http://blog.csdn.net/zblue78)]
為大家學習的方便,我把這篇文章從基礎版貼過來了。裡面的東西滿有趣的,大家可以試試!
以下是我初次學習嵌入式linux的筆記和體會,製作了軟盤minicom應用,在此基礎上也清楚了軟盤Linux的實現,並利用busybox實際製作了軟盤上的Linux系統。希望能給新手一些幫助和啟發,同時也請高手批評指正。
yihui, eazi@163.com 2004年2月12日
一個典型的桌面Linux系統包括3個主要的軟件層---linux內核、C庫和應用程序代碼。
內核是唯一可以完全控制硬件的層,內核驅動程序代表應用程序與硬件之間進行會話。內核之上是C庫,負責把POSIX API轉換為內核可以識別的形式,然後調用內核,從應用程序向內核傳遞參數。應用程序依靠驅動內核來完成特定的任務。
在設計嵌入式應用的時候,可以不按照這種層次,應用程序越過C庫直接和內核會話,或者把應用和內核捆綁在一起,甚至可以把應用寫為內核的一個線程,在內核中運行,雖然這樣在移植上帶來了困難,但考慮嵌入式系統對尺寸要求小的特點,是完全可行的。不過我們使用三層軟件結構的模式來學習嵌入式linux將會是我們認識更清晰,簡單可行並使應用具有彈性。
快速入門,最簡單的建立嵌入式Linux應用的方法就是從我們使用的桌面Linux入手,安裝一個喜愛的版本,把我們的某個應用作為初始化的一部分,框架就算完成了。當然,嵌入式linux應用遠比我們的桌面版本功能簡單專一,它也許就是一個用於足彩的終端機,或是一個數碼音頻播放器,這些系統除了使用嵌入式CPU外,僅僅再需要一個串口,網口等少量的輸入輸出接口就可以完成它們特定的應用了。在軟件上,它可以按照三層的概念由內核裝載器,定制的內核和較少的為特定任務設計的靜態連接的應用程序組成。之所以使用靜態連接的應用程序,是因為少量的靜態連接程序所要的存儲空間,比同樣數量的動態連接的程序所佔的空間小,這個平衡點需要我們在實際開發中去獲取。也許你正在設計的是個PDA,它的應用程序較多,那麼你很可能就要使用動態連接程序來減少存儲空間。在你的/bin或者/sbin目錄下,用廠列表看看bash,ifconfig,vi...,也許只用幾十K,當你運行 ldd /bin/bash 時,你會看到它們都和好幾個庫文件相連。好了,這樣看來,我們得把PC想像成一個嵌入式硬件平台,再重新製作一個特定功能的嵌入式linux。
再進行實際操作之前,先來搞清楚幾個基礎知識。
內核裝載器Loader,它的作用是把內核從外部存儲器,移動到內存中。它只作這個事情,一旦完成了調入內核的工作,Loader就跳轉到內核位置開始執行。不同架構有不同的Loader,在x86結構的PC上,通常使用的loader有LILO,GRUB,syslinux,syslinux在嵌入式linux中也同樣工作。其他非x86架構的應用中,你必須使用專門的loader,或者自己編寫loader來裝入內核。也有不使用loader的情況,系統加電以後,內核直接從燒錄有映像的Flash上開始執行。
內核,一旦內核開始執行,它將通過驅動程序初始化所有硬件,這可以從我們的pc機監視器的輸出看出來,每個驅動程序都打印一些有關它的信息。初始化完成後,計算機就準備運行嵌入式應用。也許一個,也許是多個應用程序組成了嵌入式應用,但通常首先調用的是init(通過loader 向核心傳入init=/program 可以定制首先運行的程序)。桌面linux中,init會讀取/etc/inittab文件,來決定執行級別和哪些腳本和命令。嵌入式應用中,可以根據實際的情況決定是否使用標準的init執行方式,也許這個init是個靜態程序,它能夠完成我們的嵌入應用的特定任務,那完全不用考慮inittab了。
initrd文件系統,initrd以一種把內核從存儲介質裝入到內存的相同的機制來裝入一個小型文件系統。這個文件系統最好是以壓縮的方式存儲在介質上的,解壓縮到RAM盤上。通過使用initrd,包含有核心驅動和啟動腳本的小文件系統,就可以直接從介質上和內核一起啟動起來,內核屆壓縮這個文件系統,並執行這個文件系統上叫做/linuxrc的腳本文件,這個腳本通常會把啟動過程中所需要的驅動程序裝入。腳本退出以後,initrd文件系統也卸下了,啟動過程進入真正初始化過程。對於嵌入式來講,可以將需要的應用軟件都運行在這個initrd文件系統上,只要/linxrc文件不結束,內核啟動過程的其他部分就不會繼續。
做個試驗:
cp /boot/initrd-2.4.20.img /tmp
cd /tmp
mv initrd-2.4.2-.img initrd.img.gz
gunzip initrd.img.gz
mount -o loop initrd.img /mnt
cd /mnt
ls
cat linuxrc
可以看到裡面執行了加載了兩個模塊的操作,你在啟動linxu的時候會看見屏幕打印信息。
入門試驗,製作一個簡單的應用:我們使用一張軟盤啟動一台假象的只有一個串口,鍵盤輸入,顯示輸出的x86架構的linux系統,執行的特定應用就是運行minicom,通過串口撥號。需要軟件: minicom-xx.src.tar.gz 和 syslinux-xx.tar.gz,xx代表版本號 ,開始之前,在主目錄建立一個目錄,來釋放這兩個軟件包:
cd
mkdir -p project/minilinux
cd project/minilinux
tar zxvf minicom-xx.src.tar.gz
tar zxvf syslinux-xx.tar.gz
1、裁減linux內核(需要系統安裝內核文件包)
配置內核的時候,我們需要選擇這些:摸塊編入內核,386處理器、物理內存off、支持ELF、標準PC軟盤、支持RAM盤(4096)、支持initial RAM disk (initrd)、虛你終端、虛擬終端控制台、標準串口、ext2文件系統、控制台驅動,VGA text console、DOS FAT、MSDOS文件系統,其他的都可以不要,這樣內核編出來較小。
步驟:
cd /usr/src/linux
make mrproper
make xconfig
make dep && make bzImage
得到 /usr/src/linux/arch/i386/boot/目錄的內核文件bzIamge。
2、編譯一個靜態的minicom ,把它作為將來的linuxrc
cd minicom-xx/src
vi Makefile
修改下面這行
minicom: $(minicom_OBJECTS) $(minicom_DEPENDENCIES)
rm -f minicom 下面的行加上 -static,連接為靜態程序
(LINK) -static $(minicom_LDFLAGS) $(minicom_OBJECTS) $(minicom_LDADD) $(LIBS)
vi minicom.c
找到 if (real_uid==0 && dosetup==0 ) 刪除這個判斷條件語句,主要是用於權限判斷的,因為這個嵌入應用不關注權限問題,否則會出錯。
make
得到可執行程序,用ldd 檢查一下是不是靜態程序。
3、準備initrd壓縮文件image.gz
dd if=/dev/zero of=image bs=1k count=4096
losetup /dev/loop0 image
mke2fs -m 0 /dev/loop0
mounmt -t ext2 /dev/loop0 /mnt/
mkdir -p /mnt/dev
mkdir -p /mnt/usr/share/terminfo/l/
cd /dev
cp -a consle null tty tty0 zero mem /mnt/dev
cp -P /usr/share/terminfo/l/linux /mnt/usr/share/terminfo/l/linux
cp ~/project/minilinux/mincom/src/minicom /mnt/linuxrc
umount /mnt
losetup -d /dev/loop0
sync
gzip -9 image
4、製作軟盤引導,並拷貝文件 bzimage image.gz 到軟盤
A.使用grub
fdformat /dev/fd0
mke2fs /dev/fd0
mount /mnt/fd0 /mnt/floppy
mkdir -p /mnt/floppy/boot/grub
cp /boot/grub/stage1 /boot/grub/stage2 /mnt/floppy/boot/grub
執行 grub,在軟盤上創建引導
grub > root (fd0)
grub > setup (fd0)
grub > quit
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
編輯 /mnt/floppy/boot/grub/grub.conf
default =0
timeout-=10
title minilinux
root (fd0)
kernel /bzImage
initrd /image.gz
卸下軟盤
umount /mnt/floppy
B. 使用syslinux
fdformat /dev/fd0
mkfs.msdos /dev/fd0
mount -t msdos /dev/fd0 /mnt/floppy
cp /usr/src/linux/arch/i386/boot/bzImge /mnt/floppy
cp ~/porject/minilinux/image.gz /mnt/floppy
cp syslinux-xx/ldlinxu.sys /mnt/floppy
cat > /mnt/floppy/syslinux.cfg
LABEL linux
KERNEL bzimage
APPEND initrd=image.gz
umont /mnt/floppy
syslinux-xx/syslinux /dev/fd0
sync
5、用軟盤啟動計算機,如果幸運,minicom的運行畫面出現在屏幕上。
到此,我們的單應用嵌入式linux做好了,但它還很簡陋,沒有什麼實際用途,但通過這個實驗,可以瞭解嵌入式系統的大致結構和開發過程。在進行實際的嵌入式開發時,通常要在PC機上借助嵌入式linux開發工具包,如:uclinux,bluecat等,對相應的硬件平台(目標機)進行軟件編寫編譯,調試成功後,將內核及應用程序寫入到目標機的存儲器中,從而完成整個應用。
Posted in
技術,
Embedded,
Linux
|