作者:围补

本来启动方式这节不是什么复杂的事儿,不过想简单的说清楚明白,还真是不知道怎么组织。毕竟文字跟有声语言表达有别。但愿简单的东西别让我讲的太复杂!

Arm板系统文件一般有三个——bootloader(uboot)、kernel(uImage)及根文件系统(rootfs)。在arm板上电后,按uboot->kernel->rootfs的顺序依次启动。由于开发板上有多种存储介质,三个文件可以放在任何可以存储的介质上,因此也就导致文件的多种启动方式。本文就来讨论,以上三个文件对应不通存放位置的不同启动配置。

一般开发板上会有flash(Nor or NAND),mmc,emmc,sd卡等。系统文件可以烧写在其中的任意一种上,因此也就对应不通的启动。在开发过程中,有时经常需要改动内核,或者修改应用程序,如果每次都修改后都重新烧写到板上的存储介质,会比较麻烦。因此,为方便调试,uImage和rootfs还可以从网络启动,即nfs启动。但uboot只能从板上介质启动。

启动过程其实是先将要启动的文件从存储位置拷贝到内存空间,再在内存中运行。因此所谓不同位置启动,也就是从不同位置拷贝而已。

下面我们以开发板启动为例,分别介绍三个文件从不同位置启动的过程方法。我使用的开发板上有emmc和两个sd卡。我们按照启动顺序,依次介绍。

首先是uboot启动。Uboot是三个系统文件中第一个启动的,对它的拷贝工作由cpu中的固件决定。固件中支持从几个位置拷贝uboot,它就能存放在几个位置上。至于每次启动具体从其中的哪里开始,硬件拨码开关决定,对应拨码在开发板手册上能查到。启动之前,先将uboot的二进制文件拷贝到对应介质。有两种不同方法烧写,如下:

1.               uboot二进制文件拷贝到emmc,是通过芯片供应商的下载工具软件烧写完成;

2.               拷贝到sd卡是在linux下,通过dd命令完成的。

烧写完成后,将启动拨码拨到对应位置即可启动uboot。

然后介绍kernel文件(uImange)和rootfs的启动。如上所述,uImage和rootfs可以从emmc、sd卡或nfs拷贝到内核启动。具体的启动位置由uboot中的参数传递的内容决定。这些参数的内容在uboot中有写死的值,也可以在uboot启动阶段进入到命令输入界面,修改这些参数的值,来改变启动位置。(作者:围补)

进入uboot命令界面后,输入如下一段命令,修改启动参数,并重启。

setenv loadaddr 0x10800000

setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200'

setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp'

setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'

setenv bootcmd 'run bootcmd_mmc'

saveenv

run bootcmd

命令输入完后,重启开发板,即可按照上述命令中设置的参数来启动系统。

下面我们来分析一下uboot阶段输入的启动参数的意义,以便读者自己修改相关内容,让板子从自己需要的位置启动。

首先介绍几个命令。是在上面看到最多的setenv命令,该命令使用来设置或删除某个环境变量的。当setenv后面只带一个参数,该参数必须为已有的变量名,输入命令回车后该变量即被删除;当setenv后面有多个参数,将把其后第一个参数作为环境变量,后面其他参数作为该变量的值或内容。

第二个要解释的命令mmc。在uboot命令界面中敲入mmc,回车,能够看到其多个用法:

Usage: 
mmc read addr blk# cnt 
mmc write addr blk# cnt 
mmc erase blk# cnt 
mmc rescan 
mmc part - lists available partition on currentmmc device 
mmc dev [dev] [part] - show or set current mmcdevice [partition] 
mmc bootpart [dev] [part] - show or set bootpartition 
mmc list - lists available devices

解释一下其中几个用法:

mmc read addr blk# cnt 用来将硬盘(emmc/sd)中的内容读取到内存中。其中addr指内存中的目标位置起始地址,blk#指被拷贝内容起始存储块的块号,cnt指要被拷贝的块数。一般每个块的大小为512byte。

mmc dev [dev] [part] - show or set current mmc device [partition] 显示或设置当前设备。命令mmc dev即为显示当前是哪个device;mmc dev #意为设置“#”为当前设备。

第三个命令saveenv是保存环境变量的意思。环境变量设置后,使用该指令保存,下次重启时会按照上次保存的设置启动,就不用再次设置了。

最后,run命令比较明显,“运行”的意思。一般加在某内容为可执行命令的变量前。

再来说明一下变量。在上述参数设置命令中,参数bootargs和bootcmd是uboot的参数,其功能和名称不能被改变,其他都是用户自定义的变量,可以改变其名称。其中bootargs代表由uboot传给内核的参数;bootcmd是uboot启动时,系统自动加载的命令序列。如果设置了启动参数后,想让系统下次自动按照本次设置的方式启动,则一定要把拷贝和启动内核的语句设置为bootcmd的值,否则下次启动无法自动加载并启动内核。(作者围补)

