五. 用U-Boot下载Linux kernel和root fs到目标开发板(在不同的开发板上,下载地址可能不同)。
# setenv ipaddr 192.168.1.2
# setenv serverip 192.168.1.1 (确保开发板和宿主机在同一网段)
# tftpboot 0x30007fc0 uImage.s3c2410-f
# tftpboot 0x30800000 ramdisk.u-boot-f
# bootm 0x30007fc0 0x30800000
如果要下载档案并且写入到NOR Flash中,方法如下:
把uImage.s3c2410-f通过tftp download到SDRAM中的0x30007fc0的位置
SMDK2410> tftpboot 0x30007fc0 uImage.s3c2410-f
将0x30007fc0位置开始长度为0x100000(即1M,这个长度取决于uImage.s3c2410-f的大小,比uImage.s3c2410-f的大小要大,在256K字节的边界上即可)的字节烧写到flash中(地址为0x200000)
SMDK2410> cp.b 0x30007fc0 0x200000 0x100000
把ramdisk.u-boot-f通过tftpdownload到SDRAM中的0x30800000 的位置
SMDK2410> tftpboot 0x30800000 ramdisk.u-boot-f
将0x30007fc0位置开始长度为0x1000000(即16M,这个长度取决于ramdisk.u-boot-f的大小,比ramdisk.u-boot-f的大小要大,在256K字节的边界上即可)的字节烧写到flash中(地址为0x800000)
SMDK2410> cp.b 0x3080000 0x800000 0x1000000
这时候,linux kernel和ramdisk已经保存到flash的0x200000和0x800000这两个位置了。
如果不需要每次起来自动启动linux,就在复位后进入u-boot命令界面,输入下面的命令即可:
SMDK2410> cp.b 0x200000 0x30007fc0 0x100000
SMDK2410> cp.b 0x800000 0x30800000 0x1000000
SMDK2410> bootm 0x30007fc0 0x30800000
如果想每次复位后自动启动linux,就把上面3条命令通过setenv命令设置到u-boot的环境变量bootcmd中。
SMDK2410>setenv bootcmd cp.b 0x200000 0x30007fc0 0x100000; cp.b 0x800000 0x30800000 0x1000000; bootm 0x30007fc0 0x30800000
SMDK2410>protect off 0x00040000 0x0007ffff
SMDK2410>saveenv
SMDK2410>protect on 0x00040000 0x0007ffff
六. 基于s3c2410嵌入式处理器的开发板上,mp3播放程序madplay编译总结
1. 编译zlib,因为libid3tag需要这个库
# ./configure --prefix=/opt/host/armv4l/
修改Makefile
AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar
CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib
最后AR命令要添加rcs,否则会出错
具体操作:
libz.a : $(OBJS)$(OBJA)
$(AR) rcs$@$(OBJS)$(OBJA)
-@($(RANLIB)$@||true)>/dev/null 2>&1
# make
# make install
2. 编译libid3tag
# ./configure --host=armv4l-unknown-linux
CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
--disable-debugging --disable-shared
--prefix-/opt/host/armv4l/
# make
# make install
3. 编译libmad
# ./configure --enable -fpm=arm --host=armv4l-unknown-linux
--disable-shared --disable-debugging
--prefix=/opt/host/armv4l/
CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
# make
# make install
4. 编译madplay
# ./configure --host=armv4l-unknown-linux
CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc
--disable-debugging
--disable-shared
CPPFLAGS='-I/opt/host/armv4l/include'
LDFLAGS='-L/opt/host/armv4l/lib'
# make
NOTE:可以在Makefile里加上 -static 选项,从而得到静态链接的程序。
另外,madplay官方主页是:www.underbit.com
zlib下载地址是:http://www.zlib.net,当前版本是zlib 1.2.3 (2005.7)
七.root文件系统的制作
Ramdisk是分配了一部分内存作为一个分区来使用。对于系统运行时不断使用的程序,将它们放在Ramdisk中将加快计算机的操作,如大数据量的网络服务器、无盘工作站等。为了能够使用Ramdisk,我们在编译内核时须将block device中的Ramdisk支持选上,它下面还有两个选项,一个是设定Ramdisk的大小,默认是4096k;另一个是initrd的支持。它既可以直接编译进内核,也可以编译成模块,在需要的时候加载。如果在启动时就用它(例如加载ramdisk作为rootfs),就必须将它直接编译进内核。
在Linux下建立目录/myramdisk,将在此目录下创建的文件系统对应的文件结构。一般不需要对于系统运行是完全无用的文件,如帮助手册、信息页,头文件、内核源码等。
General:要建立的目录是,dev,设备;etc,系统配置文件;sbin,重要的系统程序;bin,基本应用程序;lib,共享函数库;mnt,装载其他磁盘节点;usr,附加应用程序;proc,proc文件系统;其中,proc,mnt,usr可以是空的。
一些要包含在 Ramdisk 中的重要目录是:
/bin — 保存大多数如 init、busybox、shell、文件管理实用程序等二进制文件;
/sbin — 保存系统启动过程通常需要的命令,如e2fsck、mke2fs、fdisk、insmod、rmmod、depmod、modprobe、lsmod、shutdown、reboot、login、init、getty、mount、umount、等;
/dev — 包含用在设备中的所有设备节点,一定要有的是console,kmem,mem,null,ram,tty* 等文件;
/etc — 包含必不可少的系统配置文件,一般包含rc.d/* (系统启动脚本),fstab(列出要登陆的文件系统),inittab(包含启动过程参数),passwd(用户名和目录),group(用户组),shadow(用户加密密码)。如果不使用init作为登陆进程,而将init链接到/bin/bash,即,#ln –s /bin/bash /sbin/init,则/etc目录下可以不含任何文件,这种情况类似单用户登陆系统,同样,也不需要输入用户名和密码;
/proc — 这是一个必须设置的特殊目录,在系统运行之后它下面有许多内容,这些内容是实时、不断跟踪系统内核和正在运行的进程的状态而产生的,但不占用任何磁盘空间,而是驻留在内存中;在某些情况下,可以通过它来进行系统设置,许多工具从这里获取信息,如dmesg、ps、top等;在内核编译选项文件系统选择中,我们选择对文件系统proc的支持;
/lib — 包含所有必需的库,根据/bin和/sbin目录下的可执行文件需要的动态链接库来确定lib目录下的内容,其中必须有函数装载器,或是ld.so(对a.out库)或是ld-linux.so(对ELF库)。
文件系统制作完成,看看这个/myramdisk目录大小为多大,然后确定需要多大的Ramdisk,在内核编译的时候,修改Ramdisk大小(缺省为4096k)为所需要的尺寸。
现在我们以制作一个4M的Ramdisk为例子,步骤如下:
1. 在宿主机上编译运行在目标机linux内核时,将block device中的Ramdisk支持选上,设定Ramdisk的大小为缺省的4096K,对initrd的支持也选上。
2. 在宿主机上建立/myramdisk目录,按照上述的原则建立必要的目录和文件。
3. 执行下列步骤:
- 在根目录下建立一个文件 /images/initrd.img,从设备文件/dev/zero中读取数据填充文件initrd.img(NOTE:/dev/zero是一个特殊的设备文件,从这个文件读出来的数据全是0,以便后面得到更高的压缩率);
# mkdir /images
# dd if=/dev/zero of=/images/initrd.img bs=1k count=4096 - 在Ramdisk上建立4M的ext2类型的文件系统;
# mke2fs -m0 -F /images/initrd.img 4096
也可以是:# mke2fs -F -v -m0 /images/initrd.im
若要建立ext3类型的filesystem,命令是:
# mke2fs -j -m0 -F /images/initrd.img 4096 ,同样,也可以不指定大小) - 在/mnt下建立目录rootfs, 将已经格式化为ext2类型文件系统的ramdisk挂载至目录/mnt/rootfs上;
# mkdir –p /mnt/rootfs
# mount –o loop /images/initrd.img /mnt/rootfs - 将宿主机上/myramdisk目录下的文件结构拷贝至/mnt/rootfs目录中(这就相当于拷贝至文件initrd.img中了);
# cp -av /myramdisk/* /mnt/rootfs
(NOTE:必须用命令拷贝的方式,否则可能出错) - 卸载掉/mnt/rootfs;
# umount /mnt/rootfs - 产生一个压缩的映象文件。
# gzip -9 < images/initrd.img > images/initrd.bin - 最后,用mkimage工具将其制作成U-Boot的可执行ramdisk映像
# ./mkimage -n 'RAM disk' -A arm -O linux -T ramdisk -C gzip -d initrd.bin initrd.boot
也可以是:
# ./mkimage –A arm –O linux –T ramdisk –C gzip –a 0x30800000 –e 0x30800000 –n ‘ramdisk’ –d initrd.bin initrd.boot
………………………………………………………………………………………………………………………………
韩海锋 email:hanhf@163.com MSN:springmagus@hotmail.com QQ:34196145