您的位置:首页 > 编程语言 > PHP开发

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

2013-10-24 00:23 453 查看
本文摘自: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程序空间有叠加的部分,后果当然是不能正常启动了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