启动redboot后,向目标机烧写一个linux内核的全过程

以下是06年初刚开始搞嵌入式开发时候晚上花了三个小时整理的。很多时候,人生的选择就是就像一条弯曲的隧道。当你没有进隧道时,前面的路弯弯曲曲但总有希望。当你走过隧道的时候,一些都成历史。大学毕业的时候,曾立志要做一个高级程序员。而且也成为本系(计算机系)260多人中,最早签约从事软件开发职业的人,且签约的软件公司也是一个纯技术上市公司控股的公司。几个软件主管均是硕士和博士,在国内的嵌入式行业有不小的影响力。当别人还在拿着一个月800元工资的时候,我的工资已经达到了1800元。毕业三个月后,很多朋友还在为找工作发愁,向家里人要找工作的经费的时候,我卡上的积蓄已经达到了3W多,可最后的却在别人一片诧异之中又最先放弃软件开发行业。

    也许我本身就是一个不安分的人,也许对未来我有太多的梦。也许这是我的悲哀,可是未来是什么样子,谁又能说的清呢。也许一个项目可以改变我的一生,也许一个好老板能够影响我的一生。

    闲来无事,翻腾自己的电脑,发现了当时自己的这些技术文档,发出来共享吧。有需求者取其精华吧!

命令说明

对一个没有内核和根文件系统的板子是不可以运转的,当通过一种方式下载了RedBoot引导程序以后,我们可以通过下面的方式下载内核和根文件系统。

在本系统中,我们对内核和根文件系统的下载是通过tftp服务完成的。

整个Flash空间是16M ,它的地址范围:0x50000000 – 0x50fe0000 ,共有128块,每一块的大小是128K 。0x50000000 – 0x50080000范围放的是RedBoot引导程序和各种配置,0x50080000 – 0x50200000范围放的是Linux内核zImage,0x50200000 – 0x50380000范围放的是根文件系统ramdisk,0x50380000 – 0x50f60000范围放的是jffs2文件格式。剩余0x50f60000---0x50fe0000范围的512K空间放日志系统.

   

以下过程为启动redboot后,向目标机烧写一个linux内核的全过程

 

先对flash进行初始化

RedBoot> fis init

About to initialize [format] FLASH image system - continue (y/n)? y

*** Initialize FLASH Image System

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000: .

对剩余的FLASH空间解除锁定

RedBoot> fis unlock -f 0x50080000 -l 0xf60000

... Unlock from 0x50080000-0x50fe0000: .........................................

................................................................................

..然后擦除

RedBoot> fis erase -f 0x50080000 -l 0xf60000

... Erase from 0x50080000-0x50fe0000: ..........................................

................................................................................

.显示FLASH分区信息

RedBoot> fis list

Name              FLASH addr  Mem addr    Length      Entry point

RedBoot           0x50000000  0x50000000  0x00060000  0x00000000

FIS directory     0x50060000  0x50060000  0x0001F000  0x00000000

RedBoot config    0x5007F000  0x5007F000  0x00001000  0x00000000

下面两步把内核zImage.H5500传送到目标板上,然后将其烧到flash的0x50080000地址中

RedBoot> load zImage.H5500 -b 0x2000000 -r -m tftp -h 192.168.9.190

Raw file loaded 0x02000000-0x0211e52b, assumed entry at 0x02000000

将其烧到flash的0x50080000地址中, zImage分配的空间为0x180000K

RedBoot> load zImage.H5500 -b 0x2000000 -r -m tftp -h 192.168.9.190

Raw file loaded 0x02000000-0x0211e52b, assumed entry at 0x02000000

RedBoot> fis create -b 0x2000000 -l 0x180000 -f 0x50080000 zImage

... Erase from 0x50080000-0x50200000: ............

... Program from 0x02000000-0x02180000 at 0x50080000: ............

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000:

将ramdisk.gz.H5500传送到目标板上,然后将其烧到flash的0x50020000地址中

RedBoot> load ramdisk.gz.H5500 -b 0x800000 -r -m tftp -h 192.168.9.190

Raw file loaded 0x00800000-0x0098a8df, assumed entry at 0x00800000

RedBoot> fis create -b 0x800000 -l 0x180000 -f 0x50200000 ramdisk

... Erase from 0x50200000-0x50380000: ............

