Appearance
一
1.1 三个配置文件
- 请简述一下 Makefile / .config / Kconfig 三个文件的关系。
- .config 生成默认配置文件给 Makefile 使用
- Makefile 用于构建项目,生成配置文件
- Kconfig 存储图形配置信息
1.2 LED实验Makefile
- 解释 LED ARM 实验的 Makefile
- 有道笔记
- wildcard 替换通配符,OBJSss 是当前目录下,start 目录下和 common/src 所有目录下的 .S/.c 文件
- patsubst 替换字符串,OBJSs 所有 .S 对应的 .o 文件
- 同上,OBJS 是所有 .c 对应 .o 文件
- 汇编:将 .S 编译到 .o
- 编译:将 .c 编译到 .o
- all: 先清理 然后依赖 OBJS
- 链接通过 map.lds 链接脚本文件编译到 elf 可执行问
- 将 elf 可执行文件拷贝到 bin 镜像文件
- nm 指令从 elf 导出符号表
- objdump 指令从 elf 导出反汇编代码
1.3 sdtool.sh解释
- 解释sdtool.sh
- 1 -> 指定运行的解释器程序
- 3 -> 如果命令行参数个数 $# 等于1
- 5 -> 如果第一个参数是 "help"
- 7 -> 打印帮助信息
- 9 -> 如果第一个参数不是一个块设备
- 11-> 打印错误信息:不是块设备
- 15-> 使用说明
- 20-> 交互输入选择
- 21-> 如果输入选择为 y
- 20-> 交互输入选择
- 21-> 如果输入为 y
- 25-> 删除原有分区
- 26-> 写在分区
- 31-> 创建分区
- 33-> 如果输入为 n
- 37-> 如果输入其他
1.4 开发部署框图
- 开发部署的框图和说明
- 有道云笔记5.2
- 部署框图:

