2. Uboot和系统移植
主要内容
uboot基础知识
shell基础知识
makefile基础知识
2.1 Uboot学习前传
2.1.5-9Uboot常用命令
-
printenv/print
不用带参数,作用是打印出系统中所有的环境变量
-
setenv/set
用法:
-
set name value
设置环境变量name的值为value
-
-
saveenv/save
不用带参数,作用是将内存中的环境变量的值同步到flash(硬盘)中的环境变量的分区
彻底更改系统环境变量的值,先set再save;暂时更改环境变量,只set不save,下次开机还是会恢复到原来的值
-
ping
用法:
-
ping IP地址
测试与某IP地址的网络连接是否成功
-
-
tftp
用法:
首先设置serverip地址为目标tftp服务器的IP地址
-
tftp 内存地址 文件名称
tftp 0X300000000 name.exe
-
-
movi(mmc)
用法:
操作flash,读取内容到ddr中或写入内容到flash中,movi命令是一个命令集
-
movi init/read/write
movi read u-boot 0x30000000
将inand、flash中的u-boot分区读入到ddr的0x30000000位置(uboot中的所有数字默认按照十六进制处理,不管加不加0x)
-
-
内存操作指令mm,mw,md
用法:
-
md(memory display)
md [.b/.w/.l] 地址 [显示长度(字节)]
md .b 0x30000000 10
-
mw(memory write)
mw [.b/.w/.l] 地址 值 []
mw .b 0x30000000 55
-
mm(mempry modify)修改内存(如果需要批量逐个修改内存,这个比较方便)
mm [.b/.w/.l] 地址
mm .b 30000000
-
-
启动内核命令bootm,go
用法:不管启动是否成功,uboot都会死掉
bootm命令启动会给内核传参,go命令启动不会给内核传参
-
nfs
用法:启动内核命令(挂载根文件系统)
2.1.10-11 uboot常用环境变量
-
自动运行倒数时间:bootdelay
-
网络设置ipaddr serverip
- ipaddr是开发板的本地IP地址
- serverip是开发板的tftp目标服务器地址
- gatewayip是开发板本地网关地址
- netmask是子网掩码
- ethaddr是开发板的本地网卡的mac地址
-
自动运行命令设置bootcmd
倒计时结束后自动执行的命令集,
set bootcmd ‘movi read kernel 30008000;bootm 30008000’
注意单引号,如果没有单引号则后边bootm不会被写入环境变量
-
uboot给内核传参bootargs
linux内核可以接受uboot传递的启动参数,内核在这些启动参数的指导下完成启动过程
在uboot的环境变量设置bootargs,bootm命令会自动将这些信息传入内核
2.1.12 uboot对flash和DDR的管理
-
uboot对flash的分区
uboot和kernel中有分区表,分区表就是做系统移植时对flash的整体管理分配方法。
分区方法不是一定的,但是必须在一个移植中必须事先设计好并定死。定的标准是:
- uboot必须从flash起始地址开始存放,取决于SoC的启动设计,uboot分区的大小必须保证肯定能放下uboot,一般设计为512KB或1MB。
- 环境变量的分区一般紧贴着uboot存放,大小为32KB或以上。
- kernel可以紧贴环境变量存放,大小一般为3MB,5MB或其他。
- rootfs:自由设置
- 剩下的就是自由分区,自由分区在kernel启动后挂载在rootfs下
- uboot和kernel应使用同一个分区表。
-
uboot对DDR的分区
内核的分区主要是在kernel启动之前,kernel启动之后内核的内存管理模块会接管整个内存空间。
2.2 shell和makefile入门
2.2.1 shell介绍
- shell就是一个命令行界面,是一种人机交互的方式
- shell是一类编程语言,编写shell脚本时,用的就是shell语言
- shell程序是解释运行的
2.2.2 写一个shell程序
- 运行方法
- ./XX.sh 直接运行,可用chmod添加可执行权限
- source命令,source就是专门用来执行脚本程序的,这样执行不需要脚本具有可执行权限
- bash xx.sh 使用可执行程序bash来解释运行脚本程序
- shell程序第一行一般都是
#!+pathname
,后面的pathname,就是指定shell程序执行时被哪个解释器执行 - 注释使用#,可以注释一行,如果注释多行需要每行都注释
- shell就是把以前在命令行下键入的命令写成了程序
2.2.3-2.2.6 shell语法
-
shell中定义变量的时候可以直接定义,不需要指定类型
-
变量定义可以初始化,使用“=”赋值,在shell中“=”两边不能有空格
-
shell中语法非常严格,尤其对于空格
-
变量定义后可以再次赋值,新的赋值会覆盖老的
-
shell中引用一个变量必须使用“$”可以$var也可以${var}
-
shell中直接使用字符串可以不加双引号,但是不能输出双引号等转义字符
-
如果要输出特殊符号需要先用双引号包起来再用\转义
-
选择分支结构***(注意中括号里面前后都有空格)***
-
if [表达式];then
xxx
else
yyy
fi
-
if 的典型应用
-
判断文件是否存在(-f)
if [ -f a.c ]; then echo"yes" else echo"no" touch a.c fi
-
判断目录是否存在(-d)
-
判断字符串是否相等(“str1” = “str2”)注意用一个等于号不是两个
-
判断数字是否相等(-eq),大于(-gt),小于(-lt),大于等于(-ge),小于等于(-le)
equal,greater then,less then,greater or equal ,less or equal(12 -eq 12)
-
判断字符串是否为空(-z)
-
使用(-o)表示逻辑或
-
-
-
循环结构
其逻辑与C语言逻辑类似
-
echo指令创建文件和追加输入文件
-
echo “test” > a.txt
在当前目录下创建a.txt文件并把test写入该文件
-
echo “test” >>a.txt
在a.txt文件末尾追加test字符
-
-
case语句
-
演示注意两个分号
var=2 case $var in 1) echo "1" ;; 2) echo "2" ;; esac
-
case语句天生没有break,也不需要break,默认都带了break
-
-
shell程序的传参
- 可以在调用时给shell程序传参
- $# 表示调用该shell时传参的个数
- $0,$1,$2表示传参的各个参数
- $0时执行这个shell程序的解析程序的名称
- $1是第一个有效参数的值
-
shell中的break语句是用来跳出循环的而不是用来跳出case语句的
2.2.7 Makefile学习
- makefile的作用和意义
- 项目中的文件过多,管理不方便,用makefile来做项目管理方便编译链接过程。
- uboot和kernel本质上都是C语言的项目,由很多文件组成,故需要通过makefile管理
- 目标,依赖和命令
- 目标就是最终要生成的东西
- 依赖就是生成目标的原料
- 命令就是加工方法
- makefile的过程就是使用命令将依赖加工成目标的过程
- 通配符%和makefile自动推导
- %是makefile中的通配符,%.o代表所有以.o结尾的文件
- 自动推导就是makefile的规则。当makefile需要某个目标时,会把这个目标去套规则说明,一旦套上了某个规则,makefile就会去寻找这个规则的依赖,如果能找到就执行这个规则用依赖生成目标
- makefile中定义和使用变量
- 和shell脚本中非常相似,都没有变量类型,直接定义使用,引用时用$var
- 伪目标
- 伪目标意思是这个目标本身不代表一个文件,执行这个目标不是为了得到某个文件,而是单纯为了执行这个目标下面的命令
- 伪目标一般都没有依赖,不加依赖就是无条件执行
- 伪目标可以直接写,不影响使用;为了明确声明这个目标是伪目标,要在前面加上(.PHONY)
- makefile的文件名
- 合法的文件名一般有两个:Makefile或makefile
- makefile中引用其他makefile(include 指令)
- 当总体比较复制的时候,分成好几个makefile写,在主makefile中引用其他的,用include引用,应用的效果也是原地展开,与c中的头文件类似
2.2.8 makefile补充学习
-
makefie中注释使用#
-
在makefile的命令行前面的@表示静默执行。既不打印要执行的命令直接执行
-
makefile中的变量赋值运算符
-
= 最简单的赋值
在对=赋值的变量解析时,是按照最后一次赋值的值进行解析的
-
:=
在对:=赋值的变量解析时,是按照解析前的最后第一次出现的值进行解析
-
?= 如果变量前面并没有赋值过则执行这条命令,如果已经赋值过则本行被忽略
所谓的没有赋过值,就是这个变量没有被定义过
-
+= 用来给已经赋值过的变量接续赋值,意思就是把这次的值加到原来的值的后面,类似strcat。
接续后的内容中间自动会有空格隔开
-
-
makefile的环境变量
- makefile中用export导出的就是环境变量,一般情况下要求环境变量用大写,普通变量用小写。
- 环境变量和普通变量不同,环境变量类似整个工程所有的makefile之间可以共享的全局变量,普通变量只是本makefile可以用,定义了一个环境变量会影响到本工程中别的makefile文件,因此要小心
- makefile中有一些环境变量是自己定义的内部环境变量,或者是当前的执行环境提供的环境变量。
-
makefile中的通配符
- * 若干个任意字符
- ?一个任意字符
- [] 将括号中的字符依次去和外面的匹配
还有个**%**表示任意多个字符,但是一般只用在规则描述中,又叫做规则通配符
还有一些比较复杂的如wildcard通配符
-
自动变量
- 自动变量的含义:预定义的特殊意义的符号,类似C语言编译器中预置的宏
- 常见的自动变量
- $@ 规则的目标文件名
- $< 规则的依赖中文件名
- $^ 依赖的文件集合