系统移植,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

    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启动看效果

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

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

相关文章

嵌入式-stm32-江科大-EXTI外部中断

一&#xff1a;EXTI外部中断&#xff08;external interrupt&#xff09; 1.1 STM32 中断系统 中断是指在主程序运行过程中&#xff0c;出现了特定的中断触发条件&#xff08;中断源&#xff09;&#xff0c;使得CPU暂停当前的程序&#xff0c;转而去处理中断程序&#xff0c;…

字符金字塔(C语言刷题)

个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 题目描述 请打印输出一个字符金字塔&#xff0c;字符金字塔的特征请参考样例 输入描述: 输入一个字母&#xff0c;保…

5.6 误差相关统计与计算

文章目录 1、平均值2、首次作为参考基准3、绝对差值4、方差、均方差、CV值4.1 方差&#xff08;variance&#xff09;4.2 均方差、标准差&#xff08;Standard Deviation&#xff09;4.3 CV值 1、平均值 Excel 公式&#xff1a;AVERAGE(C4:C20) 2、首次作为参考基准 Excel 操作…

ITSS服务工程师:开启IT职业生涯的金钥匙

&#x1f525;ITSS是中国电子技术标准化研究院推出的&#xff0c;涵盖了“IT服务工程师”和“IT服务经理”的系列培训。它不仅满足GB/T 28827.1的符合性评估要求&#xff0c;还助力IT服务资质升级。 &#x1f3af;“IT服务工程师”培训从服务技术、服务技巧和服务规范三大板块&…

java复习篇 数据结构:链表第二节 哨兵

目录 单向链表哨兵 初始 头插 思路 代码 尾插 思路 遍历 遍历验证头插 尾插代码 尾插测试 get 思路 代码 测试 insert 思路 代码 测试 remove 移除头结点 提问 移除指定位置 测试 单向链表哨兵 单向链表里面有一个特殊的节点称为哨兵节点&#xff0c;…

C# AsyncLocal 是如何实现 Thread 间传值

一&#xff1a;背景 1. 讲故事 这个问题的由来是在.NET高级调试训练营第十期分享ThreadStatic底层玩法的时候&#xff0c;有朋友提出了AsyncLocal是如何实现的&#xff0c;虽然做了口头上的表述&#xff0c;但总还是会不具体&#xff0c;所以觉得有必要用文字图表的方式来系统…

强化数据资产管理,迎接数据资产 “入表” 新时代

2024年伊始&#xff0c;数据要素产业利好政策密集出台&#xff0c;数据资产“入表”成为了大势所趋。数据要素顶层设计方案加速落地&#xff0c;推动企业数字化转型提档加速&#xff0c;提升数据管理能力、实现数据资产价值成为企业下一阶段核心竞争力构建的关键。 01 数据资产…

pytorch与tensorflow如何选择?

目录 1.动态图和静态图1.1 tensorflow是静态图1.2 pytorch动态图 2. 易用性3. 编程语言4. 性能和扩展性5. 社区支持和生态系统 1.动态图和静态图 1.1 tensorflow是静态图 如上图&#xff1a; 定义计算图&#xff08;公式&#xff0c;包括定义变量x,y ,zx*y&#xff09;给公式…

Docker中安装 RabbitMQ

1、下载 RabbitMQ 镜像 下载最新版本的镜像&#xff1a; docker pull rabbitmq更多版本的镜像可以访问 Docker 官网&#xff1a;https://hub.docker.com/_/rabbitmq?tabtags 2、创建并运行 RabbitMQ 容器 启动命令&#xff1a; docker run -d -p 15672:15672 -p 5672:567…

垃圾回收小程序:环保与便捷的完美结合

一、引言 随着科技的发展&#xff0c;移动应用程序已经成为人们日常生活中不可或缺的一部分。其中&#xff0c;废品回收小程序以其独特的价值和功能&#xff0c;日益受到人们的关注和青睐。本文将探讨废品回收小程序开发的重要性、功能特点、技术实现和未来发展趋势。 二、废…

爬虫笔记(二):实战58二手房

第一&#xff1a;给大家推荐一个爬虫的网课哈&#xff0c;码起来 第二&#xff1a;今夜主题&#xff1a;通过xpath爬取58二手房的title信息&#xff0c;也就是标红的位置~ 第三&#xff1a;先分析一波title所在的位置 打开按下f12打开抓包工具&#xff0c;即可看到网站的源码…

JVM-初始JVM

什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 Java源代码执行流程如下&#xff1a; JVM的功能 1 - 解释和运行 2 - 内存管理 3 - 即时编译 解释和运行 解释…

【二】车载FrameWork添加系统服务

自定义系统服务 常见的AMS、PWS、WMS等等都是系统服务&#xff0c;运行于system_server进程&#xff0c;并且向servicemanager进程注册其Binder以便其他进程获取binder与对应的服务进行通信。为了新增自定义系统服务&#xff0c;我们可以参考AMS等原生系统服务编写如下文件&am…

Python教程:拆分多级目录的方法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 实现多级目录差分&#xff0c;举例说明如下&#xff1a; 假设现有的目录结构如下&#xff1a;1、2、2.1、2.2、2.3、2.4、3、4、5、6、6.1、6.1.1、6.1.2、6.1.3、6…

WinSCP下载安装并实现远程SSH本地服务器上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

【Unity学习笔记】第十一 · 动画基础(Animation、状态机、root motion、bake into pose、blendTree、大量案例)

转载引用请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/132081959 作者&#xff1a;CSDN|Ringleader| 如果本文对你有帮助&#xff0c;不妨点赞收藏关注一下&#xff0c;你的鼓励是我前进最大的动力&#xff01;ヾ(≧▽≦*)o 主…

#Uniapp:微信开发者工具运行与打包---打包H5---打包app

微信开发者工具运行与打包 manifest.json 添加上微信小程序AppID ** 如果点击打不开从微信开发者工具先到处本地C:\Users\fjgk-28\Desktop\huanrun\uni-demo\uni-shop\unpackage\dist\dev\mp-weixin 打开 添加上AppID试试** 微信开发者工具上传代码需要 "permission&quo…

Redis——list以及他的应用场景

介绍 &#xff1a;list 即是 链表。链表是一种非常常见的数据结构&#xff0c;特点是易于数据元素的插入和删除并且且可以灵活调整链表长度&#xff0c;但是链表的随机访问困难。许多高级编程语言都内置了链表的实现比如 Java 中的 LinkedList&#xff0c;但是 C 语言并没有实现…

文件防止泄密的措施,公司如何防止电脑泄密(防止信息泄露的6大秘籍)

在当今信息时代&#xff0c;数据安全和信息保密对于企业来说至关重要。然而&#xff0c;泄密事件时有发生&#xff0c;给企业带来巨大的损失和风险。 某泄密事件&#xff1a; 某大型企业发生了一起严重的电脑泄密事件&#xff0c;导致大量客户资料和内部战略规划被泄露。 经过…

网工每日一练(1月25日)

【说明】 某仓储企业网络拓扑结构如图1-1所示&#xff0c;该企业占地500亩。有五层办公楼1栋&#xff0c;大型仓库10栋。每栋仓库内、外部配置视频监控16台&#xff0c;共计安装视频监控160台&#xff0c;SwitchA、服务器、防火墙、管理机、RouterA等设备部署在企业办公楼一层的…