... Program from 0x00800000-0x00980000 at 0x50200000: ............

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000: .

将jffs2.rescue.img传送到目标板上,然后将其烧到flash的0x50380000地址中

RedBoot> load jffs2.rescue.img -b 0x800000 -r -m tftp -h 192.168.9.190

Raw file loaded 0x00800000-0x00898c6b, assumed entry at 0x00800000

RedBoot> fis create -b 0x800000 -l 0xbe0000 -f 0x50380000 jffs2

... Erase from 0x50380000-0x50f60000: ..........................................

.....................................................

... Program from 0x00800000-0x013e0000 at 0x50380000: ..........................

.....................................................................

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000: .

RedBoot> fis list

Name              FLASH addr  Mem addr    Length      Entry point

RedBoot           0x50000000  0x50000000  0x00060000  0x00000000

FIS directory     0x50060000  0x50060000  0x0001F000  0x00000000

RedBoot config    0x5007F000  0x5007F000  0x00001000  0x00000000

zImage            0x50080000  0x50080000  0x00180000  0x02000000

ramdisk           0x50200000  0x50200000  0x00200000  0x00800000

jffs2             0x50380000  0x50380000  0x00be0000  0x00200000

fconfig,此命令是配置脚本命令

RedBoot> fconfig

Run script at boot: true

Boot script:

Enter script, terminate with empty line

>> fis unlock -f 0x50380000 -l 0xbe0000

>> fis load -b 0x2000000 zImage

>> fis load -b 0x800000 ramdisk

>> exec 0x2000000

>> 

Boot script timeout (1000ms resolution): 3

Use BOOTP for network configuration: true

Default server IP address: 192.168.0.43

Console baud rate: 115200

GDB connection port: 9000

Force console for special debug messages: false

Network debug at boot time: false

Default network device: npe_eth0

Network hardware address [MAC] for npe_eth0: 0x00:0x0F:0x0E:0x01:0x02:0x03

Update RedBoot non-volatile configuration - continue (y/n)? (出现此提示时,请输入y)

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000: .

显示FLASH被擦除但位被使用的空间

RedBoot> fis free

  0x50F60000 .. 0x50FDFFFF

到这里整个烧写过程结束。

RedBoot可以在多种不同配置下运行,但一般都是从目标平台的闪存引导区或引导ROM启动。RedBoot设计为系统上电启动,能提供完整的处理器初始化和设备设置,使设计人员能够迅速开始与系统通信。

出现 RedBoot>

后,就表明redboot已经准备好,用户可以开始输入命令。

RedBoot命令的基本格式是:

命令 [-选项1] [-选项2 参数值] 操作符

命令格式中的选项1和选项2代表可以加到某些命令中的可选参数,用于指示一些特定动作或附加信息,在选项2中还包括一个数值。操作符定义了某些特殊命令所需的附加信息。命令也可以缩写成最短的无歧义字符串,如dump、dum、du和d都是dump命令的有效写法。

RedBoot用load命令下载应用软件映像,映像可以用TFTP协议、X/Y调制解调器协议或直接从目标硬件下载。

RedBoot常用的几条命令

首先是闪存映像系统(fis)命令,当硬件平台上配有闪存时,RedBoot提供fis命令作为基本文件系统,这些命令主要用来管理文件系统映像。

另一个有用的命令是基于闪存的配置和控制命令fconfig。用fconfig命令查询的输出信息,配置命令可以设置RedBoot启动顺序。启动配置包括是否在初始化期间运行引导脚本、是否用BOOTP协议获取IP地址等等。

RedBoot支持引导脚本,因此允许用户在上电过程完成后执行所需命令。在产品测试阶段采用RedBoot装载应用软件映像时引导脚本很有好处,用户还可以设置超时参数,在引导脚本执行前按下Ctrl+C中断执行。引导脚本可用fconfig命令进行设置。

RedBoot命令介绍:

引用一个别名,如为joe的别名为This is Joe

RedBoot> alias joe "This is Joe"

设置IP,如改变SERVER IP为192.168.1.104

RedBoot> ip_address -h 192.168.1.104 

IP: 192.168.1.31, Default server: 192.168.1.104, DNS server IP: 192.168.1.101

Load命令:从宿主机下载程序到目标机详细用法在flash烧写过程中举例