- 部署流程(依照图中数字描述即可):
- 将目标板和主机通过网线连接到同一局域网完成组网
- 在目标板的 eMMC 或者 TF 卡(对应拨码开关)中写入 u-boot 系统引导程序
- 在主机部署 tftp 服务器存放编译好的设备树文件和内核镜像文件
- 在主机部署 nfs 服务器存放 rootfs 根文件系统
- 上电启动开发板,u-boot 载入内存并启动
- 在串口工具打印 u-boot 相关信息,进入 u-boot 交互模式
- 使用 tftp 命令下载 tftp 的设备树和内核镜像到内存中
- u-boot 通过 bootm 指令进入到 Linux 内核
- bootcmd 参数设置:
- tftp 0xc2000000 uImage;
- tftp 0xc4000000 stm32mp157a-fsmp1a.dtb;
- bootm 0xc2000000 - 0xc4000000
- bootargs 参数设置:
- root=/dev/nfs
- nfsroot=192.169.1.250:/home/ubuntu/nfs/rootfs,tcp,v4 rw
- console=ttySTM,115200
- init=/linuxc
- ip=192.168.1.100
1.5 配网和读写mmc
1)
- 设置服务器地址:setenv serverip 192.168.1.250
- 设置子网掩码:setenv netmask 255.255.255.0
- 设置网关:setenv gatewayip 192.168.1.1
- 设置本机 IP setenv ipaddr 192.168.1.250
- 注意事项:服务器 IP 需要对应主机配置,通过 ping 测试,设置后需要 saveenv 保存 2)
- mmc read:
txt
mc read addr blk# cnt
功能:将EMMC中数据读到内存中
addr:读到内存的起始地址
blk#:从EMMC中起始块号开始读
cnt:读多少块- mmc write
txt
mmc write addr blk# cnt
功能:将内存中的数据,写到EMMC中
addr:从内存的起始地址开始写
blk#:EMMC中的起始块号开始写
cnt:写多少块1.6 配置编译指令
- 配置内核的指令:make menuconfig
- 编译内核的指令:time make -j4 ARCH=arm uImage vmlinux dtbs LOADADDR=0xc2000000
- 缺省内核配置文件:multi_v7_defconfig > .config
- (u-boot的缺省配置文件是
stm32mp15_basic_defconfig)
1.7 模块化编译流程
- 添加模块化LED驱动的流程
- arch/arm/Makefile 添加:
obj-$(CONFIG_LED_DRIVER) += fsmp157a_led.o - driver/char/Kconfig 添加:
txt
config LED_DRIVER
tristate "led driver"
default y
help
this is DC23031 led driver!!!- .config 不用手动添加,运行
make menuconfig设置:
Device Drivers --->
Character devices --->
<M> led driver ---> !!!更改为M选项 !!!1.8 制作 ramdisk.img
- 制作一个空镜像文件:
dd if=/dev/zero of=ramdisk bs=64M count=1 - 将镜像文件制作为 ext4 格式:
mkfs.ext4 ramdisk - 挂载镜像文件:
sudo mount -t ext4 ramdisk /mnt - 将 rootfs 瘦身:
cd ~/nfs/rootfs && arm-linux-gnueabihf-strip lib/* - 拷贝 rootfs 到挂载节点:
sudo cp -raf * /mnt - 取消挂载:
sudo umount /mnt - 压缩镜像文件:
gzip --best -c ramdisk > ramdisk.gz - 使用mkimage命令添加64字节头部信息:
mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img
二
2.1 移植的主要内容
- 交叉编译工具链
- Bootloader(u-boot)
- Kernel
- rootfs(根文件系统)
2.2 定位错误
- arm-none-linux-gnueabi-addr2line 0xc029b66c -e vmlinux -f
- 或
- arm-none-linux-gnueabi-objdump -D vmlinux > vmlinux.dis 然后通过阅读汇编代码定位
2.3 Linux内核启动流程

- head.S 内核入口文件
- 判断 CPUID 是否正确,绝对是否往下运行
- 将 r2 导入存放(r2是boot参数)
- 创建页表
- 内存映射转换
- 清除 BSS 段,保存 CPU id 机器类型及环境参数指针
- 初始化硬件
- 启动内核线程
- sysopen console
- 执行用户空间的第一个程序 init
2.4 uBoot特点启动流程
- uboot 是系统引导程序
- 开源分布式
- 支持多平台多架构
- 裸机程序
- 短小精悍
- 内核启动后生命周期结束
- 引导内核启动时,传递两个参数 bootcmd 和 bootargs
- 启动流程:
- ROM code -> (一级引导)U-Boot SPL -> (二级引导)U-Boot (非安全启动流程)
- ROM code -> (一级引导)TF-A -> (二级引导)U-boot(安全启动流程)
2.6 配网mmc读写
2.7 配置编译指令
2.8 模块化编译好处
- 节省编译时间,不用反复编译内核
- 减小内核体积
- 简化内核开发维护
- 动态加载和卸载
- 节约内存资源
2.9.1 模块化编译
2.9.2 三个配置文件
2.10 开发部署和发布部署

- bootargs root=/dev/nfs nfsroot=192.168.1.250:/home/linux/nfs/rootfs,tcp,v4 rw console=ttySTM0,115200 init=/linuxrc ip=192.168.1.100
root,nfsroot(地址路径,协议,读写权限),console,init,ip

- bootargs root=/dev/ram console=ttySTM0,115200 init=/linuxrc initrd=0xc5000040,0x1000000 rw rootstype=ext4
root,console,init,initrd,rootstype
三
制作uImage
txt
vmlinux
——>objcopy——>Image
——>gzip——>arch/arm/boot/compressed/vmlinux
——>objcopy——>zImage
——>mkimage——>uImage- vmlinux 转换格式到 image
- image 压缩到 compressed/vmlinux
- 压缩版 vmlinux 转换格式到 zImage
- mkimage 添加头部信息到 uImage
mkimage 参数
txt
mkimage -T stm32image -a 0xC0100000 -e 0xC0100000 -d u-boot.bin u-boot.stm32-T镜像文件类型-a设置加载地址-e设置入口地址-d指定镜像文件