tftp惹的祸

    我要实现的功能是:友善mini2440板的Uboot启动,从tftp服务器下载kernel image,然后挂载主机的nfs根文件系统。按照高人hugerat的Uboot代码把uboot移植到mini2440版,基本就能进入Uboot命令行了,这里非常感谢hugerat,这里再补充一点点。
    linux内核用2.6.13,arm-linux-gcc用3.4.1, 编译uboot过程如果_umodsi3.S的79行 _udivsi3.S的67行出现错误,可以把行尾的(PLT)注释掉就能编译通过,据说是arm-linux-gcc编译器还不支持硬件浮点选项。
    我的服务器是fedora7,默认没有安装xinet,tftpd。下了gnu上的tftp源码安装,后来发现tftpd运行还必须要xinet,于是再下xinet装,但xinet却不识别tftp服务,估计没装对,于是又下了个tftp-server rpm包装,都装好却发现无论在客户端怎样tftp链接都下不了文件。目录和文件的权限都要改的都改,/etc/xinetd.d/tftp配置都改了,日志文件还是抱怨Permission denied。后来卸载tftp-server rpm包重新装就成功了。估计是gnu和rpm包的冲突,早知道全部用rpm包算了。这里推荐个rpm包的下载网址
http://www.rpmseek.com/index.html

用以下语句制作用于bootm的uImage:
mkimage -n 'uImage2.6.13' -A arm -O linux -T kernel -C none -a 30100000 -e 30100000 -d zImage uImage
解释一下:
-A 指定CPU的体系结构(取下面取值之一):
 alpha Alpha arm A RM x86 Intel x86 ia64 IA64 mips MIPS mips64 MIPS 64 Bit ppc PowerPC s390 IBM S390 sh SuperH sparc SPARC sparc64 SPARC64 m68k MC68000
-O 指定操作系统类型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象类型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
-C 指定映象压缩方式,可以取以下值:
none 不压缩
gzip 用gzip的压缩方式
bzip2 用bzip2的压缩方式
这里如果填gzip,kernel是启动不了的。估计zImage是未经压缩工具压缩的,而在kernel源码编译后目录arch/arm/boot/有一个Image.gz才是经过gzip压缩的。
-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
-n 指定映象名
-d 指定制作映象的来源文件

我的内核启动参数用于挂载nfs rootfs
Kernel command line: noinitrd root=/dev/nfs nfsroot=202.117.15.109:/home/dongjiajing/nfs/root_qtopia_tp ip=202.117.15.99:202.117.15.109:202.117.15.109:255.255.255.0:sbc2440.arm9.net:eth0:off init=/linuxrc console=ttySAC0

可以先在window下测试linux上的tftp是否正常运行
tftp 202.117.15.109 get uImage
成功话,就会返回如下内容
Transfer successful: 1548041 bytes in 1 second, 1548041 bytes/s

有两种方法下载镜像:
#用tftp下载镜像
mini2440 # tftp 31000000
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:13:f6:6c:87:89
BOOTP broadcast 1
BOOTP broadcast 2
TFTP from server 202.117.15.109; our IP address is 202.117.15.99
Filename 'uImage'.
Load address: 0x31000000
Loading: #################################################################
         ########################################
done
Bytes transferred = 1538192 (177890 hex)

#用bootp下载镜像
mini2440 # bootp 31000000
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 00:13:f6:6c:87:89
BOOTP broadcast 1
BOOTP broadcast 2
TFTP from server 202.117.15.109; our IP address is 202.117.15.100
Filename 'uImage'.
Load address: 0x31000000
Loading: #################################################################
         ########################################
done
Bytes transferred = 1538192 (177890 hex)

uboot的tftp <addr>和bootp <addr>的不同之处在于tftp命令前要先设好板子的ip地址,而bootp是通过dhcp协议从服务器处得到板子自己的ip,除去这一步之后两者 都用tftp协议下载文件。
服务器端的tftpd配置文件是/etc/xinetd.d/tftp,内容如下:
service tftp
{
    socket_type        = dgram
    protocol        = udp
    wait            = yes
    user            = root
    server            = /usr/sbin/in.tftpd
    server_args        = -s /tftpboot
    disable            = no
    per_source        = 11
    cps            = 100 2
    flags            = IPv4
}

dhcpd配置文件是/etc/dhcpd.conf,内容如下:

log-facility local7;
subnet 202.117.15.0 netmask 255.255.255.0 {
    option routers 202.117.15.109;
    option subnet-mask 255.255.255.0;

    host SBC2440{
          hardware ethernet 00:13:F6:6C:87:89;
        fixed-address 202.117.15.100;
        option host-name "SBC2440";
        next-server 202.117.15.109;
        #filename "/home/dongjiajing/nfs/zImage";
        filename "uImage";
        option root-path "/home/dongjiajing/nfs/root_qtopia_tp";
    }
}
注意上面的filename表示镜像在tftp服务器上的位置,用相对路径,如果写成/tftpboot/uImage。下载时会报错:
TFTP error: 'File not found' (1)
另外如果linux服务器上开启了vsftpd和tftpd两者可能会冲突。

以上完成了从服务器拷贝内核镜像到板子SDRAM过程,之后可以用bootm命令启动内核。注意的是:如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm xxxx 这个指定的地址xxxx是否与-a指定的加载地址相同:
(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之
(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。

内核自解压正常,在启动文件系统出现如下问题:
IP-Config: Complete:
      device=eth0, addr=202.117.15.99, mask=255.255.255.0, gw=202.117.15.109,
     host=sbc2440, domain=, nis-domain=arm9.net,
     bootserver=202.117.15.109, rootserver=202.117.15.109, rootpath=
Looking up port of RPC 100003/2 on 202.117.15.109
portmap: server 202.117.15.109 not responding, timed out
Root-NFS: Unable to get nfsd port number from server, using default
Looking up port of RPC 100005/1 on 202.117.15.109
portmap: server 202.117.15.109 not responding, timed out
Root-NFS: Unable to get mountd port number from server, using default
Root-NFS: Server returned error -5 while mounting /home/dongjiajing/nfs/root_qtopia
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

其实这里只是nfs rootfs文件系统的路径没写好,内核是启动正常的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值