系统移植-树莓派5

1. 交叉编译

1.1 linux系统移植环境搭建

  1. 搭建交叉编译环境

  2. Bootloader 的选择和移植优化

  3. Kernel 的配置、编译、移植、调试

  4. 根文件系统的制作

1.2 交叉编译

  1. 在开发主机运行编译器编译内核、应用,而内核和程序要在目标机上运行,这个编译过程称为交叉编译。

  1. 编译器运行在开发主机(通常是X86体系的PC机)上,编译出的代码是目标机体系结构的,如:ARM。

  1. 在主机上除了编译还可以完成制作根文件系统、数据加工等工作§ 嵌入式linux开发,交叉编译使用开源gnu工具集,gcc等

  1. Intel、AMD、VIA也在采用 X86体系进入嵌入式领域.

1.3 安装编译器

解压到特定目录,将编译器配置到环境变量,改为激活脚本的编写进行脚本激活

1.3.1 解压交叉编译器 到 /opt目录

sudo tar -Jxvf gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf.tar.xz -C /opt

1.3.2 此时/opt里的编译器文件,所有者属于root,将这个版本所有的编译器软件都改为当前用户

修改权限: sudo chown -R rocky:rocky gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf

1.3.3 将交叉编译工具链注册到PATH变量上

export PATH=$PATH:/opt/arm-none-linux-gnueabihf-9.2/bin

tips: bash xx.sh 和 source xx.sh 区别, ---- bash xxx.sh 执行一个子进程 子进程的上下文 和 父进程

source 当前进程 加载.sh文件里的变量信息

1.4 使用

1.4.1 Linux下可执行文件

ELF头数据 + 正文

od -t x1 build 以二进制方式显示文件 readelf -h build 读取ELF格式可执行文件的头部信息;readelf -S 查看ELF结构

1.4.2 常用段的大小查看工具

size:列出目标文件每一段的大小以及总体的大小。 size有两种输出格式,一种为“sysv”,另一种为“berkeley”,默认为berkeley的格式。 第一种格式可以用“-A”或者“--format=sysv”指定。 第二种格式用“-B”或“--format=berkeley”指定。 size hello -A

file : 阅读文件里的数据,展示出数据格式属性。可以看文本文件 二进制文件

文本文件: file vim cat more less

二进制文件:指令集合 file objdump(-d) readelf nm

strip: 剔除二进制文件的符号表信息; 减少二进制文件的空间体积。strip用来丢弃目标文件中的全部或者特定符号,减小文件体积。对于嵌入式系统,这个命令必不可少。经过strip处理后的文件已经不包含符号了,可以使用nm加以验证。nm nmdemo.o

objdump: -d 反编译; -R 显示重定向的入口。objdump可以显示一个或者更多目标文件的信息,主要用来反汇编objdump –d demo.o。“-R”选项显示动态重定向的入口。objdump –R hello

objcopy: 目标文件格式的转换; 生成纯二进制数据文件.arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec

gnu工具集:readelf可以显示elf格式可执行文件的信息。 ELF格式是UNIX系统实验室作为应用程序二进制接口开发的。 ELF格式是Unix/Linux平台上应用最广泛的二进制工业标准之一。

strings:用来打印某个文件的可打印字符串。

addr2line能够把程序地址转换为文件名和行号,前提是这个可执行文件包括调试符号。如果可执行文件中没有包括调试符号,shell将返回??:0。最常用的选项是“-e”用来指定文件名和地址。 gcc -o test -Wl,-Map=test.map -g test.c grep main test.map addr2line 0x08048368 -e test -f

编译静态、动态链接库:

编译 gcc -Wall -o libtest1.o -c libtest1.c gcc -Wall -o libtest2.o -c libtest2.c ar -rc libtest.a libtest1.o libtest2.o

安装生成的静态库: cp libtest.a /usr/lib/ cp libtest.h /usr/include/

生成动态库 gcc -shared -fpic -o libtest.so libtest.c cp libtest.so /lib

生成执行文件: gcc -o main main.c -ltest -L.

1.4.3 编写程序,最终生成可以烧写到系统的文件

ELF格式的可执行文件、不能直接让CPU来执行的,只能被OS的解析 ELF头 执行对应的代码

只能烧写纯 指令数据集合 = ELF头 + 正文

gcc 编译链接过程:

1. 预处理 gcc -E -o hello.i hello.c cpp 预处理文件

2. 编译 gcc -S -o hello.s hello.i cc1 汇编文件

  1. 汇编 gcc -c -o hello.o hello.s as 目标文件 2.3 统一称之为 编译

-start 汇编入口文件

1.5 链接

