转自:http://bbs.elecfans.com/jishu_455028_1_1.html


如6410的bootcmd和bootargs默认存在于uboot1.1.6/include/configs/smdk6410.h

the older version's of u-boot used boot.scr to set boot parameter

setenv bootargs 'console=ttyS2,115200n8 root=/dev/mmcblk0p2 rw rootfstype=ext3 rootwait omapfb.mode=dvi:1280x1024MR-32 at 60 vram=12M' setenv bootcmd 'mmc init; fatload mmc 0 80000000 uImage; bootm 80000000'

boot

Newer version's of u-boot now look for a uEnv.txt file to set boot parameter

mpurate=
dvimode=800x600MR-@
vram=4MB
bootargs "console=ttyS2,115200n8 root=/dev/mmcblk0p2 rootwait ro
vram=${vram} omapfb.mode=dvi:${dvimode} omapfb.vram=:2M,:2M mem=208M@0x80000000"
boot

By default, the frame buffer is only allocated for /dev/fb0. Option vram should be specified in u-boot bootargs variable to allocate frame buffer for /dev/fb1. For example:   vram=8M omapfb.vram=4M,4M

---------------------------------------------------------------------------------------------------------------------------------------------

1.bootcmd和bootargs

通过串口连接BeagleBone Black,参见http://elinux.org/Beagleboard:Terminal_Shells
启动到U-Boot的时候,会看到

Hit any key to stop autoboot:

按下任意键则放弃自动引导,从而进入了U-Boot的命令行, 在这里你可以手动进行接下来系统的引导。

下面来了解U-Boot是如何引导系统的。


在U-Boot的官网手册中看到了2个关键的环境变量和1个命令。
bootcmd: This variable defines a command string that is automatically executed 
         when the initial countdown is not interrupted.
         This command is only executed when the variable bootdelay is also defined!
bootargs: The contents of this variable are passed to the Linux kernel as boot 
          arguments (aka "command line").

run    - run commands in an environment variable


bootcmd中的命令就是出现“Hit any key to stop autoboot”提示后,不按任意键,会自动运行的命令。
bootargs是传递给Linux内核的参数。
run是运行环境变量中的命令,bootcmd中包含run命令。

所以分析引导过程要从bootcmd开始。
在U-Boot的命令行中输入printenv可显示所有的环境变量,我已经把相关的粘贴到了下面。
为方便阅读我添加了换行。

bootcmd=
run findfdt;
run mmcboot;
setenv mmcdev ;
setenv bootpart :;
run mmcboot;
run nandboot;

下面就分别从bootcmd内容说起:

2.1.findfdt

首先是运行findfdt中的命令,目的是通过board_name来设置fdtfile,结果是fdtfile的值为am335x-boneblack.dtb

findfdt=
if test $board_name = A335BONE;
then
setenv fdtfile am335x-bone.dtb;
fi;
if test $board_name = A335BNLT;
then
setenv fdtfile am335x-boneblack.dtb;
fi;
if test $board_name = A33515BB;
then
setenv fdtfile am335x-evm.dtb;
fi;
if test $board_name = A335X_SK;
then
setenv fdtfile am335x-evmsk.dtb;
fi;
if test $fdtfile = undefined;
then
echo WARNING: Could not determine device tree to use;
fi;
board_name=A335BNLT

2.2.mmcboot

"mmc dev 0"是将设备切换到0,通常有2个设备一个是SD卡,一个是eMMC

mmcboot=
mmc dev ${mmcdev};
if mmc rescan;
then
echo SD/MMC found on device ${mmcdev};
if run loadbootenv;
then
echo Loaded environment from ${bootenv};
run importbootenv;
fi;
if test -n $uenvcmd;
then
echo Running uenvcmd ...;
run uenvcmd;
fi;
if run loadimage;
then
run mmcloados;
fi;
fi;
mmcdev=

2.2.1.loadbootenv

这应该是从设备0的第1个分区装载uEnv.txt到地址0x80200000。
当默认的环境变量不符合要求时,可以用uEnv.txt设置新的环境变量。没有它也可以,先不用管,后面说。

loadbootenv=load mmc ${mmcdev} ${loadaddr} ${bootenv}
loadaddr=0x80200000
bootenv=uEnv.txt

2.2.2.importbootenv

这是把uEnv.txt中的环境变量导入到U-Boot的环境变量中。“filesize”没有指定。

importbootenv=echo Importing environment from mmc ...; env import -t $loadaddr $filesize

由于我没有“uenvcmd”这个环境变量,所以那个条件语句中的内容没有执行。我记着Arch Linux好像用了那个,那个变量应该在uEnv.txt中。

2.2.3.loadimage

于是直接到了loadimage,这里和载入uEnv.txt是相似的,“0:2”的意思是设备0的第2个分区,而载入uEnv.txt时没有指定分区,就默认第1分区了。
loadimage目的是将Linux内核载入内存。

