vxWorks嵌入式系统启动参数解析

boot程序的主要功能是引导vxworks 内核,所以boot程序需要知道vxworks的内核存放在何处,通过什么手段去获取。在vxworks缺省的boot程序里有一条内建的default boot line,它指明了获得vxworks内核的途径,在boot程序启动时,它先寻找NVRAM里面有无boot line,如没有,则等里的内容添入BOOT_PARAMS结构里,然后,启动程序和vxworks内核利用此结构寻找启动参数。

 

typedef struct   /* BOOT_PARAMS */
{
char bootDev [BOOT_DEV_LEN];    /* boot device code */
char hostName [BOOT_HOST_LEN];   /* name of host */
char targetName [BOOT_HOST_LEN];  /* name of target */
char ead [BOOT_ADDR_LEN];    /* ethernet internet addr */
char bad [BOOT_ADDR_LEN];    /* backplane internet addr */
char had [BOOT_ADDR_LEN];    /* host internet addr */
char gad [BOOT_ADDR_LEN];    /* gateway internet addr */
char bootFile [BOOT_FILE_LEN];    /* name of boot file */
char startupScript [BOOT_FILE_LEN];   /* name of startup script file */
char usr [BOOT_USR_LEN];     /* user name */
char passwd [BOOT_PASSWORD_LEN];   /* password */
char other [BOOT_OTHER_LEN];    /* available for applications */
int procNum;    /* processor number */
int unitNum;    /* network device unit number */
int flags;    /* configuration flags */
} BOOT_PARAMS;

 

下面看boot line结构:
bootDev(unitNum,procNum) hostname:bootFile e=ead b=bad h=had g=gad u=username pw=password f=flags tn=targetName s=startupScript o=other

bootDev     / 设备名,软盘:fd; 硬盘:ATA;网络要根据网卡的类型来做:NE2000及其兼容网卡为ENE,3COM以太网卡为ELT,Intel网卡为EEX,Intel82559网卡为fei ,3C905B PCI网卡为elPci。
unitNum     / 设备单元号,一般指为0
procnum     / cpu的处理器号,一般为0
flags       / 标识,十六进制数,意义如下:
                   0x01: 关闭对处理器0的系统控制
                   0x02: 将局部symbols和全局symbols装入目标机symbols表
                   0x04: 禁止自动启动(即由用户输入boot line)
                   0x08: 快速boot(不计数等待用户输入)
                   0x40: 使用BOOTP or DHCP client
                   0x80: 使用TFTP获取image,否则使用RSH或FTP,用FTP时pw不为空
          0x100: 使目标机登记为一个代理ARP client
ead         / 目标机ip地址,此值如为空,网络接口不被帮定
bad         / 背板接口
had         / 主机ip地址
gad         / 网关地址,如果主机和目标机不在一个局网里,需要
bootFile:   / 存放vxworks image的路径
usr:        / 使用FTP或RSH时的用户名
passwd:     / ftp password
other:      / 从网络启动时此值可为空,当从软盘或硬盘启动时,如果此值为你的网络设备,boot会为你绑定网络设备
hostname:   / 主机名,任意
targetName:/目标机名
startupScript: / 脚本名,在boot以后的target shell里执行 
 
在boot line中,e,b,h等等参数都不要求次序,你也可以让它为空值,如”pw= ”就是指口令为空参数,
看一个例子:
ene(0,0) lijun:c:/tornado/target/config/pc486/vxworks e="10".132.3.40 h="10".132.3.37 u="x86" pw="apue" tn="rod"
在上例中,网卡为NE2000及兼容网卡,主机名为lijun ,vxworks image存放在c:/tornado/target/config/pc486这个目录下,目标机的网络地址为10.132.3.40 主机的网络地址为10.132.3.37,通过FTP服务器下载,用户名为x86,口令为apue,目标机名为rod

再看一个例子:
fd="0",0(0,0) lijun:/fd0/vxWorks e="10".132.3.40 h="10".132.3.37 u="x86" o="ene"
这个例子里面,用的是软盘启动vxworks ,在软盘做好boot 后,还需要把vxworks image拷入软盘,在boot 起来以后,引导程序会在软盘里寻找vxworks,并把它启动。
软盘用fd0表示,硬盘用ATA(0,0),最后的参数o="ene" 表示网络设备是NE2000网卡,并将之和ip地址绑定。
 

