转载自Ubuntu中文论坛(原文地址:http://forum.ubuntu.org.cn/viewtopic.php?t=88369)
原文作者: wenwu
首先感谢http://hi.baidu.com/zkheartboy/blog/item/a73927ad3629c9094a36d6f1.html上提供的方法,我在写这篇文章的时候参考了作者的一些方法。
下面的所有操作,在 ubuntu7.10下全部调试通过。
但仅供参考!
我在写的时候,将shell命令完整部分都粘贴了下来,希望你能看清我在操作时的一些路径,这个很重要。
另外,我也是新手~
我写出来,一是希望能帮助其他像我一样的新手,二是希望自己能够从中学到更多的东西。也希望有更多的人能将自己的经历写下来,共同交流!
一、搭建开发环境
在www.uclinux.org上下载以下两个包:
交叉开发工具:arm-elf-tools-20040427.sh
uClinux的源码包:uClinux-dist-20040408.tar.gz
好像现在arm-elf-tools-20040427.sh不太好下,你也可以下载arm-elf-tools-20030314.sh
安装交叉开发工具:进入arm-elf-tools-20040427.sh所在的目录,执行以下命令进行安装:
代码: |
$sudo chmod +x arm-elf-tools-20040427.sh $sudo ./arm-elf-tools-20040427.sh |
代码: |
$tar zxvf uClinux-dist-20040408.tar.gz |
代码: |
wenwu@wenwu-desktop:~$ sudo apt-get install skyeye |
代码: |
**************************** WARNING ********************************** If you want to run ELF image, you should use -e option to indicate your elf-format image filename. Or you only want to run binary image, you need to set the filename of the image and its entry in skyeye.conf. *********************************************************************** big_endian is false. Failed to open skyeye config file skyeye.conf in the same directory error: No such file or directory ------------------------- SkyEye -V1.2 --------------------------- Usage: SkyEye [options] -e program [program args] Default mode is STANDALONE mode ------------------------------------------------------------------ Options: -e exec-file the (ELF executable format)kernel file name. -l load_address,load_address_mask Load ELF file to another address, not its entry. -b specify the data type is big endian when non "-e" option. -d in GDB Server mode (can be connected by GDB). -c config-file the skyeye configure file name. -h The SkyEye command options, and ARCHs and CPUs simulated. ------------------------------------------------------------------ ----------- Architectures and CPUs simulated by SkyEye------------- -------- ARM architectures --------- at91 lpc s3c4510b s3c44b0x s3c44b0 s3c3410x ep7312 lh79520 ep9312 cs89712 sa1100 pxa_lubbock pxa_mainstone at91rm92 s3c2410x s3c2440 sharp_lh7a400 ns9750 lpc2210 ps7500 integrator -------- BlackFin architectures ---- bf533 |
代码: |
$gedit /etc/environment |
代码: |
/*test.c*/ #include <stdio.h> int main() { int i; for(i=0;i<6;i++) { printf("i=%d\n",i); printf("Hello,embedded linux!\n"); } return 0; } |
代码: |
wenwu@wenwu-desktop:/source/work/test$ arm-elf-gcc -Wl,-elf2flt -o test test.c wenwu@wenwu-desktop:/source/work/test$ ls test test.c test.gdb |
代码: |
#begin CC=arm-elf-gcc LDFLAGS=-Wl,-elf2flt LIBS= OBJS=test.o all:test hello:$(OBJS) $(CC) $(CFLAGS) $(LDFLAGS) -o hello $(OBJS) clean: rm -rf *.o *.elf *.gdb test #end |
代码: |
wenwu@wenwu-desktop:/source/work/test$ file test test: BFLT executable - version 4 ram |
代码: |
wenwu@wenwu-desktop:/source/work/test$ ./test bash: ./test:无法执行二进制文件 |
代码: |
wenwu@wenwu-desktop:/source/work/test$ arm-elf-gcc -S -o test.S test.c wenwu@wenwu-desktop:/source/work/test$ file test.S test.S: ASCII assembler program text |
代码: |
wenwu@wenwu-desktop:/source$ tar jxvf skyeye-binary-testutils-1.2.0.tar.bz2 |
代码: |
wenwu@wenwu-desktop:/source$ ls skyeye-binary-testutils-1.2.0/at91x40/uclinux2 boot.rom linux readme skyeye.conf |
代码: |
skyeye -e linux |
代码: |
____ _ _ / __| ||_| _ _| | | | _ ____ _ _ _ _ | | | | | | || | _ \| | | |\ \/ / | |_| | |__| || | | | | |_| |/ \ | ___\____|_||_|_| |_|\____|\_/\_/ | | |_| |
代码: |
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ mkdir romfs wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls boot.rom linux readme romfs skyeye.conf |
代码: |
wenwu@wenwu-desktop:/mnt$ ls wenwu@wenwu-desktop:/mnt$ sudo mkdir tmp wenwu@wenwu-desktop:/mnt$ ls tmp |
代码: |
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ sudo mount -o loop boot.rom /mnt/tmp/ wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls /mnt/tmp/ bin dev etc home lib mnt proc sbin tmp usr var |
代码: |
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ sudo cp -r /mnt/tmp/* ./romfs/ |
代码: |
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls romfs/ bin dev etc home lib mnt proc sbin tmp usr var |
代码: |
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ sudo cp /source/work/test/test romfs/bin/ wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls romfs/bin/ boa dhcpcd ftp gdbserver inetd login ping route telnet test busybox expand ftpd ifconfig init mount reboot sh telnetd umount |
代码: |
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ sudo genromfs -f boot.rom -d ./romfs/ wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ ls -l boot.rom -rw-r--r-- 1 wenwu wenwu 1561600 2007-11-11 14:03 boot.rom |
代码: |
wenwu@wenwu-desktop:/source/skyeye-binary-testutils-1.2.0/at91x40/uclinux2$ skyeye -e linux big_endian is false. arch: arm cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0 mach info: name at91, mach_init addr 0x8057550 ethmod num="1", mac addr="0:4:3:2:1:f", hostip="10".0.0.1 can't find device module: (name:net, type ![]() log_info: log is off. log_info:log file is /tmp/test.log, fd is 0x80f9318 log_info: log start clock 3200000 log_info: log end clock 3330000 uart_mod:0, desc_in:, desc_out:, converter: SKYEYE: use arm7100 mmu ops Loaded ROM ./boot.rom start addr is set to 0x01000000 by exec file. Linux version 2.4.20-uc0 (chy@localhost.localdomain) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) #7 ?? 8?? 1 19:43:07 CST 2003 Processor: Atmel AT91M40xxx revision 0 Architecture: EB01 On node 0 totalpages: 1024 zone(0): 0 pages. zone(1): 1024 pages. zone(2): 0 pages. Kernel command line: root="/dev/rom0" Calibrating delay loop... 12.97 BogoMIPS Memory: 4MB = 4MB total Memory: 2984KB available (833K code, 181K data, 40K init) Dentry cache hash table entries: 512 (order: 0, 4096 bytes) Inode cache hash table entries: 512 (order: 0, 4096 bytes) Mount-cache hash table entries: 512 (order: 0, 4096 bytes) Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes) Page-cache hash table entries: 1024 (order: 0, 4096 bytes) POSIX conformance testing by UNIFIX Linux NET4.0 for Linux 2.4 Based upon Swansea University Computer Society NET3.039 Initializing RT netlink socket Starting kswapd Atmel USART driver version 0.99 ttyS0 at 0xfffd0000 (irq = 2) is a builtin Atmel APB USART ttyS1 at 0xfffcc000 (irq = 3) is a builtin Atmel APB USART Blkmem copyright 1998,1999 D. Jeff Dionne Blkmem copyright 1998 Kenneth Albanowski Blkmem 1 disk images: 0: 1400000-157D3FF [VIRTUAL 1400000-157D3FF] (RO) RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize SkyEye NE2k Ethernet driver version 0.2 (2003-04-27) sene2k dev name: eth0: <6>NET4: Linux TCP/IP 1.0 for NET4.0 IP Protocols: ICMP, UDP, TCP IP: routing cache hash table of 512 buckets, 4Kbytes TCP: Hash tables configured (established 512 bind 512) NET4: Unix domain sockets 1.0/SMP for Linux NET4.0. sys_mount:dev_name /dev/root,dir_name /root, type ext2, flag 0x8001, data 0 sys_mount:1 data_page 1122000, type_page 113bf74, dev_page 0, dir_page 8001 sys_mount:2 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000 sys_mount:3 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000 sys_mount:4 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000 sys_mount:dev_name /dev/root,dir_name /root, type romfs, flag 0x8001, data 0 sys_mount:1 data_page 0, type_page 117f000, dev_page 117d000, dir_page 8001 sys_mount:2 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000 sys_mount:3 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000 sys_mount:4 data_page 0, type_page 117f000, dev_page 117d000, dir_page 117e000 VFS: Mounted root (romfs filesystem) readonly. sys_mount:dev_name .,dir_name /, type <NULL>, flag 0x2000, data 0 sys_mount:1 data_page 111c120, type_page 0, dev_page 10e5d00, dir_page 10e5174 sys_mount:2 data_page 0, type_page 0, dev_page 117f000, dir_page 1122000 sys_mount:3 data_page 0, type_page 0, dev_page 117f000, dir_page 1122000 sys_mount:4 data_page 0, type_page 0, dev_page 117f000, dir_page 1122000 Shell invoked to run file: /etc/rc Command: hostname GDB-ARMulator Command: /bin/expand /etc/ramfs.img /dev/ram0 Command: mount -t proc proc /proc sys_mount:dev_name /proc,dir_name /proc, type proc, flag 0xc0ed0000, data 11d0008 sys_mount:1 data_page 1000, type_page 1002, dev_page 118a008, dir_page c0ed0000 sys_mount:2 data_page 1188000, type_page 11a0000, dev_page 1189000, dir_page 1122000 sys_mount:3 data_page 1188000, type_page 11a0000, dev_page 1189000, dir_page 1122000 sys_mount:4 data_page 1188000, type_page 11a0000, dev_page 1189000, dir_page 1122000 mount: /etc/mtab: Read-only file system Command: mount -t ext2 /dev/ram0 /var sys_mount:dev_name /dev/ram0,dir_name /var, type ext2, flag 0xc0ed0000, data 11d0008 sys_mount:1 data_page 111c260, type_page 119fe40, dev_page 0, dir_page c0ed0000 sys_mount:2 data_page 1186000, type_page 1188000, dev_page 1187000, dir_page 1122000 sys_mount:3 data_page 1186000, type_page 1188000, dev_page 1187000, dir_page 1122000 sys_mount:4 data_page 1186000, type_page 1188000, dev_page 1187000, dir_page 1122000 mount: /etc/mtab: Read-only file system Command: mkdir /var/tmp Command: mkdir /var/log Command: mkdir /var/run Command: mkdir /var/lock Command: cat /etc/motd Welcome to ____ _ _ / __| ||_| _ _| | | | _ ____ _ _ _ _ | | | | | | || | _ \| | | |\ \/ / | |_| | |__| || | | | | |_| |/ \ | ___\____|_||_|_| |_|\____|\_/\_/ | | |_| GDB/ARMulator support by <davidm@snapgear.com> For further information check: http://www.uclinux.org/ Command: /bin/ifconfig eth0 up 10.0.0.2 Execution Finished, Exiting Sash command shell (version 1.1.1) /> |
代码: |
/> cd bin /bin> ./test i=0 Hello,embedded linux! i=1 Hello,embedded linux! i=2 Hello,embedded linux! i=3 Hello,embedded linux! i=4 Hello,embedded linux! i=5 Hello,embedded linux! /bin> |
代码: |
tar zxvf uClinux-dist-20040408.tar.gz |
代码: |
wenwu@wenwu-desktop:/source/uClinux-dist$ make menuconfig config/mkconfig > config.in make -C /source/uClinux-dist/config/scripts/lxdialog all make[1]: Entering directory `/source/uClinux-dist/config/scripts/lxdialog' /usr/bin/ld: cannot find -lncurses collect2: ld 返回 1 -e >> Unable to find the Ncurses libraries. >> >> You must have Ncurses installed in order >> to use 'make menuconfig' make[1]: *** [ncurses] 错误 1 make[1]: Leaving directory `/source/uClinux-dist/config/scripts/lxdialog' make: *** [menuconfig] 错误 2 wenwu@wenwu-desktop:/source/uClinux-dist$ |
代码: |
wenwu@wenwu-desktop:/source/uClinux-dist$ sudo make xconfig config/mkconfig > config.in make -C /source/uClinux-dist/config/scripts tkparse make[1]: Entering directory `/source/uClinux-dist/config/scripts' make[1]: “tkparse”是最新的。 make[1]: Leaving directory `/source/uClinux-dist/config/scripts' ARCH=dummy /source/uClinux-dist/config/scripts/tkparse < config.in > config.tmp cat /source/uClinux-dist/config/scripts/header.tk >> ./config.tk cat config.tmp >> config.tk rm -f config.tmp echo "set defaults \"/dev/null\"" >> config.tk echo "set help_file \"config/Configure.help\"" >> config.tk cat /source/uClinux-dist/config/scripts/tail.tk >> config.tk chmod 755 config.tk make: wish:命令未找到 make: *** [xconfig] 错误 127 |
代码: |
--- Select the Vendor you wish to target (GDB) Vendor --- Select the Product you wish to target (ARMulator) GDB Products |
代码: |
(linux-2.4.x) Kernel Version (uC-libc) Libc Version [ ] Default all settings (lose changes) [ ] Customize Kernel Settings [ ] Customize Vendor/User Settings [ ] Update Default Vendor Settings |
代码: |
Do you wish to save your new kernel configuration? < Yes > < No > |
代码: |
arm/clone.S: Assembler messages: arm/clone.S:34: Error: undefined symbol `EINVAL' in operation make[3]: *** [arm/clone.o] 错误 1 make[3]: Leaving directory `/source/uClinux-dist/lib/libc/sysdeps' make[2]: *** [subdirs] 错误 1 make[2]: Leaving directory `/source/uClinux-dist/lib/libc' make[1]: *** [all] 错误 2 make[1]: Leaving directory `/source/uClinux-dist/lib' make: *** [subdirs] 错误 1 |
代码: |
(uClibc) Libc Version |
代码: |
make dep make |
代码: |
#skyeye config file sample 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=./boot.rom 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" |
代码: |
wenwu@wenwu-desktop:/source/uClinux-dist$ ln -s images/romfs.img boot.rom |
代码: |
wenwu@wenwu-desktop:/source/uClinux-dist$ skyeye -e linux-2.4.x/linux big_endian is false. arch: arm cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0 mach info: name at91, mach_init addr 0x8057550 uart_mod:0, desc_in:, desc_out:, converter: SKYEYE: use arm7100 mmu ops Loaded ROM ./boot.rom start addr is set to 0x01000000 by exec file. Linux version 2.4.24-uc0 (wenwu@wenwu-desktop) (gcc version 2.95.3 20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from http://www.snapgear.com/)) #2 2007年 11月 11日 星期日 16:21:16 CST Processor: Atmel AT91M40xxx revision 0 Architecture: EB01 On node 0 totalpages: 1024 zone(0): 0 pages. zone(1): 1024 pages. zone(2): 0 pages. Kernel command line: root="/dev/rom0" Calibrating delay loop... 15.82 BogoMIPS Memory: 4MB = 4MB total Memory: 2968KB available (850K code, 180K data, 40K init) Dentry cache hash table entries: 512 (order: 0, 4096 bytes) Inode cache hash table entries: 512 (order: 0, 4096 bytes) Mount cache hash table entries: 512 (order: 0, 4096 bytes) Buffer cache hash table entries: 1024 (order: 0, 4096 bytes) Page-cache hash table entries: 1024 (order: 0, 4096 bytes) POSIX conformance testing by UNIFIX Linux NET4.0 for Linux 2.4 Based upon Swansea University Computer Society NET3.039 Initializing RT netlink socket Starting kswapd Atmel USART driver version 0.99 ttyS0 at 0xfffd0000 (irq = 2) is a builtin Atmel APB USART ttyS1 at 0xfffcc000 (irq = 3) is a builtin Atmel APB USART Blkmem copyright 1998,1999 D. Jeff Dionne Blkmem copyright 1998 Kenneth Albanowski Blkmem 1 disk images: 0: 1400000-14AC3FF [VIRTUAL 1400000-14AC3FF] (RO) RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize NET4: Linux TCP/IP 1.0 for NET4.0 IP Protocols: ICMP, UDP, TCP IP: routing cache hash table of 512 buckets, 4Kbytes TCP: Hash tables configured (established 512 bind 512) NET4: Unix domain sockets 1.0/SMP for Linux NET4.0. VFS: Mounted root (romfs filesystem) readonly. Shell invoked to run file: /etc/rc Command: hostname GDB-ARMulator Command: /bin/expand /etc/ramfs.img /dev/ram0 Command: mount -t proc proc /proc Command: mount -t ext2 /dev/ram0 /var Command: mkdir /var/tmp Command: mkdir /var/log Command: mkdir /var/run Command: mkdir /var/lock Command: mkdir /var/empty Command: cat /etc/motd Welcome to ____ _ _ / __| ||_| _ _| | | | _ ____ _ _ _ _ | | | | | | || | _ \| | | |\ \/ / | |_| | |__| || | | | | |_| |/ \ | ___\____|_||_|_| |_|\____|\_/\_/ | | |_| GDB/ARMulator support by <davidm@snapgear.com> For further information check: http://www.uclinux.org/ Execution Finished, Exiting Sash command shell (version 1.1.1) /> |
摘自http://www.dzkf.cn/html/qianrushixitong/2006/1031/941.html
SkyEye是一个开源软件(opensource
software)项目,中文名字是“天目”。SkyEye的目标是在通用的Linux和Windows平台实现一个仿真集成开发环境,模拟常见的嵌入式
计算机系统(目前支持基于arm7tdmi的AT91开发板);可在SkyEye上运行uclinux以及uC/OS-II等多种嵌入式操作系统,并对它
们进行源码级的分析和测试。SkyEye的推出具有下面两方面的意义:
首先,通过SkyEye仿真集成环境可以很方便地进入到嵌入式系统软件学习和开发的广阔天地中。尤其对于缺少嵌入式硬件开发环境的用户来说,它将是一个非
常有效的学习工具和开发手段。因此,如果您想学习Liunx操作系统或者进行嵌入式系统开发,但苦于没有硬件支持的话,欢迎使用SkyEye仿真环境软
件!
1 在linux 下安装skyeye
1.1 从源代码进行安装skyeye
下载最新的skyeye-v0.x.x.tar.bz2源码包,目前最新的为skyeye-v0.4.7.tar.bz2
解开skyeye-v0.x.x.tar.bz2 :
tar jxf skyeye-v0.x.x.tar.bz2
进入解压后的skyeye目录,按照SkyEye.README介绍的步骤做configure,make,make install
cd skyeye
./configure --target=arm-elf --prefix=/usr/local --without-gtk-prefix --without-gtk-exec-prefix --disable-gtktest
make
make install
如果一切正常,则在/usr/local/bin目录下,有一个执行文件skyeye
注意:
需要指出的是,在mandrake8.2环境中,make 时会有error,不过不是什么大问题,
error:display.c->tcap.h->termcap.h:no such file or directory
在本机/usr/include下find一下,termcap.h头文件在/usr/include/ncurses目录下,
将termcap.h中的<termcap.h>改成<ncurses/termcap.h>
重新执行make就ok了。
执行make install命令后,skyeye默认安装在/usr/local/bin/目录下,你可以通过改configure命令参数prefix来改变安装路径。
1.2 直接安装编译好的skyeye
下载最新的skyeye执行代码skyeye-0.x.x-redhat9.0.bin (目前只提供了在redhat9下编译好的代码),目前最新的版本为 skyeye-0.4.7-redhat9.0.bin
把下载的skyeye-0.4.7-redhat9.0.bin 移动到/usr/local/bin下,并改名为skyeye,改变skyeye的属性:
mv skyeye-0.4.7-redhat9.0.bin /usr/local/bin/skyeye
chmod 755 /usr/local/bin/skyeye
2 安装arm-elf交叉编译器 (用于编译ucosii4skyeye 和 uclinux4skyeye)
下载arm-elf-tools-20030314.sh 位于 ftp://166.111.68.183/pub/embed/uclinux/soft/tools/arm目录下,或到www.uclinux.org处下载
改变文件属性,并执行:
chmod 755 arm-elf-tools-20030314.sh
./arm-elf-tools-20030314.sh
结束后,arm-elf-gcc/gdb....工具会安装到/usr/local/bin下
3 安装 ucosii for skyeye
3.1 从源码安装
下载ucosii for skyeye源代码,目前的最新版本源代码为ucosii4skyeye-v1.8.2.tgz
解压文件:
tar zxf ucosii4skyeye-vx.x.x.tgz
进入解压生成的目录下,编译ucosii for skyeye:
cd ucosii4skyeye
make config
make dep
make
结束后,则生成五个sample的执行文件,分别位于ucosii4skyeye/samples/对应的应用名目录下。
3.2 直接下载编译好的cuosii for skyeye
目前最新的版本为ucosii4skyeye-binary-v1.8.tgz
解压文件:
tar zxf ucosii4skyeye-binary-v1.8.2.tgz
4 调试 ucosii for skyeye
在一个存在 skyeye.conf和*.elf文件(设为simple_test.elf)的目录下,执行:
skyeye simple_test.elf
(skyeye) target sim
(skyeye) load
(skyeye) run
就可以看到程序运行的情况
5 编译并运行uClinux-dist-20020927.tar.gz
运行环境:redhat9
前提:安装了 arm-elf-tools工具
以uClinux-dist-20020927.tar.gz为例。位于 ftp://166.111.68.183/pub/embed/uclinux/soft/目录下,或到www.uclinux.org处下载
将uClinux-dist-20020927.tar.gz下载并解开,比如解开在/usr/src/uclinux-dist/下,然后在/usr/src/uclinux-dist/目录下执行如下命令:
tar zxf uClinux-dist-20020927.tar.gz
cd uClinux-dist
在图形方式下可用命令 make xconfig 或 在命令行方式下可用命令 make menuconfig
在vendor/product中选择GDB/ARMulator,kernel版本选择2.4,save and exit.
------------------------------------------------------------------------------------------------------------------------------------------------
这时在/usr/src/uclinux-dist/linux-2.4.x目录下生成linux文件
如果想一步生成带调试信息的linux kernel执行文件和linux kenel 执行文件映像和磁盘映像文件romfs.img
可简单是运行命令
make dep
make
就行了。可查看/usr/src/uclinux-dist/images/下是否有文件 romfs.img等
在/usr/src/uclinux-dist/linux-2.4.x目录下生成linux的elf格式的内核执行文件
-------------------------------------------------------------------------------------------------------------------------------------------------
在 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。
6 下载测试软件集合
目前最新版本的测试软件集合为:
skyeye-binary-testsuits-in-rh9-2003-09-21.tar.bz2
到 ftp:/166.111.68.183/pub/embed/skyeye/binary/下载
解压并测试:
tar jxf skyeye-binary-testsuits-in-rh9-2003-09-21.tar.bz2
cd test
可以看到有编译好的skyeye 和编译好的针对各个硬件平台的内核代码执行过程与上面类似
摘自:http://www.dzkf.cn/html/qianrushixitong/2007/0803/2460.html
1.简介
SkyEye是一个开源软件项目,它是在Linux和Windows平台上实现一个纯软件模拟集成开发环境,模拟常见的嵌入式系统。可以在SkyEye上运行Linux,uClinux以及uC/OS-II等多款嵌入式操作系统和各种系统软件。
目前最新版本的SkyEye是skyeye-1.2-RC6.tar.bz2版本,该版本可以从www.skyeye.org获取。SkyEye目前支持多款嵌入式处理器:
对于附加设备该项目已经完成对Flash,LCD,Network Interface Card,touchsceen, UART的支持
2.SkyEye的安装
下面我就以最新版本的skyeye-1.2.RC6为例子安装SkyEye.
我的系统配置入下
操作系统: Fedora Core 2 Linux(2.4.x)
GCC Version: 3.3.2
arm-elf-gcc Version: 2.95.3 20010315
首先从www.uClinux.org下载arm-elf-tools,里面包含arm-elf-gcc, arm-elf-ld等工具。下载后可以通过如下方式安装:
$su -c './arm-elf-tools-20030315.sh'
$password:
安装完毕后,可以进入存放skyeye的目录,例如我的是放在/home/jelly/download/目录。然后进行解压。
$cd ~/download
$ls
skyeye-1.2-RC6.tar.bz2
$tar jxvf skyeye-1.2-RC6-tar.bz2
然后进入解压的skyeye目录
$cd skyeye-v1
最后使用make命令进行软件的安装,编译完毕后会在binary生成一个skyeye可执行文件,该文件就是skyeye模拟器了。
使用make命令的时候可以加入一些选项参数,例如:
如果在binary目录下生成了skyeye文件,那么安装成功。下面我以uClinux为例子,在skyeye上模拟。可以通过使用-h参数来获取帮助
$skyeye -h
------------------------- SkyEye -V1.2 ---------------------------
Usage: SkyEye [options] -e program [program args]
Default mode is STANDALONE mode
------------------------------------------------------------------
Options:
-e exec-file the (ELF executable format)kernel file name.
-d in GDB Server mode (can be connected by GDB).
-c config-file the skyeye configure file name.
-h This Help Display
-v This shows arch and cpu supported
------------------------------------------------------------------
-e 指定elf各式的内核文件
-d GDB调试模式
-c 指定配置文件
-h 获取帮助
-v 显示体系结构和CPU支持信息(不知道是不是我用的这个版本没有实现该功能,使用-v选项后显示:Unknown option '-v')
3.uClinux移植
从www.uclinux.org网站上下载比较新的内核包文件,并且解压。
$tar xvzf uClinux-dist-xxxxxxxx.tar.gz
进入生成的uClinux-dist目录
可以使用make xconfig - 图形配置模式,make menuconfig - 菜单模式配置,方式来配置uClinux.
在uClinux-dist目录下执行:
$make xconfig
在Target Platform Selection选项卡中选择:
Vendor/Product: GDB/ARMulator
Kernel Version: linux-2.4.x
Libc Version: uC-libc
然后选择save and exit
完成配置后,可以使用make dep建立内核依赖关系,然后使用make编译内核和文件系统
$make dep; make
经过一段时间的编译后,如果没有出现错误,则在uClinux-dist目录下的images目录里会建立如下几个文件:
image.bin linux.data linux.text. romfs.img
该romfs.img就是我们需要的文件系统映象了
同时,在uClinux-dist/linux-2.4.x/目录下会生成linux,该文件是一个我们需要模拟的内核文件。
接下来我们可以使用skyeye软件来模拟我们编译的uClinux系统了。
我们在uClinux-dist目录下建立一个名为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"
lcd: state="on"
保存退出
然后在uClinux-dist目录里执行~/download/skyeye-v1/binary/skyeye -e linux-2.4.x/linux
看看uclinux是不是跑起来了?
下面是我的输出
arch: arm
cpu info: armv3, arm7tdmi, 41007700, fff8ff00, 0
mach info: name at91, mach_init addr 0x80727e0
can't find device module: (null)
SKYEYE: use arm7100 mmu ops
Loaded ROM images/romfs.img
exec file "linux-2.4.x/linux"'s format is elf32-little.
load section .init: addr = 0x01000000 size = 0x0000a000.
load section .text: addr = 0x0100a000 size = 0x000c5ca0.
load section .data: addr = 0x010d0000 size = 0x00008320.
not load section .bss: addr = 0x010d8320 size = 0x00022198 .
not load section .debug_abbrev: addr = 0x00000000 size = 0x00039846 .
not load section .debug_info: addr = 0x00000000 size = 0x016b812f .
not load section .debug_line: addr = 0x00000000 size = 0x00378ef3 .
not load section .debug_pubnames: addr = 0x00000000 size = 0x0000b40d .
not load section .debug_aranges: addr = 0x00000000 size = 0x000022e0 .
start addr is set to 0x01000000 by exec file.
Linux
version 2.4.19-uc1 (jelly@localhost.localdomain) (gcc version 2.95.3
20010315 (release)(ColdFire patches - 20010318 from
http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches from
http://www.snapgear.com/)) #1 五 4#1 五 4月 7 23:41:40 CST 2006
Processor: Atmel AT91M40xxx revision 0
Architecture: EB01
On node 0 totalpages: 1024
zone(0): 0 pages.
zone(1): 1024 pages.
zone(2): 0 pages.
Kernel command line: root="/dev/rom0"
Calibrating delay loop... 12.97 BogoMIPS
Memory: 4MB = 4MB total
Memory: 3036KB available (791K code, 170K data, 40K init)
Dentry cache hash table entries: 512 (order: 0, 4096 bytes)
Inode cache hash table entries: 512 (order: 0, 4096 bytes)
Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer-cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 1024 (order: 0, 4096 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
Atmel USART driver version 0.99
ttyS0 at 0xfffd0000 (irq = 2) is a builtin Atmel APB USART
ttyS1 at 0xfffcc000 (irq = 3) is a builtin Atmel APB USART
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: 1400000-145DBFF [VIRTUAL 1400000-145DBFF] (RO)
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP
IP: routing cache hash table of 512 buckets, 4Kbytes
TCP: Hash tables configured (established 512 bind 512)
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
VFS: Mounted root (romfs filesystem) readonly.
Shell invoked to run file: /etc/rc
Command: hostname GDB-ARMulator
Command: /bin/expand /etc/ramfs.img /dev/ram0
Command: mount -t proc proc /proc
Command: mount -t ext2 /dev/ram0 /var
Command: mkdir /var/tmp
Command: mkdir /var/log
Command: mkdir /var/run
Command: mkdir /var/lock
Command: cat /etc/motd
Welcome to
____ _ _
/ __| ||_|
_ _| | | | _ ____ _ _ _ _
| | | | | | || | _ \| | | |\ \/ /
| |_| | |__| || | | | | |_| |/ \
| ___\____|_||_|_| |_|\____|\_/\_/
| |
|_|
GDB/ARMulator support by <davidm@snapgear.com>
For further information check:
http://www.uclinux.org/
Execution Finished, Exiting
Sash command shell (version 1.1.1)
/>
对于skyeye.conf文件的一点说明
对于skyeye-v0.2.5版本之前的skyeye使用的是memmap.conf文件,而之后的是使用skyeye.conf文件
cpu: 指定CPU类型,如arm7tdmi,arm720t等
mach: 开发板类型,如at91, ep7312
mem_bank: 内存块
map=M 指定为rom/ram, map="I" 指定为IO空间
type=RW 可读写,type=R 只读
addr=0x00000000 内存块开始地址
size=0x10000000 内存块大小
files=romfs.img 文件系统映象文件
net: 网络配置
state=on 模拟NIC,等于off则不模拟
mac=0:4:3:2:1:f 指定MAC地址
ethmod=tuntap/vnet 使用虚拟驱动
hostip= 指定ip地址
例如:net: state = on, mac="0:4:3:2:1:f", ethmod="tuntap", hostip="10".0.0.1
uart: 串口支持
fd_in= 指定输入文件
fd_out= 指定输出文件
例如:uart: fd_in=/dev/ttyS0, fd_out=/dev/ttyS1
则你可以使用minicon来监听COM1口来进行数据交换
LCD:LCD模拟
state = on/off 打开或者关闭LCD模拟
4.SkyEye调试功能
要使用SkeyEye调试功能,可以在执行的时候加入-d参数,例如:
$skyeye -e linux -d
这时就在本机的12345端口开启了gdb服务
这时重新开一个终端程序
$arm-elf-gdb linux
(gdb)target remote 127.0.0.1:12345
此时就可以象使用本地gdb一样来调试服务端的uClinux了。
5.参考文档
1.skyeye源码
2.SkyEye User Manual http://skyeye.sourceforge.net/wiki/UserManual
3.skyeyelcdts http://gro.clinux.org/frs/download.php/789/SkyEyelcdtouchscreen4gro.pdf
4.skyeyeinternal http://gro.clinux.org/frs/download.php/719/skyeyeinternal-0.6.8.pdf
5.hardwaredoc4skyeye http://gro.clinux.org/frs/download.php/835/hardwaredoc4skyeye.tar.bz2
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、一个应用程序的开发实例
8、编译并运行uClinux-dist-20030909.tar.gz
9、加入网络功能
10、安装完成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 <stdio.h>
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/skyey...-1.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/
注:可以用genromfs -h来获得帮助!
OK!执行下面的命令:
skyeye linux
(skyeye)target sim
(skyeye)load
(skyeye)run
kernel start.....
很熟悉了吧。。。
cd /bin
hello
可以看到结果了吗?其实到了这一步,你就可以开发自己的程序了!
下面介绍的程序主要是完成一个网络应用,网络应用的标准模型是客户机-服务器模型,它的主要执行过程如下:
(1)系统启动服务器执行。服务器完成一些初始化操作,然后进入睡眠状态,等待客户机请求;
(2)在网络的某台机器上,用户执行客户机程序;
(3)客户机进程与服务器进程建立一条连接;
(4)连接建立之后,客户机通过网络向服务器发出请求,请求某种服务;
(5)服务器接收到客户机请求后,根据客户机请求的内容进行相应的处理,然后将处理结果返回;
(6)服务器断开与客户机的连接,继续睡眠,等待其他客户机的请求;
Linux系统中的很多服务器是在系统初启时启动的,如时间服务器、打印服务器、文件传输服务器和电子邮件服务器等。大多数时间这些服务器进程处于
睡眠状态,等待客户机的请求。下面这两个客户机-服务器程序比较简单,主要是对网络客户机-服务器模型的实际运行有大致印象。这个客户机-服务器的操作过
程非常简单:客户机与服务器建立连接之后,服务器向客户机返回一条消息。服务器程序的源代码如下:
/* tcpserver.c */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define WAITBUF 10
int main(int argc, char *argv[])
{
int sockfd, new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
unsigned int sin_size, portnumber;
char hello[]="Hello! Socket communication world!\n";
if(argc != 2)
{
fprintf(stderr, "Usage:%s portnumber\a\n", argv[0]);
exit(1);
}
if((portnumber = atoi(argv[1])) < 0)
{
fprintf(stderr, "Usage: %s portnumber error\a\n", argv[0]);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
fprintf(stderr, "Socket error:%s\n\a", strerror(errno));
exit(1);
}
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = portnumber;
if(bind(sockfd,(struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
{
fprintf(stderr, "Bind error:%s\n\a", strerror(errno));
exit(1);
}
if(listen(sockfd, WAITBUF) == -1)
{
fprintf(stderr, "Listen error:%s\n\a", strerror(errno));
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) == -1)
{
fprintf( stderr, "Accept error:%s\n\a", strerror(errno));
exit(1);
}
fprintf(stderr, "Server get connection from %s\n", inet_ntoa(client_addr.sin_addr));
if(send(new_fd, hello, strlen(hello), 0) == -1)
{
fprintf(stderr, "Write Error:%s\n", strerror(errno));
exit(1);
}
close(new_fd);
}
close(sockfd);
exit(0);
}
给服务器程序写一个Makefile文件,如下:
# start
CC = arm-elf-gcc
CFLAGS = -D__PIC__ -fpic -msingle-pic-base -O2 -pipe -Wall -g
LDFLAGS = -Wl,-elf2flt
LIBS =
OBJS = tcpserver.o
all: tcpserver
tcpser: $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) -o tcpserver $(OBJS) $(LIBS)
clean:
rm -rf *.o *.elf *.gdb hello
# end
客户机程序的源代码如下:
/* tcpclient.c */
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define RECVBUFSIZE 1024
int main(int argc, char *argv[])
{
int sockfd;
char buffer[RECVBUFSIZE];
struct sockaddr_in server_addr;
int portnumber, nbytes;
if(argc != 3)
{
fprintf(stderr, "Usage:%s hostname portnumber\a\n", argv[0]);
exit(1);
}
if((portnumber=atoi(argv[2])) < 0)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n", argv[0]);
exit(1);
}
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
fprintf(stderr, "Socket Error:%s\a\n", strerror(errno));
exit(1);
}
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = portnumber;
server_addr.sin_addr.s_addr = inet_addr(argv[1]);
if(connect(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
{
fprintf(stderr, "Connect Error:%s\a\n", strerror(errno));
exit(1);
}
if((nbytes = recv(sockfd, buffer, RECVBUFSIZE, 0)) == -1)
{
fprintf(stderr, "Read Error:%s\n", strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
printf("I have received:%s\n", buffer );
close(sockfd);
exit(0);
}
最后,skyeye-binary-testutils-1.1.0.tar.bz2/at91x40/uclinux1包里提取
boot.rom,用步骤6中的方法,把tcpserver程序放在boot.rom的bin目录中,在目标板上运行tcpserver
2000,在主机上运行./tcpclient 10.0.0.2 2000,看看结果!
程序的源码的注释因篇幅不在这给出,大家可以参考一些Linux网络编程的书籍,我也会在我的主页上更新一些资料,有需要的朋友可以去下载
8、编译并运行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
9、加入网络功能
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
参考:
SkyEye项目站点里的一篇中文文档;
陈渝《SkyEye Project FAQ》;
skyeye-0.7.0中的README文档。
后记:
为了让大家能快速上手,进行实际的开发工作,我赶凑了一篇文档,很粗糙。但我坚信随着更多的有经验的人的加入;随着我们自己水平的提
高,一定会出现更多、更好的文章来。就让我们快点行动起来吧!最后,我再次建议大家看一下《嵌入式Linux技术与应用》这本书。网络部分没有完全解决,
现在只是主机与skyeye间的网卡行了,而uClinux内的网卡没成,我觉得是不是要重新编译uClinux的内核,请大家指教。
这个文档不算完整,但还是贴上来了,大家一起讨论吧。我觉得SkyEye仿真环境很好,这个贴子就算是个引子吧,大家可以先从这个地方入手。
摘自http://www.dzkf.cn/html/qianrushixitong/2007/0710/2359.html
安装VM,在创建虚拟机的位置时,选择E盘导致程序无响应,不知是否是BUG,直接键入路径可以通过。配置虚拟机可使用的内存为256M,默认的176M运行速度稍慢。
塞入UBUNTU
7.10光盘,我在XP下使用daemon虚拟的7.10的镜像文件。开启虚拟机,从光盘引导,进入桌面后运行install即可开始安装。安装至95%
左右时,安装程序尝试进行网络连接,且进度条一直不动,此时在VM中把网卡禁掉可以继续往下走(可能是安装程序在从国外的源检查更新,本人在教育网)。
安装完成后首先更改source.list,将自己连接速度较快的源加入list。运行sudo apt-get upgrade
更新源列表。(把速度快的源放在list中靠前的位置,为了保证完整性可以把官方源加上,我在更新时最后有一个服务器连接不上被我ctrl-c结束掉
了)。运行sudo apt-get dist-upgrade更新已安装的程序。
两条比较实用的命令:sudo apt-get install nautilus-open-terminal将终端添加到右键菜单;sudo apt-get install nautilus-gksu以管理员身份打开文件夹。
安装中文支持和输入法。
安装GCC/MAKE等编译工具:sudo apt-get install
build-essential。(未执行该步骤而先试图安装VM-TOOLS,结果在安装时提示没有适合该内核的版本,需重新编译,编译中vmhgfs
和vmxnet对编译失败,此时查看网络连接发现找不到网卡。通过usr/bin/vmware-unintall-tool卸载后重启,可以找到网络。
执行安装编译工具命令后,仍无法编译上述两个模块,且网卡仍找不到,重启后可以找到,不知会对以后的操作有怎样影响)
系统分类: | 自由话题 |
用户分类: |
文章评论(0条评论)
登录后参与讨论