Version : 显示RedBoot的版本,使用平台,内存和FLASH空间大小等等信息。

RedBoot > version

RedBoot(tm) bootstrap and debug environment [ROM]

Red Hat certified release, version 2.02 - built 21:47:00, Jun 19 2006

Platform: IXDP425 Development Platform (IXP42X 400MHz) BE

Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.

RAM: 0x00000000-0x08000000, [0x00029808-0x07fc1000] available

FLASH: 0x50000000 - 0x50fe0000, 127 blocks of 0x00020000 bytes each.

mfill : 用指定的方式向向存储器中写数据。

Mfill  {-b location} {-l length} {-p value} [-1 | -2| -4]

-b : 存储器中,被写入数据的起始地址。

-l :被写入数据的长度。

-p :被写入数据的内容。

RedBoot> x -b 00400000 -l 0x40

00061A80: FF FF FF FF FF FC FF FF  BF FF EF FF EF FF DF FF  |................|

00061A90: FF EF FF FF FF BF FF FD  FE FF F7 FF FF FF 5F FF  |.............._.|

00061AA0: FF 5F FF DF FF FF FF 6F  FC FF BB FF BF FF D7 FF  |._.....o........|

00061AB0: FF FF FF FB FF F7 FF FF  AF FF BE FF 7F FF FE FF  |................|

RedBoot> mfill -b 0x00400000 -l 0x40 -p 0x98765423

RedBoot> x -b 0x00400000 -l 0x40

00400000: 98 76 54 23 98 76 54 23  98 76 54 23 98 76 54 23  |.vT#.vT#.vT#.vT#|

00400010: 98 76 54 23 98 76 54 23  98 76 54 23 98 76 54 23  |.vT#.vT#.vT#.vT#|

00400020: 98 76 54 23 98 76 54 23  98 76 54 23 98 76 54 23  |.vT#.vT#.vT#.vT#|

00400030: 98 76 54 23 98 76 54 23  98 76 54 23 98 76 54 23  |.vT#.vT#.vT#.vT#|

Flash Image System(FIS)

如果在一个板子上有Flash存储器,RedBoot能够把image引导到Flash中。运行的对象,包括一些数据还有一些简单的文件也能够存放到Flash中。fis 这个命令能够被使用运行Flash中的内容。

fis init [-f]  :初始化(FIS),当RedBoot第一次在器件上安装的时候这个命令被运行。

-f :Flash的所有的块全部被檫除。

RedBoot> fis init –f

About to initialize [format] flash image system - are you sure (y/n)?n

fis [-c] [-d] list  :列出FIS 中一般的文件,一些能够以RedBoot的名字运行,另外一些能够被使用者执行。

                -c :image的ckecksum代替Mem Addr。

                -d :image的datalenggth代替length。

RedBoot> fis list

Name             flash addr Mem addr    Length       Entry point

RedBoot           0x50000000  0x50000000 0x00060000  0x00000000

FIS directory    0x50060000  0x50060000 0x0001F000  0x00000000

RedBoot config   0x5007F000  0x5007F000 0x00001000  0x00000000

RedBoot> fis list -c

Name             flash addr Checksum    Length       Entry point

RedBoot           0x50000000  0x00000000  0x00060000  0x00000000

FIS directory    0x50060000  0x00000000  0x0001F000  0x00000000

RedBoot config   0x5007F000  0x00000000  0x00001000  0x00000000

fis free  : 显示Flash中还有那些地址空间没有被使用,使用这个命令可以知道另外一些image下载的位置。

RedBoot> fis free

0x50080000 .. 0x50FDFFFF

fis create –b <mem_base> -l<length> [-f<flash_addr>] [-e<entry_point>] [-r<ram_addr>] [-s<data_lentf>] [-n] <name> : 在FIS 目录中创造一个image,image中的数据在拷贝之前必须存在在RAM存储器中。(首先,使用load命令把image下载到RAM中,然后运用fis create命令把他写入Flash中。)

        name :文件的名字,显示在FIS 目录中。

        -b :在RAM中的一个位置,为了得到image,这是一个必须的参数。

        -l :image的长度。如果image已经存在,那么它的长度被推断根据先前image被创造的时间。特殊的情况下,它可能和原来的初始化的数据是一样的。