loadimage=load mmc ${bootpart} ${loadaddr} ${bootdir}/${bootfile}
bootpart=:
bootdir=/boot
bootfile=zImage

2.2.4.mmcloados

mmcloados=
run mmcargs;
if test ${boot_fdt} = yes || test ${boot_fdt} = try;
then
if run loadfdt;
then
bootz ${loadaddr} - ${fdtaddr};
else
if test ${boot_fdt} = try;
then
bootz;
else
echo WARN: Cannot load the DT;
fi;
fi;
else
bootz;
fi;

2.2.5.mmcargs

这个就是设置bootargs这一个环境变量而已,用于向内核传递参数。

mmcargs=setenv bootargs console=${console} ${optargs} root=${mmcroot} rootfstype=${mmcrootfstype}
console=ttyO0,115200n8
mmcroot=/dev/mmcblk0p2 ro
mmcrootfstype=ext4 rootwait

之前载入了Linux内核,这里载入了设备树文件。
最后通过bootz后接2个地址就启动了系统。

boot_fdt=try
loadfdt
=load mmc ${bootpart} ${fdtaddr} ${bootdir}/${fdtfile}
fdtaddr=0x80F80000

3.总结如下

这是默认环境变量的行为。而我们的系统可能与其不同。这就要修改环境变量。
我知道有2种方式,一种是在U-Boot的命令行中通过命令修改,另一种就是通过uEnv.txt了。

  • uboot命令方式
mmc dev ;
load mmc : 0x80200000 /boot/zImage
setenv bootargs concole=ttyO0,115200n8 root=mmcroot=/dev/mmcblk0p2 ro rootfstype=ext4 rootwait
load mmc : 0x80F80000 /boot/am335x-boneblack.dtb
bootz 0x80200000 - 0x80F80000
  • uEnv.txt方式

这里介绍uEnv.txt的方式。先列出我uEnv.txt的内容,不用详细看,看我下面的说明。

bootfile=uImage
loadfdt=load mmc ${bootpart} ${fdtaddr} ${bootdir}/dts/${fdtfile}
mmcloados=run mmcargs;
if test ${boot_fdt} = yes || test ${boot_fdt} =try;
then
if run loadfdt;
then
bootm ${loadaddr} - ${fdtaddr};
else if test ${boot_fdt} = try;
then
bootz;
else
echo WARN: Cannot load the DT;
fi;
fi;
else
bootz;
fi;
mmcroot=/dev/mmcblk0p2 rw
mmcargs=setenv bootargs console=${console} ${optargs} root=${mmcroot} rootfstype=${mmcrootfstype} init=/usr/lib/systemd/systemd

一共6行,最后一行空白。
bootfile: 修改了内核名字,
loadfdt: 中只是在目录中加了“dts/”,
mmcloados: 主要是把bootz改成bootm。
mmcroot: 把只读改成了读写。
mmcargs: 只是在后面指定了init为systemd,也有其他方法,如init为指向systemd的软链接。

这里是从设备0启动系统,怎样知道自己的系统位于哪个设备呢,也许有某种约定,比如如果有SD卡,那么SD卡是0。
我不知道的话,可以在U-Boot的命令行中通过命令判断。如,

U-Boot# mmc list
OMAP SD
/MMC: 0
OMAP SD/MMC: 1

列出mmc设备:

U-Boot# mmc dev
mmc0 is current device

显示当前是那个设备:

U-Boot# mmc part
Partition Map for MMC device -- Partition Type: DOS
Part Start Sector Num Sectors UUID Type
29942d7e- 0c Boot
29942d7e-

显示当前设备的分区信息:

U-Boot# ls mmc 0:1
mlo
u-boot.img
uenv.txt
file(s), dir(s)

列出设备0第1个分区“/”目录的文件,我没有指定,默认为“/”。

附录:printenv内容

OpenJTAG> printenv
bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0
bootdelay=
baudrate=
ethaddr=::3e::0a:5b
netmask=255.255.255.0
mtdids=nand0=nandflash0
mtdparts=mtdparts=nandflash0:256k@(bootloader),128k(params),2m(kernel),-(root)
ipaddr=192.168.1.66 //开发板ip地址

bootargs
=root=/dev/nfs rw nfsroot=192.168.1.88:/home/book/Videos/rootfs/ ip=192.168.1.66 console=ttySAC0 mem=64M //uboot中nfs文件系统参数192.168.1.88ubuntu系统ip地址
serverip=192.168.1.100 //xp中的ip地址 stdin=serial
stdout=serial
stderr=serial
partition=nand0,
mtddevnum=
mtddevname=bootloader

