使用u-boot的tftp服务加载内核镜像同时挂载NFS

本文摘自:http://blog.sina.com.cn/s/blog_4a04f11c0100rr38.html

感谢这位博主为我们提供了这么详尽的方法。

首先,从http://ftp.denx.de/pub/u-boot/下载u-boot-2010.06.tar.bz2,解压后用u-boot-2010.06/driver/net中的dm9000x.c和dm9000x.h替换友坚u-boot driver目录下的dm9000x.c和dm9000x.h,并将u-boot-2010.06/include/目录下的dm9000.h拷贝到友坚u-boot include目录下。

其次,修改/include/configs/smdk6410.h,将
                  #ifdef        CONFIG_DRIVER_SMC911X     
                  #undef       CONFIG_DRIVER_CS8900     
                  #define CONFIG_DRIVER_SMC911X_BASE       0x18800300
                  #else
          #define CONFIG_DRIVER_CS8900    0   
          #define CS8900_BASE          0x18800300
          #define CS8900_BUS16        1    
          #endif替换为
          #define CONFIG_DRIVER_DM9000 1
          #define CONFIG_DM9000_BASE 0X18000300
          #define DM9000_IO  CONFIG_DM9000_BASE
          #define DM9000_DATA (CONFIG_DM9000_BASE+4)
          #define CONFIG_DM9000_NO_SROM   1
          #define CONFIG_NET_MULTI    1
          #define CONFIG_SYS_HZ 1000
再次,修改/board/samsung/smdk6410/smdk6410.c文件,将文件中的CS8900字符全部替换为dm9000
然后,在/net/eth.c中添加
          extern int dm9000_initialize(bd_t*);   

          在函数int eth_initialize(bd_t *bis)

{

#if defined(CONFIG_MII) || (CONFIG_COMMANDS & CFG_CMD_MII)

       miiphy_init();

#endif

#if defined(CONFIG_DRIVER_DM9000)

       dm9000_initialize(bis);

#endif

}

最后,按照手册编译生成u-boot-nand.bin文件

实验过程

ubuntu9.04配置tftp
1:在新立得软件包管理器中安装 xinetd, tftpd, tftp.
2:在/etc/xinetd.d/下增加一个文件,名为tftp,内容如下:
service tftp
{
        disable         = no
        socket_type     = dgram
        protocol        = udp
        wait            = yes
        user            = root
        server          = /usr/sbin/in.tftpd
        server_args     = -s /tftproot
}
3:进入目录/etc/init.d/中,重新启动xinetd
sudo ./xinetd restart
4:到根目录创建文件夹 /tftproot,并将权限设置为777
sudo mkdir /tftproot
sudo chmod 777 /tftproot   

5:将生成的内核镜像zImage拷贝到/tftproot目录下

6:主机ip地址192.168.1.10,开发板地址为192.168.1.20

设置u-boot启动参数

#setenv bootcmd tftp 0xc0008000 zImage\;bootm 0xc0008000
#setenv bootargs "root=/dev/nfs nfsroot=192.168.1.10:/home/yangze/nfs_share ip=192.168.1.20:192.168.1.10:192.168.1.1:255.255.255.0:www.urbetter.com:eth0:off console=ttySAC0,115200"
#saveenv

实验结果

内核能够正常启动,但是缺少文件系统,所以没有太大意义。

OK


我根据下面的方法再修改一下u-boot的环境变量,使之能够在加载完内核镜像之后再挂载上nfs文件系统,具体做法如下:

事先准备:有已经成功在内核上挂载的NFS文件系统,并且开发板已经曾经成功挂载过。

1.在linux主机上正确配置NFS服务后,开启NFS服务。

2.在上面的实验之后,重启/复位开发板,进入u-boot命令行,输入

#setenv bootcmd tftp 0xc0008000 zImage\;nand read 0xc0208000 0x100000 0x3000000\;bootm 0xc0008000

#saveenv

重启/复位开发板,就能够正常启动内核了。并且启动之后会成功挂载NFS

***解释一下,这里首先设置了bootcmd环境变量

bootcmd环境变量用于设置启动时自动加载的命令序列,但该环境变量只有在设置了CONFIG_BOOTDELAY时才会生效,实际上 main_loop()函数只有在CONFIG_BOOTDELAY被定义且大于0时,才会对”bootcmd“进行解析(来自于http://blog.csdn.net/americanfllow/article/details/6867988)

开发板首先使用tftp协议将linux主机上准备的zImage文件下载到0xc0008000处。然后再挂载nfs

(这里不怎么懂,为什么nand read 就是加载nfs呢?0x100000内容处存了什么东西呢?以后懂了再补充,希望知道的人解答下,谢谢。)

注意:0xc0208000是一个起始地址,这个地址应该在kernel之后,我的kernel大小为1fe0a0,我在0xc0008000上加了0x200000。如果后面的起始地址和kernel程序空间有叠加的部分,后果当然是不能正常启动了。

你可能感兴趣的:(Linux)