gcc -o build hello.o ld(collect) 可执行文件 默认和OS相关的内容都进行链接 main入口

目标文件,仅仅是动作的指令,不含有地址信息,只有链接时,才会确定每个符号的地址信息,不能直接烧写到 设备

a. 含有ELF格式化头

b. 所有指令,是没有地址信息的,一旦运行,程序跑错位置

链接 不能再使用OS相关的代码 标准库 ld: arm-none-linux-gnueabihf-ld -o build hello.o 仍然有问题

make 命令 语法规则:

目标:依赖 <TAB>命令

cmake 构建工程管理器的工具: make qmake

工程管理器: 实现一个约束关系, 目标 和 依赖 之间 存在一定的 执行关系。时间戳来决定 依赖是否编译生成目标的规则

2. Bootloader

Bootloader是硬件启动的引导程序,是启动操作系统的根本;是在操作系统内核或用户应用程序运行之前运行的一段小程序。

2.1 Bootloader基本功能

Bootloader不属于操作系统内核,采用汇编语言编写,因此针对不同的CPU体系结构,这一部分代码不具有可移植性;Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。

启动加载模式:在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。

下载模式:在这种模式下,目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到RAM中。然后可以再被 Bootloader写到目标机上的固态存储媒质中,或者直接进行系统的引导。

Bootloader基本功能:初始化硬件;将操作系统内核从Flash拷贝到SDRAM中,如果是压缩格式的内核,还要解压缩; 改写系统的内存映射,原先Flash起始地址映射为0地址,这时需要将RAM的起始地址映射为0; 提供Linux内核的启动参数; 启动Linux内核; 设置堆栈指针并将bss段清零将来执行C语言程序和调用子函数时要用到; 改变pc值,使得CPU开始执行真正的操作系统内核。

Bootloader启动:系统加电或复位后,所有CPU都会从某个地址开始执行;嵌入式系统的开发板都要把板上ROM或FLASH映射到这个地址。

2.2 Uboot

U-boot的特点: 代码结构清晰、易于移植(见程序结构) 支持多种处理器体系结构(见程序结构cpu目录) 支持众多开发板(目前官方包中有200多种,见程序结构board目录) 命令丰富、有监控功能 支持网络协议、USB、SD等多种协议和设备 支持文件系统 更新较活跃,使用者多,有助于解决问题

2.3 烧写、验证

2.3.1 配置Uboot支持当前开发板

配置arch目录下,哪个目录激活、配置其他目录中,哪些.c .S编译:

make ARCH=arm CROSS_COMPILE=XXXXX mx6ull_fire_mmc_defconfig

推荐做法:把ARCH=arm CROSS_COMPILE=XXXXX变量 ,变为激活脚本,使用:source ...

make mx6ull_fire_mmc_defconfig 配置make选项 make -j4 生成Uboot镜像 *.o u-boot ELF u-boot-nodtb.bin binary +dtb + image u-boot-dtb.imx 可烧写到存储器上的镜像文件

清空SD卡前40M: sudo dd iflag=dsync oflag=dsync if=/dev/zero of=/dev/sdb bs=512 count=8192

烧写 imx文件: sudo dd iflag=dsync oflag=dsync if=u-boot-dtb.imx of=/dev/sdb seek=2

uboot配置信息:mx6ull_fire_mmc_defconfig

Linux系统启动时的变量运行轨迹: /etc/profile文件 全局有效 ~/.bashrc 局部有效 PATH的目录找工具 ---- 配置给.bashrc export PATH=$PATH:/opt/arm-none-linux-gnueabihf-9.2/bin 配置Makefile ARCH CROSS_COMPILE

2.3.2 Uboot的常用命令
  1. bdinfo: 打印开发板的信息

  1. 系统启动时,倒计时,便于进行交互

  1. 环境变量: 设置环境变量 setenv abc 100, 查看环境变量 printenv printenv abc, 保存环境变量 saveenv

  1. bootdelay 变量控制倒计时的情况

  1. 查看内存里的信息 md

2.3.4 使用UDP协议下的文件传输软件 tftp 宿主机、目标机数据通信

C / S: 服务器:ubuntu tftp的服务 【安装服务、配置服务、重启服务】

sudo apt install tftpd-hpa sudo vim /etc/default/tftpd-hpa TFTP_USERNAME="rocky" TFTP_DIRECTORY="/home/rocky/ebf/out" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure" sudo service tftpd-hpa restart

客户端: Uboot tftp 目标位置 文件名

tftp 0x80800000 abc.txt 从tftp服务器中下载abc.txt文件到开发板的0x80800000的位置上。默认没有指定 服务器IP(环境变量serverip)和端口(默认行为 69)。

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值