介绍完重要的命令及uboot环境变量后,我们再来看上面的启动参数设置命令行:

setenv loadaddr 0x10800000

setenv bootargs_base 'setenv bootargsconsole=ttymxc0,115200'

setenv bootargs_mmc 'setenv bootargs${bootargs} root=/dev/mmcblk0p1 rootwait rwvideo=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp'

setenv bootcmd_mmc 'run bootargs_basebootargs_mmc;mmc dev 1;mmc read ${loadaddr} 0x800 0x2000;bootm'

setenv bootcmd 'run bootcmd_mmc'

saveenv

run bootcmd

按照上面对命令和参数的讲解,做一些变量的替换之后,可以看到,此处只做了两件事,一是设置环境变量bootargs的值,二是设置bootcmd的值,并保存。其中bootargs的值传递给内核,用来初始化一些设备和启动rootfs;bootcmd的值用来启动内核,即自动加载的命令序列。(最后一句run bootcmd是启动,不再是设置命令了。)

对上述命令中,采用如此多自定义变量的原因是,有些调试工具命令行输入不能过长,因此用中间自定义变量缩短一次性输入的命令行长度。我们将不必要的自定义变量做替换掉,然后来分析其内容。

setenv bootargs console=ttymxc0,115200root=/dev/mmcblk0p1 rootwait rw video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666 video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24ip=dhcp

setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm'

saveenv

run bootcmd

将自定义变量替代掉后,能看到,参数设置其实就是做了对两个系统环境变量赋值的工作。下面具体分析各变量值得内容。

对bootargs的赋值,对要是跟rootfs启动相关。内容是一个很大的字符串,不同项之间由空格隔开,也可以把由空格隔开的多项看做是多个参数。

第一项是console=ttymxc0,115200是选择操作台,并设置波特率。

中间几项root=/dev/mmcblk0p1 rootwait rw,是对rootfs启动位置设置root=/dev/mmcblk0p1是指从设备mmcblk0的p1分区挂载rootfs。那么mmcblk0到底是哪个设备呢?由于文件系统的挂载是在kernel启动后进行的,而内核启动后会安装linux的分配方式给现有设备分配名称,因此可对应区分设备。我使用的开发板上,emmc即为mmcblk0设备,sd安装挂载顺序依次后排。如果多个卡槽在系统启动前都插上了sd卡,系统会安装sd卡槽所在接口号依次分配设备名称号。比如,两个sd卡槽,slot2和slot3(对应总线号),只插一个sd开始,无论在哪个槽都是mmcblk1;但两个都插上sd时,在slot2中的是mmcblk1,slot3中的则是mmcblk2。Ok,至此,从哪个设备挂载rootfs已经很清楚了。后面两个参数,rw是声明启动权限,即以读写方式启动;rootwait是指等待设备/dev/mmcblk0p1设备就绪后才尝试挂载rootfs。如果没有此参数,linux内核启动时可能会在存储设备尚未就绪是就尝试挂载rootfs,此时肯定挂载失败,那么启动也就失败了。

最后的几个参数,video=mxcfb1:dev=ldb,LDB-XGA,if=RGB666video=mxcfb0:dev=hdmi,1920x1080M@60,if=RGB24 ip=dhcp,是做一些设备初始化的,主要是对视频设备和网络,对不需要视频设备的嵌入式系统可以不设置此项,ip也可以单独设置。

然后是第二个环境变量bootcmd的设置,主要跟kernel启动相关。

setenv bootcmd 'mmc dev 1;mmc read0x10800000 0x800 0x2000;bootm'

设置bootcmd内容为命令序列,用用单引号包围,命令间由分号分隔。

按照上面对mmc命令的讲解,第一个命令mmc dev 1,意思是将dev 1设置为当前设备。这里就是uImage启动(拷贝)的位置。在我使用的开发板上,dev 1指放在卡槽slot2中的sd卡。此处由于linux内核没有启动,设备名称不能按照linux分配方式确定。在我使用的开发板上,dev 2是放在卡槽slot3中的sd卡,dev3是emmc。对此句做相应修改,即可更改内核启动位置。

mmc read 0x10800000 0x800 0x2000这句大家也应该可以明白意思了,即将存储设备上从块号0x800开始的0x2000个存储块的东西拷贝到内存0x10800000开始的空间内。

bootm也是uboot命令,用于加载uboot能辨认的操作系统映像。

以上,已经讲完在uboot阶段修改启动参数,进而更改启动位置的命令的含义,读者可对应修改,是系统各文件从相应位置启动。另外nfs部分,有时间在加进入。

此处仅作个人总结,入对您有所帮助无上荣幸!——作者围补