-f :image在Flash中的位置。一般情况下,位置被确定根据现在的image所在的位置,如果在Flash还没有image的存在,那么剩余的块是足够的被使用。

-e :执行登陆的地址。如果image的开始地址不知道或者是不需要被考虑,-e被使用。

-r :当image通过fis load命令下载在RAM 中的位置。但是在这里要求这个image是给定的。

-s :被写入Flash数据的真实的长度,如果不能出现,那么image的长度是假定的,-s比-l给出的数据要短一些,

-n :仅仅更新FIS的目录,没有数据被拷贝从RAM到Flash中,这个特点能够被使用登陆FIS,如果它已经坏掉。

RedBoot >  fis create RedBoot -f 0x50000000 -b 0x07000000 -l 0x60000

An image named 'RedBoot' exists - continue (y/n)? n

RedBoot> fis unlock -f 0x50080000 -l 0x20000

... Unlock from 0x50080000-0x500a0000: .

RedBoot> fis erase -f 0x50080000 -l 0x20000

... Erase from 0x50080000-0x500a0000: .

RedBoot> fis create fuck -b 0x05000000 -l 0x20000

... Erase from 0x50080000-0x500a0000: .

... Program from 0x05000000-0x05020000 at 0x50080000: .

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000: .

RedBoot> fis list

Name              FLASH addr  Mem addr    Length      Entry point

RedBoot           0x50000000  0x50000000  0x00060000  0x00000000

FIS directory     0x50060000  0x50060000  0x0001F000  0x00000000

RedBoot config    0x5007F000  0x5007F000  0x00001000  0x00000000

fuck              0x50080000  0x05000000  0x00020000  0xFFFFFFFF

fis load [-b <memory load address>] [-c] [-d] name : 拷贝一个image从Flash到RAM。一旦被下载,它可能运用go命令执行。如果加上-b参数,image被拷贝从Flash到RAM 的指定的位置,如果不加上-b参数,image被拷贝从Flash到image被创造的地址。

-name :一个显示在FIS 目录中的文件名。

-b :存储器中,被写入数据的开始地址。

-c :下载到存储器之后计算并打印image数据的校验和。

-d :当拷贝image从Flash到RAM 时减压缩它。

RedBoot> fis load RedBoot

RedBoot> go

执行linux kernel

RedBoot> exec

fis delete name : 移出一个image从FIS 中,Flash一部分空间将要被檫除,而且移出映像的名字从Flash的目录中。

RedBoot> fis delete fuck

Delete image 'fuck' - continue (y/n)? y

... Erase from 0x50080000-0x500a0000: .

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000: .

fis lock –f <flash_addr> -l <length> :  写保护一部分Flash扇区,预防意外的重写image。为了对Flash进行一些更改,一个匹配的开启命令必须是有的,

RedBoot> fis lock -f 0x50090000 -l 0x20000

... Lock from 0x50080000-0x500b0000: ..

fis unlock –f <flash_addr> -l <length> : 开启一部分Flash扇区,允许这部分扇区被更新,这部分区域一定是被写保护过的。

RedBoot> fis unlock -f 0x50090000 -l 0x20000

... Unlock from 0x50090000-0x500b0000: ..

fis erase –f <flash_addr> -l <lenth> : 檫除一部分Flash扇区,没有被檫除的那部分Flash扇区是不能被下载image的。

RedBoot> fis erase –f 0x50090000 –l 0x20000

…Erase from 0x50090000 – 0x500b0000:..

fis write –b <location> -l <length> -f <flash_addr> : 向Flash中写数据从RAM指定的位置。

 使Flash的配置和控制处于持久稳定的状态

  

RedBoot规定Flash的操作支持在Flash存储器中的存储,存储多次的操作的内容和一些非易失性的信息,比如IP地址和一些网络的配置信息。

RedBoot第一次被引导到目标板,在平台上RedBoot支持的配置信息将被报告出现下面的信息:

Flash configuration checksum error or invalid key

如果没有Flash配置信息,这样的错误能够被忽视。或者能够通过运行fconfig命令来改正错误,还可以通过fis init命令来改变这个情况。

在不同Flash中,他们的控制和配置信息也是不一样的,然而配置和控制的命令是一样的,运行fconfig –l 命令,Flash中的信息能够被运行和改变。

