?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
? ? 是内核运行之前运行的一小段程序;
? ? 主要是对硬件初始化,为操作系统运行做准备;
? ? 启动加载内核;
? ? 不属于操作系统;
? ? 采用汇编和C编程;
? ? 针对特定的cpu特定的板子定制的;
? ? 交互模式:适用bootloader移植人员
? ? 自启动模式:适用与系统移植的人员
? ? ? ? 基本的硬件初始化,例如:始时钟、内存。。。
? ? ? ? 自搬移
? ? ? ? 初始化堆栈及清空bss,准备C环境
? ? ? ? 初始化用到的所有的硬件,例如:flash、uart、网卡....
? ? ? ? 等待输入命令:pri/set/save....
? ? ? ? 执行命令
? ? 代码结构清晰、易于移植(见目录结构)
? ? 支持多种处理器体系结构(见arch目录)
? ? 支持众多开发板(目前官方包中有200多种,见board目录)
? ? 命令丰富、有监控功能
? ? 支持网络协议、USB、SD等多种协议和设备
? ? 支持文件系统
? ? 更新较活跃,使用者多,有助于解决问题
? ? 1)pri/printenv ?显示所有环境变量
? ? 2)set/setenv ? ?设置新的环境变量
? ? ? ? set ipaddr 192.168.7.147
? ? 3)save/savenv 保存环境变量
? ? ? ? save
? ? 4) tftp //网络下载文件
? ? ? ? tftp 0x40008000 led.bin //下载led.bin到内存
? ? 5) 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
? ? ? ? 设置CPU工作模式svc、关中断、关MMU、关catch
? ? ? ? 内存初始化、时钟初始化
? ? ? ? 自搬运(不需要)
? ? ? ? 设置堆栈、清空BSS段
? ? ? ? 各种硬件初始化,GPIO、串口、网口……
? ? ? ? 执行命令
? ? ? ? 加载内核
找入口(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能够启动加载内核即可;
? ? 不支持:换uboot版本 找芯片厂商要?
? ? 支持: go 4
? ? 不支持: 换uboot版本 找板子厂商 借鉴:和板子芯片同芯片的板子
? ? 支持:go 5
? ? ? ? cp include/configs/origen.h include/configs/fs4412.h
? ? ? ? cp board/samsung/origen board/samsung/fs4412 -a
? ? ? ? fs4412 ? ? ? ? arm ? ? armv7 ? ?fs4412 ?samsung ? ?exynos
? ? ? ? #ifeq ($(HOSTARCH),$(ARCH))
? ? ? ? ? ? CROSS_COMPILE ?= arm-linux-
? ? ? ? #endif
【验证】u-boot.bin是否能够启动加载内核
? ? 方法一:SD卡验证
? ? ? ? 使用SD烧写根据将 u-boot.bin 烧写到SD卡中,然后拨码开关拨到1000,板子上电看效果
? ? 方法二:EMMC验证
? ? ? ? SD卡启动(1000) -> tftp 0x40008000 u-boot.bin -> movi write uboot 0x40008000 -> 切换拨码开关0111启动看效果