本文内容来自对 《朱有鹏嵌入式linux核心课程》学习总结
1. 环境变量如何参与程序运行
- 环境变量有 2 份,一份在 Flash 中,另一份在 DDR 中。uboot 开机时一次性从 Flash 中读取全部环境变量到 DDR 中作为环境变量的初始化值,然后使用过程中都是 DDR 中这一份,用户可以用
saveenv
指令将 DDR 中的环境变量重新写入 Flash 中去更新 Flash 中环境变量。下次开机时又会从 Flash 中再读一次。 - 环境变量在 uboot 中是用字符串表示的,也就是说 uboot 是按照字符匹配的方式来区分各个环境变量的。因此用的时候一定要注意不要打错字了。
2. 自动运行倒数时间:bootdelay
3. 网络设置:ipaddr serverip
ipaddr
是开发板中的本地 IP 地址serverip
是开发板通过 tftp 指令去 tftp 服务器下载东西时,tftp 服务器的 IP 地址。gatewayip
是开发板的本地网关地址netmask
是子网掩码ethaddr
是开发板的本地网卡的 MAC 地址
4. 自动运行命令设置:bootcmd
- uboot 启动后会开机自动倒数 bootdelay 秒,如果没有人按下回车打断启动,则 uboot 会自动执行启动命令来启动内核。
- uboot 开机自动启动时实际就是在内部执行了
bootcmd
这个环境变量的值所对应的命令集。 bootcmd=movi read kernel 30008000; bootm 30008000
意思是:将 iNand 的 kernel 分区读取到 DDR 内存的 0x30008000 地址处,然后使用bootm
启动命令从内存 0x30008000 处去启动内核。set bootcmd printenv
,然后saveenv
;然后重启则会看到启动倒数后自动执行printenv
命令打印出环境变量。这个小实验说明开机自动执行了bootcmd
。set bootcmd 'movi read kernel 30008000; bootm 30008000'
5. uboot 给 kernel 传参:bootargs
-
linux 内核启动时可以接收 uboot 给他传递的启动参数,这些启动参数是 uboot 和内核约定好的形式,内容,linux 内核在这些启动参数的指导下完成启动过程。这样的设计是为了灵活,为了内核在不重新编译的情况下可以用不同的方式启动。
-
我们要做的事情就是:在 uboot 的环境蛮事设置
bootargs
,然后bootm
命令启动内核时会自动将bootargs
传给内核。 -
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 -
内核传参非常重要。在内核移植的时候,新手经常因为忘记给内核传参,或者给内核传递的参数不对,造成内核启动不起来。
6. 新建,更改,删除一个环境变量的方法
- 新建一个环境变量,使用
set var value
- 更改一个环境变量,使用
set var value
- 删除一个环境变量,使用
set var
注意:环境变量更改后的保存
- 修改完成环境变量后一定要保存,否则下次开机更改就又没了。