调了一天,nfs启动还是有问题,解决问题先从uboot开始
先看基本介绍
http://blog.csdn.net/torei135/article/details/4833968
1. uboot启动模式介绍
大多数 Boot Loader 都包含两种不同的操作模式:"启动加载"模式和"下载"模式,这种区别仅对于开发人
员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加
载模式与下载工作模式的区别。
启动加载(Boot loading)模式:这种模式也称为"自主"(Autonomous)模式。也即 Boot Loader 从目标机
上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 Boot
Loader 的正常工作模式,因此在嵌入式产品发布的时侯,Boot Loader 显然必须工作在这种模式下。
下载(Downloading)模式:在这种模式下,目标机上的 Boot Loader 将通过串口连接或网络连接等通信手
段从主机(Host)下载文件,比如:下载内核映像和根文件系统映像等。从主机下载的文件通常首先被 Boot
Loader 保存到目标机的 RAM 中,然后再被 BootLoader 写到目标机上的 FLASH 类固态存储设备中。Boot
Loader 的这种模式通常在第一次安装内核与根文件系统时被使用;此外,以后的系统更新也会使用 Boot
Loader 的这种工作模式。工作于这种模式下的 Boot Loader 通常都会向它的终端用户提供一个简单的命令
行接口。
UBoot 这样功能强大的 Boot Loader 同时支持这两种工作模式,而且允许用户在这两种工作模式之间进行切换。大多数 bootloader 都分为阶段 1(stage1)和阶段 2(stage2)两大部分,uboot 也不例外。依赖于 CPU 体系结构的代码(如 CPU 初始化代码等)通常都放在阶段 1 中且通常用汇编语言实现,而阶段 2 则通常用 C 语言来实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。
各种启动方式的配置:http://hi.baidu.com/shmily_soc/item/1bc09ef5f0901c0ac7dc4533
2. uboot 启动参数介绍
环 境 变 量 | 解 释 说 明 |
bootdelay | 定义执行自动启动的等候秒数 |
baudrate | 定义串口控制台的波特率 |
netmask | 定义以太网接口的掩码 |
ethaddr | 定义以太网接口的MAC地址 |
bootfile | 定义缺省的下载文件 |
bootargs | 定义传递给Linux内核的命令行参数 |
bootcmd | 定义自动启动时执行的几条命令 |
serverip | 定义tftp服务器端的IP地址 |
ipaddr | 定义本地的IP地址 |
stdin | 定义标准输入设备,一般是串口 |
stdout | 定义标准输出设备,一般是串口 |
stderr | 定义标准出错信息输出设备,一般是串口 |
Uboot> printenv
bootdelay=3
baudrate=115200
ethaddr=00:12:34:56:78:9a
ipaddr=192.168.0.9 ①
serverip=192.168.0.1 ②
netmask=255.255.255.0
rootpath=/home/zht/rfsys ③
stdin=serial
stdout=serial
stderr=serial
bootcmd=tftp 21000000 uImage;bootm 21000000 ④
bootargs=root=/dev/nfs rw nfsroot=192.168.0.1:/home/zht/rfsys nfsaddrs=192.168.0.48: 192.168.0.1:192.168.0.1:255.255.255.0 console=ttyS0,115200 mem=32M ⑤
① 设置目标板IP地址
② 设置服务器IP地址
③ 设置根文件系统在服务器上的路径,注意该路径一定要设定为服务器上的nfs目录。
④ bootcmd是u-boot启动后执行的命令,命令之间用分号分隔。
tftp 21000000 uImage 表示通过tftp 将内核映像下载到RAM中地址为0x21000000;
bootm 21000000 启动linux操作系统
⑤ 定义u-boot传送给linux内核的命令行参数,该命令行指定以网络文件系统作为根文件系统。
root=/dev/nfs并非真的设备,而是一个告诉内核要通过网络取得根文件系统。
nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
参数nfsroot这个参数告诉内核以哪一台机器的哪个目录以及哪个网络文件系统选项作为根文件系统使用。
<server-ip> 指定网络文件系统服务端的IP地址。如果没有指定定,则使用nfsaddrs变量指定的值。
<root-dir> 服务端上要作为根文件系统要挂载的目录名称。如果字串中有个‘%s’ 符记(token),此符记将代换为客户端互联网地址之 ASCII 表示法。
<nfs-options> 标准的网络文件系统选项,所有选项都以逗号分开。所有选项都以逗号分开。如果没有给定此选项栏位则使用下列的预设值:
port = as given by server portmap daemon
rsize = 1024
wsize = 1024
timeo = 7
retrans = 3
acregmin = 3
acregmax = 60
acdirmin = 30
acdirmax = 60
flags = hard, nointr, noposix, cto, ac
nfsaddrs=<my-ip>:<serv-ip>:<gw-ip>:<netmask>:<name>:<dev>:<auto>
参数nfsaddrs设定网络通讯所需的各种网络接口地址。
如果没有给定这个参数,则内核核会试著使用反向地址解析协议或是启动协议(BOOTP)以找出这些参数。
<my-ip> 客户端的IP地址。
<serv-ip> 网络文件系统服务端的IP地址。
<gw-ip> 网关(gateway)的IP地址。
<netmask> 本地网络的网络掩码。如果为空白,则掩码由客户端的IP地址导出。
<name> 客户端的名称。如果空白,则使用客户端IP地址的ASCII标记值。
<dev> 要使用的网络设备名称。如果你只有一个设备,那么你可以不管它。
<auto> 用以作为自动配置的方法。如果是 `rarp' 或是 `bootp' 则使用所指示的协议。如果此值为 `both' 或空白,若配置核心时有打开这两种协议则都使用。 `none' 表示不使用自动配置。这种情况下你必须指定前述栏位中所有必要的值。
详细说明参考: http://blog.chinaunix.net/uid-25002135-id-3039792.html http://www.cnblogs.com/cornflower/archive/2010/03/27/1698279.html
配置方法: http://blog.chinaunix.net/uid-25002135-id-3039792.html
3.uboot命令集
用“?”看自带帮助
1. Printenv 打印环境变量。
Uboot> printenv
2 . Setenv 设置新的变量
Uboot> setenv <key> <value>
3.Saveenv 保存变量
命令将当前定义的所有的变量及其值存入flash中。用来存储变量及其值的空间只有8k字节,应不要超过。
4 .Loadb 通过串口Kermit协议下载二进制数据。
5 .Tftp 通过网络下载程序,需要先设置好网络配置
Uboot> setenv ethaddr 12:34:56:78:9A:BC
Uboot> setenv ipaddr 192.168.1.1
Uboot> setenv serverip 192.168.1.254 (tftp服务器的地址)
下载bin文件到地址0x20000000处。
Uboot> tftp 20000000 application.bin (application.bin应位于tftp服务程序的目录)
Uboot> tftp 32000000 vmlinux
把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。
6 .Md 显示内存区的内容。
7 .Mm 修改内存,地址自动递增。
8.Nm 修改内存,地址不自动递增。
9 .Mw 用模型填充内存
10 .mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)
11. Cp 拷贝一块内存到另一块
12. Cmp 比较两块内存区
这些内存操作命令后都可加一个后缀表示操作数据的大小,比如cp.b表示按字节拷贝。
13 .Protect 写保护操作
protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护)
protect off 1:0-3取消写保护
14 .Erase 擦除扇区。
erase: 删除FLASH的扇区
erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)
对DataFlash的操作
U-Boot在引导时如果发现NPCS0和NPCS3上连有DataFlash,就会分配虚拟的地址给它,具体为 :
0xC0000000---NPCS0
0xD0000000---NPCS3
15 .run 执行设置好的脚本
Uboot> setenv flashit tftp 20000000 mycode.bin/; erase 10020000 1002FFFF/;
cp.b 20000000 10020000 8000
Uboot> saveenv
Uboot> run flashit
16.bootcmd 保留的环境变量,也是一种脚本
如果定义了该变量,在autoboot模式下,将会执行该脚本的内容。
17.Go 执行内存中的二进制代码,一个简单的跳转到指定地址
18.Bootm 执行内存中的二进制代码
要求二进制代码为制定格式的。通常为mkimage处理过的二进制文件。
起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000
19.Bootp 通过网络启动,需要提前设置好硬件地址。
20.? 得到所有命令列表
21.help
help usb, 列出USB功能的使用说明
22 . ping 注:只能开发板PING别的机器
23. usb
usb start: 起动usb 功能
usb info: 列出设备
usb scan: 扫描usb storage(u 盘)设备
24. kgo 起动没有压缩的linux内核
kgo 32000000
25 . fatls 列出DOS FAT文件系统
fatls usb 0列出第一块U盘中的文件
26 .fatload 读入FAT中的一个文件
fatload usb 0:0 32000000 aa.txt 把USB中的aa.txt 读到物理内存0x32000000处!
27. flinfo 列出flash的信息
28.nfs
nfs 32000000 192.168.0.2:aa.txt
把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。
看完这些终于发现之前的配置错误之处,决定重新配置