系统移植,GNU命令,Uboot移植

一.GNU命令

1、addr2line

把程序地址转换为文件名和行号 做·调试

2、ar

建立,修改,提取归档文件

3、Id:GNU

arm-none-linux-gnueabi-ld start.o main.o -Tmap.lds -o uart.elf

链接器

4、as

主要用来编译GNU编译器gcc输出的汇编文件,产生的目标文件由链接器Id链接 类似于gcc -c

5、objcopy/arm-linux-objcopy(文件格式转换)

arm-linux-gnueabi-objcopy -o binary uart.elf uart.bin

6、objdump

显示一个或者更多目标文件的信息,主要用于反编译

eg:

gcc -g test.c

sudo dmesg -c //记录日志

./a.out

sudo dmesg // 查看日至信息如下

5001.031629\] a.out\[32094\]: segfault at 0 ip 000055f94062713d sp 00007ffcad1003d0 error 6 in a.out\[55f940627000+1000

分析:ip 000055f94062713d-55f940627000+1000 => 0x113d地址处的指令出错1了

查找出错的指令 addr2line/objdump

​ 方法一:addr2line 0x113d 得到文件名和行号

方法二: objdump -SI a.out > t_s //得到反编译文件

vi t_s //定位到113d可以找到出错指令了

7、strip:丢弃目标文件中的全部或者特定符号,减小文件体积

eg:

strip a.out

二.bootloader移植

1.概念

是内核运行之前运行的一小段程序;

主要是对硬件初始化,为操作系统运行做准备;

启动加载内核;

2.特点

不属于操作系统;

采用汇编和C编程;

针对特定的cpu特定的板子定制的;

3.操作模式

交互模式:适用bootloader移植人员

自启动模式:适用与系统移植的人员

4.bootloader的两个阶段

1)汇编阶段

基本的硬件初始化,例如:始时钟、内存。。。

自搬移

初始化堆栈及清空bss,准备C环境

2)C阶段

初始化用到的所有的硬件,例如:flash、uart、网卡....

等待输入命令:pri/set/save....

执行命令

三.uboot移植

1.特点

代码结构清晰、易于移植(见目录结构)

支持多种处理器体系结构(见arch目录)

支持众多开发板(目前官方包中有200多种,见board目录)

命令丰富、有监控功能

支持网络协议、USB、SD等多种协议和设备

支持文件系统

更新较活跃,使用者多,有助于解决问题

2.命令

1)pri/printenv 显示所有环境变量

2)set/setenv 设置新的环境变量

set ipaddr 192.168.7.147

3)save/savenv 保存环境变量

save

  1. tftp //网络下载文件

tftp 0x40008000 led.bin //下载led.bin到内存

  1. loadb //通过串口kermit协议下载二进制数据

loadb 0x40008000

go 0x40008000

6)movi命令

tftp u-boot.bin 0x40008000

movi write uboot 0x40008000 //将内存0x40008000地址处的内容写到EMMC的uboot区

7)bootcmd 自启动命令

set bootcmd tftp 0x41000000 uImage\;tftp 0x42000000 exynos4412-fs4412.dtb

save

8)go addr 执行内存中的二进制代码,简单的跳转到指定地址

go 0x40008000

9)bootm kernel-addr ramdisk-addr dtb-addr

3.uboot的执行过程

1)第一阶段(汇编阶段)

设置CPU工作模式svc、关中断、关MMU、关catch

内存初始化、时钟初始化

自搬运(不需要)

设置堆栈、清空BSS段

2)第二阶段(C阶段)

各种硬件初始化,GPIO、串口、网口......

执行命令

加载内核

四.uboot源码分析

找入口(arch/arm/cpu/armv7/start.S) <- 链接脚本 <- arch/arm/cpu/u-boot.lds <- Makefile

_start(arch/arm/cpu/armv7/start.S)://入口

reset:

--|设置CPU的工作模式为SVC

--|设置异常向量表

--|bl cpu_init_cp15 //关MMU和catch

--|bl cpu_init_crit //

--| b lowlevel_init (board/samsung/fs4412/lowlevel_init.S)

--|if(uboot is not ram)

--|时钟初始化

--|内存初始化

--|bl uart_asm_init 串口初始化

--|bl tzpc_init trust zone初始化

--|bl _main(arch/arm/lib/crt0.S)

--|初始化堆栈,清bss ,准备C环境

--|ldr pc, =board_init_r(arch/arm/lib/board.c)

--|初始化各种硬件(catch flash 网卡 串口 内存 电源 ....)

--|for(;;)

{

main_loop();//等待命令 执行命令

}

五.uboot移植

1.明确需求

uboot能够启动加载内核即可;

2.准备资料

3.确认是否支持当前CPU(arch/arm/cpu/armv7/exynos)

不支持:换uboot版本 找芯片厂商要

支持: go 4

4.确认是否支持当前板子(board/samsung/fs4412)

不支持: 换uboot版本 找板子厂商 借鉴:和板子芯片同芯片的板子

支持:go 5

5.移植

1)借鉴origen板子

cp include/configs/origen.h include/configs/fs4412.h

cp board/samsung/origen board/samsung/fs4412 -a

2)vi boards.cfg //添加fs4412,借鉴origen

fs4412 arm armv7 fs4412 samsung exynos

3)修改Makefile

#ifeq ((HOSTARCH),(ARCH))

CROSS_COMPILE ?= arm-linux-

#endif

4)make fs4412_config //让uboot识别fs4412并编译

5)make //编译 u-boot.bin

【验证】u-boot.bin是否能够启动加载内核

方法一:SD卡验证

使用SD烧写根据将 u-boot.bin 烧写到SD卡中,然后拨码开关拨到1000,板子上电看效果

方法二:EMMC验证

SD卡启动(1000) -> tftp 0x40008000 u-boot.bin -> movi write uboot 0x40008000 -> 切换拨码开关0111启动看效果

相关推荐
Joshua-a17 小时前
macOS下arm编译缺少stdint.h等问题
arm开发·macos
蚂蚁舞20 小时前
在arm架构的Debian系统手动安装和卸载Mysql8的操作
arm开发·debian·安装mysql·mysql8·卸载mysql
m0_5713728220 小时前
嵌入式学习——ARM 体系架构1
arm开发·学习
生涯にわたる学び1 天前
自旋锁/互斥锁 设备树 iic驱动总线 day66 67 68
arm开发
李小白202002021 天前
windows 10系统安装arm虚拟机
arm开发
亿道电子Emdoor3 天前
【ARM】PACK包管理
arm开发
wypywyp3 天前
基于arm芯片的驱动开发——温湿度传感器dht11
arm开发·驱动开发
亿道电子Emdoor4 天前
【ARM】MDK如何实现使用Hex文件完成程序烧录
arm开发·stm32·单片机
彻骨寒风4 天前
在麒麟 ARM (aarch64)安装OpenJDK11和elasticsearchkibana
运维·arm开发·jenkins
2301_1472583695 天前
ARM - GPIO 标准库开发
arm开发