Skip to content
On this page

临时笔记系统移植复习


标签:draft/archive  

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 开发部署框图

  • 部署流程(依照图中数字描述即可):
    • 将目标板和主机通过网线连接到同一局域网完成组网
    • 在目标板的 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内核启动流程

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 配置编译指令

  1. 1.6 配置编译指令

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
    • rootnfsroot(地址路径,协议,读写权限),consoleinitip

  • bootargs root=/dev/ram console=ttySTM0,115200 init=/linuxrc initrd=0xc5000040,0x1000000 rw rootstype=ext4
    • rootconsoleinitinitrdrootstype

制作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 指定镜像文件

其他

Last updated: