系统移植 day2 bootloader->u-boot 移植

发布时间:2024年01月24日

一、栈的复习

1、满栈:当堆栈指针SP总是指向最后压入堆栈的数据,称为满栈;
2、空栈:当堆栈指针SP总是指向下一个将要放入数据的空位置,称为空栈;
满栈状态下,先移动指针,后赋值. 空栈状态下,先赋值,后移动指针(记忆:空栈已经是指向下个元素了,肯定就只能先赋值,后移动。相应的,满栈就是先移动)
1、升栈:随着数据的入栈,SP指针从低地址向高地址移动,称为升栈; ?上面先出
2、降栈:随着数据的入栈,SP指针从高地址向低地址移动,称为降栈; ?下面先出
ARM处理器S3C2440采用的是满栈、降栈
栈长大:有效数据在变多

二、系统移植的一些概念

自启动模式:开机后,不管,加载内核,进入操作系统linux模式,系统移植人员使用
?? ?如果超时T T T:检查服务器启动 检查链接(ping通)

交互模式:开机后,快速按回车,FS # ?bootloader移植人员使用

uboot是bootloader的一种 是一段程序

三、GNU命令

1.addr2line/arm-linux-addr2line
?? ?功能:把程序地址转换为文件名和行号
2.as
?? ?类似:gcc -c
3.ld/arm-linux-ld ?GNU链接器
?? ?eg:
?? ??? ?arm-none-linux-gnueabi-ld start.o main.o -Tmap.lds -o uart.elf
4.objcopy/arm-linux-objcopy : 文件格式转换
?? ?eg:
?? ??? ?arm-none-linux-gnueabi-objcopy -O binary uart.elf uart.bin //elf -> bin
5.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 ina.out[55f940627000+1000]
?? ??? ?【分析】ip:000055f94062713d-55f940627000+1000 => 0x113d地址处的指令出错了
?? ??? ?【查找出错的指令】addr2line/objdump
?? ??? ??? ?方法一:addr2line 0x113d 得到文件名和行号
?? ??? ??? ?方法二:
?? ??? ??? ??? ?objdump -Sl a.out > t_s ?//得到反汇编文件
?? ??? ??? ??? ?vi t_s //定位到113d可以找到出错指令了
?? ??? ??? ??? ?
6.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
?? ?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
?? ??? ?
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启动看效果
? ? ? ??
【效果】
?? ?指令前面变成FS4412

八、Linux下的mount命令

mount命令使用详解_51CTO博客_mount命令详解? ? ? ? ? ? ? ? 作者Blind_fish?

文章来源:https://blog.csdn.net/m0_58443060/article/details/135830594
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。