系统移植,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启动看效果

相关推荐
韦德斯14 小时前
嵌入式Linux的RTC读写操作应用
linux·运维·c语言·arm开发·实时音视频
byte轻骑兵14 小时前
嵌入式 ARM Linux 系统构成全解:从硬件到应用层层剖析
linux·arm开发·arm·嵌入式开发
思尔芯S2C17 小时前
面向未来的智能视觉参考设计与汽车架构,思尔芯提供基于Arm技术的创新方案
arm开发·架构·汽车·iot·fpga原型验证·prototyping·智慧视觉
Eternal-Student2 天前
【docker了解】如何将x86镜像转换为适用于Jetson的ARM镜像
arm开发·docker·容器
不怕犯错,就怕不做2 天前
修复kernel编译栈帧大小异常问题error: the frame size of 1928 bytes is larger than 1024 bytes
linux·arm开发·驱动开发
憧憬一下3 天前
UART硬件介绍
arm开发·嵌入式硬件·串口·嵌入式·linux驱动开发
Petal9909123 天前
UEFI学习笔记(十八):ARM电源管理之PSCI和SCMI概述
arm开发·笔记·学习·uefi
古月居GYH4 天前
一文了解ARM内部架构
arm开发·架构
白书宇4 天前
13.100ASK_T113-PRO RTC实验
linux·arm开发·驱动开发·嵌入式硬件·物联网·硬件工程
简简单单一天吃六顿4 天前
rootfs根文件系统在Linux下制作动态库
linux·服务器·arm开发·iot