-i :配置的数据库将要被从新设置。这需要第一次把RedBoot安装在目标板上,或者是更新一个新RedBoot运用不同的配置键。

-l :配置信息被简单的列举。每一个配置参数将被显示并且有一个机会去改变它。所有的数据能够被打印,将返回一些被改变的数据。布尔数学体系的值可能被输入用第一个字母代替。

如果一些配置被改变,从使用者那里得到确认以后,更新的数据将要被写回Flash。

-n :呢称是较短的比全名

-f : 全称被显示。

进入一个平台,假若呢称是一个较快的方式,那么使用的方法是:

RedBoot> fconfig nickname value

如果没有数据被支持,命令仅显示进入,如果一个数据被支持,输入将要被设计为哪个数据。如果一些数据改变,将被提示是否向Flash写一些新的信息。

RedBoot> fconfig -l -n

boot_script: true

boot_script_data:

.. fis unlock -f 0x50400000 -l 0xa00000

.. fis load -b 0x2000000 zImage

.. fis load -b 0x800000 ramdisk

.. exec 0x2000000

boot_script_timeout: 3

bootp: true

bootp_server_ip: 192.168.0.43

console_baud_rate: 115200

gdb_port: 9000

info_console_force: false

net_debug: false

net_device: npe_eth0

npe_eth0_esa: 0x00:0x0F:0x0E:0x01:0x02:0x03

RedBoot> fconfig bootp_server_ip 192.168.9.190

bootp_server_ip: Setting to 192.168.9.190

Update RedBoot non-volatile configuration - continue (y/n)?y

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000: .

  依靠被连接的终端的程序和它的实际能力,当使用默认的fconfig nickname 或者无格式的fconfig,你可能发现不能使用行编辑命令删除一些过去的值。

RedBoot> fco bootp

bootp: false

Update RedBoot non-volatile configuration - continue (y/n)? y

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000: .

RedBoot> fco bootp

bootp: true

Update RedBoot non-volatile configuration - continue (y/n)? y

... Unlock from 0x50060000-0x50080000: .

... Erase from 0x50060000-0x50080000: .

... Program from 0x07fe0000-0x08000000 at 0x50060000: .

... Lock from 0x50060000-0x50080000: .

在配置的数值中有一项总是出现,在导入的时间这一项能够执行脚本。当系统开始的时间,RedBoot的命令能够按次序输入被执行。通过控制平台使用者用普通的命令运行脚本。

在控制台输入的字符被明显的显示。一旦脚本被执行,控制台将显示命令执行返回的内容。

在一些目标板上,RedBoot被配置成在ROM或RAM上运行。所有的RedBoot配置将要执行boot脚本,一些特殊情况,RedBoot配置限定执行一定的脚本命令是我们想要的。运用预先考虑好的命令能够被完成上述的功能,为了启动哪个指定类型,借助RedBoot配置运行这些命令。

通过RedBoot执行程序

运用load或fis load命令把一个映像下载到内存中,对于映像执行可以是改变。

go :执行一个程序。

go [-w time] [-c] [-n] [location] : 在指定的位置开始执行。另外,登陆表明最后的映像将要被执行。

-w:开始执行前使用者等待的时间。当按下ctrl+c执行被终止。

-c:开启高速缓冲存储器,通常,执行go命令前高速缓冲存储器是关闭的。

-n:RedBoot支持安装一个网络设备驱动程序。在执行命令前,网络界面是不显示的。

exec :执行一个Linux内核映像。这个命令不是所有的平台都可以使用。这个命令被使用执行一个没有操作系统的应用程序,尤其像Linux内核。命令的执行要依靠一定的环境,比如MMU关闭,等等。

    [-w timeout]

    [-b <load addr> [-l <length>]]

    [-r <ramdisk addr>]

    [-s <ramdisk length>]

    [-c “kernel command line”] [<entry_point>]

Linux内核必须被下载到特定的内存位置,在RedBoot中心使用这些内存。不可能直接把内核下栽到哪个位置。

-b:内核被下载到内存中的位置,当运行exec命令开始前,映像将要被从新部署适当的位置。

-r,-s:内核传递的信息,一个静态的根文件系统被下载的位置。

-c:内核传递的原文命令行信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值