[uboot]uboot如何引导系统的更多相关文章

  1. UEFI引导系统

    UEFI引导系统 1 2 3 4 5 6 7 分步阅读 现在的电脑大多数使用了UEFI引导系统(原来都是使用BIOS),从而加快启动速度,但同时也给用惯BIOS的用户带来很多困惑!为啥电脑不能识别制作 ...

  2. Nero8刻录引导系统光盘镜像图文教程

    刻录可引导的Windows系统光盘一直是电脑使用者较为需要的,今天,倡萌抽空写了这篇图文教程,希望对于菜鸟级的朋友有所帮助,大虾请飘过.本教程以最为强大的刻录软件Nero 8做为工具(其他版本的Ner ...

  3. linux引导系统

    一.linux引导系统 1.选择操作系统 /etc/grub.conf 设置grub引导装载程序口令,使用单用户模式时必须输入此密码 password --md5 md5后的密码字符串(可以通过gru ...

  4. grub覆盖mbr引导系统

    grub覆盖mbr引导系统 0.个人PC,WIN 7 + Kali,easybcd 不起作用,需要制作 kali 安装盘 PS:推荐使用 universal usb installer 制作. 方案一 ...

  5. Linux 服务器 U盘安装(避免U盘启动)以及拔除U盘后无法引导系统

    一.U盘制作 首先下载两个文件: ·         rhel-server-6.3-i386-boot.iso    启动镜像 ·         rhel-server-6.3-i386-dvd. ...

  6. 关于grub修复引导系统

    这周末遇到停电,机房的一台数据服务器启动不了,开机硬件自检以后,就停留在一个黑屏状态左上角有光标闪烁,却一直进入不了系统. 还好手里有centos6.5的系统盘,进入修复选项,具体进入修复请参照这里 ...

  7. [uboot]uboot中run的一些command在源码位置

    如在uEnv.txt中, loadfdt=fatload mmc ${mmcdev}: ${fdtaddr} ${fdtfile} fdtboot=run mmc_args; bootz ${load ...

  8. Maxdos 9.3不能引导系统进入Maxdos

    一.故障描述 最近安装一台新电脑安装的系统版本是windows7_professional_with_sp1_x64,安装完成后想用Maxdos对系统进行备份.出现错误:Warning: the hi ...

  9. Native Boot 从一个 VHD 引导系统的相关说明

    Native Boot 是 Windows 7 和 Windows Server 2008 R2 提供的一个新的功能,它允许从一个 VHD 文件引导一个操作系统,但是需要注意的是目前的 Windows ...

随机推荐

  1. HTML5-IOS WEB APP应用程序(IOS META)

    触摸屏网站的开发其实现在来讲比前几年移动端网站开发好多了,触摸屏设备IOS.Android.BBOS6等系统自带浏览器均为WEBKIT核心,这就说明PC上面尚未立行的HTML5 CSS3能够运用在这里 ...

  2. Cognos TM1_10.1.1服务端配置

    场景:本文继Cognos TM1_10.1.1服务端安装 之后,简单的说一下本人对简单配置的拙见,确保服务端在安装过程一切正常,成功安装. 1:进入TM的Cognos Configuration 2: ...

  3. [Grunt + AngularJS] Using ng-annotate for min-safe AngularJS

    When you minify your code with a tool like Uglify, the resulting minified file will rename variables ...

  4. 安装 ibm-java-x86_64-sdk-6.0-9.3.x86_64.rpm 的三步骤

    yum install libstdc++-devel.x86_64 yum install compat-libstdc++-33.x86_64 rpm -ivh ibm-java-x86_64-s ...

  5. Grunt的配置及使用(压缩合并js/css)

    Grunt的配置及使用(压缩合并js/css) 安装 前提是你已经安装了nodejs和npm. 你能够在 nodejs.org 下载安装包安装.也能够通过包管理器(比方在 Mac 上用 homebre ...

  6. POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题

    题意:给出一个序列,求出每连续k个数字中最大的数和最小的数. 这是道单调队列裸题,直接写就行了. 本来用deque写出来后,发现在poj上硬是超时了,在discuss上看很多人也在抱怨超时的问题,据说 ...

  7. installshield12如何改变默认安装目录

    installshield12如何改变默认安装目录 androidstudio添加其他项目中的module androidrecyclerviewonBindViewHolder [RealSense ...

  8. 【十二】注入框架RoboGuice使用:(Your First Injected ContentProvider)

    上一篇我们简单的介绍了一下RoboGuice的使用([十一]注入框架RoboGuice使用:(Your First Injection into a Custom View class)),今天我们来 ...

  9. Java之JVM调优案例分析与实战(2) - 集群间同步导致的内存溢出

    环境:一个基于B/S的MIS系统,硬件为两台2个CPU.8GB内存的HP小型机,服务器是WebLogic 9.2,每台机器启动了3个WebLogic实例,构成一个6个节点的亲合式集群. 说明:由于是亲 ...

  10. 转:Socket常用选项

    功能描述 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时,选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的值指 ...