上面是有关boot的一些总述。
在vxworks里面,针对每一种的bsp(什么叫bsp?参看本文上),都有各自的配置文件,在C:/Tornado/target/config/bspname/config.h里, 打开config文件,就会看到上面所说的 default_boot_line,接下来要做的就是根据你的情况修改此行参数,使之符合自己的要求。 在实时应用系统的开发调测阶段,往往采用以PC机作为目标机来调测程序。主机PC和目标机PC之间可采取串口或是网口进行联结。由于大多数目标已配有网卡,网络联结成为最简单快速的连接方式。下面是它的详细步骤:
1)、修改通用配置文件//Tornado/target/config/bspname/config.h.
     针对不同的网卡,其名称不同,如NE2000及其兼容网卡为ENE,3COM以太网卡为ELT,Intel网卡为EEX,Intel82559网卡为fei ,3C905B PCI网卡为elPci。(以3COM以太网卡为例)

2)、针对目标机的网卡,#define INCLUDE_ELT,同时 #undef 其它网卡
在config.h文件中修改相应网卡类型(如网卡为3COM网卡)的定义部分:
#define IO_ADRS_ELT 网卡I/O地址
#define INT_LVL_ELT 网卡中断号
 
3)、修改#define DEFAULT_BOOT_LINE的定义:
#elif (CPU_VARIANT == PENTIUM) (修改此行后的DEFAULT_BOOT_LINE)
#define DEFAULT_BOOT_LINE /
"elt(0,0)主机标识名:vxWorks h=主机IP e=目标机IP u=登录用户名 pw=口令 tn=目标机名" 
例如:#define DEFAULT_BOOT_LINE /
"elt(0,0)comps:VxWorks h="10".132.101.88 e="10".132.101.82 u="x86" pw="xxx" tn="x86""

 

 

 

上次讲过NI8106控制器如何从SATA磁盘启动VxWorks。但是,看来单是讲磁盘启动还不够,有同事按照里面讲的内容,直接修改bootline中的boot device,改成从磁盘启动。磁盘启动倒是成功了,但是他遇到了问题,原来(用网络引导时)直接使用主机上文件的功能没了。

其实要解决类似他这样的问题,需要两个东西:
1. 在启动参数(bootline/boot parameters)的other参数设置(非启动的)网络接口
2.  通过netDrv直接访问host文件

既然遇到问题了,就顺便把两个都解释一下。

先说bootline。干脆给个bootline的完整解释。

bootline其实是boot loader parameters的紧凑写法。完整的bootline格式如下:
dev(unitnum,procnum)host:/file h=# e=# b=# g=# u=usr [pw=passwd] f=# tn=targetname s=script o=other
bootline的例子:
ln(0,0)mars:c:\tmp\vxWorks e=90.0.0.50 h=90.0.0.1 u=fred pw=secret
对应(分解)的boot loader parameters例子如下:
boot device : ln
unit number : 0
processor number : 0
host name : mars
file name : c:\tmp\vxWorks
inet on ethernet (e) : 90.0.0.50:ffffff00
inet on backplane (b) :
host inet (h) : 90.0.0.1
gateway inet (g) :
user (u) : fred
ftp password (pw)(blank=use rsh) :secret
flags (f) : 0x0
target name (tn) : phobos
startup script (s) :
other (o) :

下面解释一下bootline各个参数的含义。

boot device
    引导设备的类型。必须是boot loader已包含的驱动程序名。boot loader shell中使用devs或者h命令可显示可用设备列表。
    引导设备通常是网卡、软盘、硬盘等。
      网卡直接写驱动程序的名,比如ln、gei、enp等;
      对于ATA硬盘,要写ata=controllerNum, driveNum(如ata=0,0)的格式;
      对于SCSI硬盘,要写scsi=id,lun的格式;
      对于软盘,要写fd=controllerNum, driveNum的格式;

unit number
      具体引导设备的设备号,第一个设备的编号是0。

