博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uboot---常见变量
阅读量:3920 次
发布时间:2019-05-23

本文共 1784 字,大约阅读时间需要 5 分钟。

1、环境变量如何参与程序运行

(1)环境变量有2份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR中这一份,用户可以用saveenv指令将DDR中的环境变量重新写入Flash中去更新Flash中环境变量。下次开机时又会从Flash中再读一次。
(2)环境变量在uboot中是用字符串表示的,也就是说uboot是按照字符匹配的方式来区分各个环境变量的。因此用的时候一定要注意不要打错字了。

(3)如果环境变量写写错了,例如打算写:set bootdelay 10而写成了set botdelay 10然后save后重启后,发现bootdelay并没有改变。这是因为我们环境变量写错了,此时我们重新输入set bootdelay便可删除已建好的botdelay环境变量。

在这里插入图片描述
2、自动运行倒数时间:bootdelay

3、网络设置:ipaddr serverip

(1)ipaddr是开发板的本地IP地址
(2)serverip是开发板通过tftp指令去tftp服务器下载东西时,tftp服务器的IP地址。
(3)gatewayip是开发板的本地网关地址
(4)netmask是子网掩码
(5)ethaddr是开发板的本地网卡的MAC地址。

4、自动运行命令设置:bootcmd

(1)uboot启动后会开机自动倒数bootdelay秒,如果没有人按下回车打断启动,则uboot会自动执行启动命令来启动内核。

(2)uboot开机自动启动时实际就是在内部执行了bootcmd这个环境变量的值所对应的命令集。
在这里插入图片描述
(3)bootcmd=movi read kernel 30008000; bootm 30008000 意思是:将iNand的kernel分区读取到DDR内存的0x30008000地址处,然后使用bootm启动命令从内存0x30008000处去启动内核。
(4)set bootcmd printenv,然后saveenv;然后重启则会看到启动倒数后自动执行printenv命令打印出环境变量。这个小实验说明开机自动执行了bootcmd。
在这里插入图片描述
执行了set bootcmd printenv后,然后save。然后重启,uboot bootdelay也会倒数,但是倒数结束后并不执行启动内核。而是只会执行printenv,打印环境变量。
在这里插入图片描述
(5)set bootcmd ‘movi read kernel 30008000; bootm 30008000’

如果写成 set bootcmd 'movi read kernel 30008000; bootm 30008000就会出错,因为中间有分号,不是一体的。因此我们要加单引号,即:set bootcmd 'movi read kernel 30008000; bootm 30008000’便可,加单引号后,uboot便认为单引号内是一体的。

5、uboot给kernel传参:bootargs

(1)linux内核启动时可以接收uboot给他传递的启动参数,这些启动参数是uboot和内核约定好的形式、内容,linux内核在这些启动参数的指导下完成启动过程。这样的设计是为了灵活,为了内核在不重新编译的情况下可以用不同的方式启动。

(2)我们要做的事情就是:在uboot的环境变量中设置bootargs,然后bootm命令启动内核时会自动将bootargs传给内核。
(3)bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3 意义解释:
console=ttySAC2,115200 控制台使用串口2,波特率115200.
root=/dev/mmcblk0p2 rw 根文件系统在SD卡端口0设备(iNand)第2分区,根文件系统是可读可写的
init=/linuxrc linux的进程1(init进程)的路径
rootfstype=ext3 根文件系统的类型是ext3
(4)内核传参非常重要。在内核移植的时候,新手经常因为忘记给内核传参,或者给内核传递的参数不对,造成内核启动不起来。

转载地址:http://tbhrn.baihongyu.com/

你可能感兴趣的文章
帮你解读什么是Redis缓存穿透和缓存雪崩(包括解决方案)
查看>>
Mysql各种存储引擎对比总结(常用几种)
查看>>
java为我们已经提供了各种锁,为什么还需要分布式锁?
查看>>
一文带你理解mysql中的分区表和合并表(一个常见知识点)
查看>>
Redis5.0数据淘汰策略详解(最新版本,面试常问)
查看>>
为什么 MongoDB 索引选择B-树,而 Mysql 选择B+树(精干总结)
查看>>
面试官:说说 Springboot 中的 javaConfig(基于Spring5.2)
查看>>
你的钱为什么被转走,这篇文章告诉你答案(CSRF详解)
查看>>
JVM中的一个小知识点:深堆和浅堆的概念
查看>>
HashMap的负载因子初始值为什么是0.75?这篇文章以最通俗的方式告诉你答案
查看>>
详解java中一个面试常问的知识点-阻塞队列
查看>>
除了Thread和Runnable,你还知道第三种创建线程的方式Callable吗
查看>>
java线程面试题集锦(第一版本)
查看>>
记一次java中三元表达式的坑(避免踩坑)
查看>>
高频面试题:什么是零拷贝?在哪些地方使用了?
查看>>
Redis为什么又引入了多线程?作者也逃不过“真香定理”?
查看>>
面试官:如何实现一个乐观锁(小白都能看得懂的代码)
查看>>
CopyOnWriteArrayList,一个面试中经常问到的冷门容器
查看>>
volatile如何保证有序性?内存屏障都不知道怎么拿offer呀
查看>>
一文搞懂WeakHashMap工作原理(java后端面试高薪必备知识点)
查看>>