一、uboot常用命令与环境变量
1.命令:
(1)环境变量操作命令
命令 | 功能 | 格式 |
printenv | 查看环境变量 | printenv |
setenv | 新建/修改环境变量 | setenv 环境变量名 环境变量值 |
saveenv | 保存环境变量 | saveenv |
(2)内存操作命令
命令 | 功能 | 格式 | 示例 |
md | 显示内存值 | md[.b,.w,.l] address [#of objects] | md.b 80000000 14 |
nm | 修改指定地址的内存值 | nm[.b,.w,.l] address | nm.l 80000000 |
mw | 使用个指定的数据填 充一段内存 | mw[.b,.w,.l] address value [count] | mw,l 80000000 0A0A0A0A 10 |
cp | 数据拷贝命令 | cp[.b,.w,.l] source target count | cp.l 80000000 80000100 10 |
cmp | 比较两段内存数据是否 相等 | cmp [.b,.w,.l] addr1 addr2 count | cmp.l 80000000 80000100 10 |
(3)网络命令
(4)mmc操作命令
注意:千万不要写SD卡或者EMMC的前两个块(扇区),里面保存着分区表!
(5)boot命令
分区表
room固件 = 分区表
二、工程管理Makefile
1.语法
要生成的文件 : 依赖的所有文件
生成的方式
2.步骤
make - > Makefile \makefile -> 寻找文件中要生成的目标a.out - >寻找以来的所有的文件 - > 存在就利用命令生成目标文件、不存在,Makefile向下寻找依赖文件的生成方式
3.符号说明
- := 覆盖原来的值
- ?= 如果原来没有值,就赋新值,原来有值,不赋新值
- += 原来值的基础上新加一个值
伪指令:.PHONY
示例代码
4.分类处理(不同的平台)
条件编译1
gcc main.c -D
makefile传参
三、Uboot
1.Uboot编译
(1)uboot(跨平台)作用
- 初始化硬件设备
- 为加载内核做准备
(2)使用宏实现条件编译,满足条件的加入编译中,不满足的从编译中去除
最顶层目录.config 配置文件(宏的配置,如果宏配置到该文件中,则代码加入uboot编译);
(3)make V=0 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
当前平台为ARM,工具链为arm-linux-gnueabihf-,开启16核编译
ubootuboot.bin ->uboot.imx
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean //清除.configmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig //按照板子默认的来make V=0 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16 //生成。bin文件
2.Linux系统启动流程
Uboot第一阶段:在芯片内部SRAM进行
(1)开发板上电,加载0x0地址,IMX6ULL96k出厂固件代码(ROM),会根据启动方式将对应的存储设备前面的一段uboot代码加载到RAM中执行
(2)出厂固件代码以及uboot通过IMX6uLL内部的RAM;只能完成简单操作
(3)对外设初始化(初始化DDR和EMMC)
(4).将IMX6ULL 96K ROM固件代码搬移到 DDR中运行
Uboot第二阶段:可对代码进行运行,实现与用户的交互
(5)外设逐一初始化
(6)进入与用户交互的系统中,等待用户按下按键
(7)如果用户不操作uboot,倒计时结束后,会执行bootcmd
(8)引|导启动内核 ( 需要串口、需要网口、文件系统的方式及路径、需要设备树... )
内核启动阶段:(加载驱动和五大功能实现的展开)
(9)内核启动执行init进程 ( 0号内核进程 ,挂载文件系统)
Linux系统用户态
(10)启动用户进程(fork+exec)启动所有的进程
(11)启动终端(可以与用户实现交互
三、内核与设备树文件
1.步骤
(1)源码解压
(2)进入源代码中
(3)编译生成.bin
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean //清楚之前编译的文件
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_alientek_emmc_defconfig //以这次的imx_alientek_emmc_defconfig的设置作为.config设置,.config决定了额那些代码加入编译、那些嗲吗从编译中去除
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig //用户可以通过界面自行选择或者修改.config
- make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16 //编译-J16
(4)编译完成后可以获得设备树文件和内核镜像文件
设备树文件: arch/arm/boot/dts/imx6ull-alientek-emmc.dtb
内核镜像镜像: arch/arm/boot/zImage
(5)将以上两个文件(内核镜像、设备树文件)拷贝到 ~/tftpboot
2.make menuconfig
* 驱动项 | 编译生成的zImage中包含该驱动项 | 驱动(静态加载) |
M 驱动项 | 编译生成的zImage中不包含该驱动项,该驱动将会成为一个独立的模块 | 驱动(动态加载) |
(1)打开图像界面 - > 图形界面的配置项(根据Kconfig中语法解析得到)
Kconfig决定了menuconfig中有哪些选项,make menuconfig可以写进.config
(2)勾选/去除/模块选择编译目标 -> 根据用户勾选将对应的宏写入.config 宏名 = y/m
(3)make -j16编译的时候,顶层的makefile会调用每一层的makefile,每层makefile都会根据.config中的宏的配置决定哪些.o文件加入编译,哪些.o文件不加入编译 ---> vmlinux(可以调试的内核,体积很大)->Image(对vmlinux压缩后的镜像文件) ----> zImage(添加解压算发的Image)
四、文件系统
1.文件系统生成工具
- busybox:最核心最简单,如果需要下载,需要自己搭建
- buildboot:
- yacto
2.流程
内核启动后 ->挂载文件系统 ->执行linuxrc ->/etc/initab脚本(决定系统启动执行哪些脚本、重启执行哪些脚本、ctrlaltdel执行哪些脚本)->系统启动执行 /etc/init.d/rcS脚本 ->设置环境变量、参数->挂载所有文件系统(mount-a)->执行/etc/fstab文件-> 挂载所有文件系统 ->/etc/profile脚本 ->启动bash shell ->与用户交互 ->./a.out ->fork+exec(./a.out)
3.自动启动
把代码放在/etc/profile 或者 /etc/init.d/rcS下,就可实现一启动运行里面代码;