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

一、栈的复习

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 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/427239.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity中UGUI在Mask剪裁粒子特效的实现

在Unity使用Mask是剪裁不了粒子特效的&#xff0c;之前有想过RenderTexture来实现&#xff0c;不过使用RenderTexture不适合用于很多个特效&#xff0c;因为RenderTexture依赖Camera的照射&#xff0c;如果在背包中每种道具都有不同的特效&#xff0c;那使用RenderTexture则需要…

VPN的基本原理以及配置

实验如上图所示&#xff1a; 首先给各个设备配置IP地址 其次再给r1和r5做pap认证 给r2和r5做chap认证 r5上的配置如下图所示&#xff1a; r3和r5之间用hdlc进行封装&#xff1a; r5: 给r1&#xff0c;r2&#xff0c;r3配置MGRE&#xff1a;使得可以通过VPN技术进行通讯&#…

ESXI 本地和虚拟机之间可以自由复制和粘贴

文章目录 ESXI 本地和虚拟机之间可以自由复制和粘贴 ESXI 本地和虚拟机之间可以自由复制和粘贴 web访问esxi&#xff0c;然后&#xff1a; 1、右击新建的虚拟机&#xff0c;确保是在关机状态下&#xff0c;点击编辑设置 2. 找到 虚拟机选项→高级→常规→配置参数 3、点击添加…

【强化学习】QAC、A2C、A3C学习笔记

强化学习算法&#xff1a;QAC vs A2C vs A3C 引言 经典的REINFORCE算法为我们提供了一种直接优化策略的方式&#xff0c;它通过梯度上升方法来寻找最优策略。然而&#xff0c;REINFORCE算法也有其局限性&#xff0c;采样效率低、高方差、收敛性差、难以处理高维离散空间。 为…

ansible 常用模块

目录 1.ping模块 2.command模块 3. shell模块 4.copy模块 5.file模块 6.fetch模块 7.cron模块 8.yum模块 9.service模块 10.user模块 11.group模块 12.script 模块 13.setup模块 14. get_url模块 15.stat模块 16.unarchive模块 1.ping模块 使用ansible db1 -m pin…

前端echarts图形报表常见的样式配置

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f415;1.深色主题&#x1f415;2.改变柱状图颜色&#x1f415;突然发现去问ai&#xff0c;更容易理解&#xff0c;那就不总结了 &#x1f412;个人主页 &#x1f3c5;…

精通 VS 调试技巧,学习与工作效率翻倍!

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ ​ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; ​ 所属专栏&#xff1a;C语言学习 ​ 贝蒂的主页&#xff1a;Betty‘s blog 1. 什么是调试 当我们写代码时候常常会遇见输出结果不符合我们预…

【C++】命名空间详解

目录 前言 命名空间的定义 命名空间的使用 前言 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称将都存 在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化&#xff0c; 以…

微信小程序开发创建component组件,报错WXML file not found解决方案

报错如下&#xff1a; 解决方案&#xff1a; 在组件.json文件加上"styleIsolation": "apply-shared",&#xff1a;

信号量机制解决经典同步互斥问题

生产者 / 消费者问题、读者 / 写者问题和哲学家问题是操作系统的三大经典同步互斥问题。本文将介绍这三个问题的基本特点以及如何用信号量机制进行解决。 在分析这三个问题之前&#xff0c;我们首先需要了解用信号量机制解决同步互斥问题的一般规律&#xff1a; 实现同步与互斥…

详解JavaScript异步编程之Promise

一、前言 JavaScript是⼀⻔典型的异步编程脚本语⾔&#xff0c;在编程过程中会⼤量的出现异步代码的编写&#xff0c;在JS的整个发展历程中&#xff0c;对异步编程的处理⽅式经历了很多个时代&#xff0c;其中最典型也是现今使⽤最⼴泛的时代&#xff0c;就是Promise对象处理异…

curl命令导致你下载的文件为空原因分析

文章目录 1.前言2. 通过curl -O 下载远端文件2.1 执行curl -O下载远端文件2.2 通过curl -v 查看详细的请求和响应的信息 3.通过在curl -O 中增加 -L 参数保证curl能够自动跟踪和请求远端返回的重定向地址4.结论 1.前言 最近在进行线上项目调试的过程中需要安装调试工具&#xf…