U-Boot启动阶段修改启动参数方法及分析相关推荐

  1. springboot脚本启动bat_SpringBoot修改JVM参数(内置Tomcat命令行启动和IDEA工具配置修改)...

    命令行启动:(java [-options] -jar jarfile [args...]) 在 "-jar" 之前加上相应参数即可 java -Xms512m -Xmx512m ...

  2. debian启动mysql_debian 修改启动服务器

    添加 Ubuntu/Debian 到 RHEL/CentOS 7的 PXE 网络启动环境 添加 Ubuntu/Debian 到 RHEL/CentOS 7的 PXE 网络启动环境 本教程将指引你添加U ...

  3. android uboot启动过程,Android启动流程简析(一)

    最近一时兴起,想对Android的启动流程进行一次分析,经过一番整理,从以下几个方面进行总结,代码部分只讨论思路,不论细节. Android架构介绍 Android启动概述 BootLoader介绍 ...

  4. [转]MySQL修改时区的方法小结

    本文转自:https://www.cnblogs.com/mracale/p/6064447.html 这篇文章主要介绍了MySQL修改时区的方法,总结分析了三种常见的MySQL时区修改技巧,包括命令 ...

  5. installer启动类型是灰色_联想电脑BIOS下引导方式无法修改或BOOT MODE选项为灰色解决方法...

    第一种情况:bios中开启了安全启动(secure boot),需要在bios中关闭安全启动才能修改引导模式. 解决办法一:关闭安全启动方法: 1.关闭安全启动:Secury boot-选择Disab ...

  6. 移植U-BOOT之裁剪和修改默认参数(易用性)启动内核,以及对uboot进行分区

    今天我们来裁剪U-BOOT,使其更加易用,修改默认参数,以及制作最终修改好得补丁文件方便以后的快速移植. 那么如果想看之前的关于网卡以及flash等的移植,请点击链接查看:点击链接查看 在裁剪修改之前 ...

  7. EFI启动盘修改BIOS隐藏选项DVMT等显存参数提升性能

    背景 以前用过联想PC,型号M7360/M4310/M4311/M4320等机型,主板型号均为H61,仅CPU不同.近期拿到较新的M4350机,CPU为三代I3,使用感觉性能并无提升,比之前机型差一点 ...

  8. 计算机boot进入u盘启动,暗影精灵5怎么设置u盘启动 暗影精灵5设置u盘启动方法...

    最近有位电脑用户想要使用u盘启动盘重装系统,但是却不知道应该怎么使用bios设置u盘启动,为此非常苦恼,那么惠普暗影精灵5 omen 15-dc1068tx笔记本怎么使用bios设置u盘启动呢?下面为 ...

  9. 联想开机启动项按哪个_win7系统如何修改系统启动项 win7系统修改系统启动项方法【步骤】...

    我们在使用电脑的过程当中,电脑开机时很多软件都会跟着启动,这就导致了系统启动变慢,这时我们就需要修改启动项了,不过有很多电脑用户都不知道怎么修改系统启动项,那么win7系统怎么修改系统启动项呢?今天为 ...

最新文章

  1. 关于数据库SQL优化
  2. pytorch笔记——简易回归问题
  3. 战神引擎修改服务器时间,修改战神引擎手游进入游戏公告内容教程
  4. rhel5.5_Apache配置openssl支持https服务
  5. 真香!一行Python代码,帮你制作小姐姐的表情包,靠谱吗?
  6. Spring MVC工作原理 及注解说明
  7. 匿名函数与自执行函数
  8. (20)VHDL移位寄存器
  9. VS2012统计代码量
  10. 安装VS2017报错:程序包清单签名验证失败
  11. tcpip路由技术卷一_学网络拿高薪!「纯干货」IELAB路由技术问题总结1
  12. 共空间模式算法(CSP)
  13. Ms08067实验室 JAVA代码审计实战班:开课喽!!
  14. Linux查看日志的常用命令
  15. 登录和访问EI(Engineering Village)数据库查找文献
  16. python抓取word里的拼音_[DIY]给word中的汉字批量加、修改拼音(word全篇加拼音)(旧版VBA程序,缺点比较多)...
  17. getc()、getchar()、getch() 和 getche() 的区别
  18. 中科大计算机电子信息,中国科学技术大学电子工程与信息科学系
  19. mysql中的ip存储与查询
  20. 配置 MATLAB for Linux 设置启动图标 MATLAB2021a Ubuntu 20.04.3 LTS

热门文章

  1. 美欧《隐私盾协议》之无效及中国应对路径
  2. 1月交通出行APP月活TOP20滴滴 哈啰 摩拜 嘀嗒居前五
  3. 智慧车间生产管理平台 MES方案书
  4. 处理Matlab Coder, Compiler can't find tmwtypes.h
  5. 太完整了!java零基础自学的书
  6. python画二维图像
  7. cf1362E. Johnny and Grandmaster,贪心+数学,一个序列划分成两部分,差最小
  8. redis远程连接不上
  9. vue引用tinymce富文本编辑器及tinymce配置
  10. 洗脑最厉害的10句名言,真是不服不行啊!