processor number
      底板上有多个目标系统时,启动的目标的处理器号。底板控制器的处理器号必须设为0。

host name
      用于引导的主机系统名。它只是引导起来的VxWorks中用来标识主机的名字(比如代码中用这个名字调用hostGetByName就能得到主机的地址),不一定就是主机自己(在网络中)使用的名字。

file name
      要引导的VxWorks image的完整路径。使用target server时,这个名字被返回给主机,通常主机用它来定位image在主机上的位置。最长160字节,包括结尾空字符。

inet on ethernet (e)
      被引导目标系统以太网接口的IP地址及子网掩码。IP地址用‘.’分隔的十进制数,后面跟16进制的子网掩码。网络引导时,这个是我们(被引导机器)自己的地址。

inet on backplane (b)
      被引导目标系统底板网络接口的IP地址。对于一般的环境,我们没有这个东西。

host inet (h)
      用于引导的主机系统的IP地址。网络引导时,这个是引导服务器(比如ftp服务器)的地址。

gateway inet (g)
      如果被引导目标和主机不在一个物理网络,需要路由器,这是路由器地址。

user (u)
      从主机装载VxWorks image文件时用于访问主机的用户ID,这个用户必须具有VxWorks image文件的“读”权限。

ftp password (pw)
      对应上述用户ID的密码。通过FTP或者TFTP访问文件时,必须有密码,如果密码为空,将使用UNIX rsh协议访问主机。

flags (f)
      一些标志位的集合,每个标志代表一个特殊的选项。这些标志定义如下:
0x01 = 即使processor number为0,也不要激活系统控制器。(这个其实是有使用的板子解释的,所以应参考目标板子的资料)
0x02 = 载入所有VxWorks符号表,而不只是全局部分。
0x04 = 不要自动引导
0x08 = 快速自动引导,也就是自动引导前等的时间短一些。
0x20 = 禁用安全登录。
0x80 = 用TFTP(而不是FTP)来引导。
0x400 = 调试模式。

target name (tn)
      目标系统的名字,这个名字会被加入host table,所以代码中用这个名字调用hostGetByName就能得到目标系统自己的名字。

startup script (s)
      启动脚本。如果引导的VxWorks image包含kernel shell,系统引导后,这个参数指定的路径和文件名会被传递给kernel shell执行。启动脚本中,只能包含shell的C命令。注意kernel shell和boot loader shell互相有冲突。(如果系统配置好了,这个脚本也可以用来RTP应用。)

other (o)
      这个参数通常没有什么用,由应用程序来解释。但是,当我们不从网络引导又需要激活网络时,这个参数就非常重要了,它被用来指定默认的网络接口。跟boot device参数一样,我们仍然使用驱动程序的名字来标识设备。
      比如,如下的bootline,
ata=0,0(0,0)mars:/ata0a/vxWorks h=192.168.86.185 e=192.168.86.92 u=fred pw=secret tn=vx66 o=gei
      可从第一个ATA硬盘引导,并且激活(第一个)gei网络端口,同时设置本机(gei端口)的IP地址为“192.168.86.92”,本机名字叫“vx66”,服务器(主机)的IP地址为“192.168.86.185”,名字为“mars”。
      这样设置之后,网络可以像从网络启动一样的使用。

      除了上面的bootline之外,要(想像使用本地文件一样)直接使用远程(主机)文件,还需要netDrv。在VxWorks内核工程中,设置 INCLUDE_NET_DRV  后可以使用netDrv。netDrv通常通过ftp或者rsh在主机(host)和目标机器(target,即VxWorks机器)之前传递文件。
      VxWorks引导程序(bootloader)从网络启动时,就是使用bootline中的参数创建了一个netDrv实例来下载run-time image。具体参见源码文件usrNetwork.c中的usrNetInit()。
    如果VxWorks内核参数设置了 INCLUDE_NET_DRV,并且像前面那样在bootline指定了网络接口,那么从硬盘启动后,照样可以直接使用远程(主机上的)文件。关于netDrv的详细信息,可参见VxWorks文档,这里只是给个索引,我想已经足够了。


 

你可能感兴趣的:(网络,image,FTP服务器,嵌入式,Parameters,internet)