系统移植,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,一经查实,立即删除!

相关文章

‘HEAD‘ 是 HTTP 请求的一种方法

一、名词解释 ‘HEAD’ 是 HTTP 请求的一种方法&#xff0c;它与 ‘GET’ 方法类似&#xff0c;但有一些关键区别。 当你使用 ‘GET’ 请求时&#xff0c;服务器会返回请求的资源&#xff08;例如 HTML 页面或文件内容&#xff09;。而当你使用 ‘HEAD’ 请求时&#xff0c;服务…

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

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

【Rust】第六节:结构体

0 前言 结构体&#xff0c;struct&#xff0c;听到这个名字大家可能会感觉“哇&#xff01;好熟悉&#xff01;”&#xff0c;毕竟在大学时学习c/cpp的时候已经接触过很多次了&#xff0c;实际上也确实很类似&#xff0c;即使有些不同&#xff0c;比如“所有权系统”&#xff…

字符金字塔(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 操作…

docker面试题(一)

问题1&#xff1a;Docker的工作原理是什么&#xff1f; 答案1&#xff1a;Docker利用Linux内核的容器化技术&#xff0c;如命名空间&#xff08;namespaces&#xff09;和控制&#xff08;cgroups&#xff09;&#xff0c;来实现应用程序的隔离和封装。它使用镜像作为构建和分…

02.Elasticsearch应用(二)

Elasticsearch应用&#xff08;二&#xff09; 1.ElasticSearch-head 参考链接 https://github.com/mobz/elasticsearch-head 是什么 ElasticSearch可视化工具&#xff0c;跟Kibana差不多 四种运行方式 第一种&#xff1a;使用内置服务器运行 git clone git://github.c…

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

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

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

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

ubuntu16程序kill后没有及时释放端口

当你在Ubuntu 16上使用kill命令结束一个程序后&#xff0c;如果该程序正在使用的端口没有被及时释放&#xff0c;可能是因为该程序在被结束时还有连接处于活动状态&#xff0c;系统会等待这些连接自然结束。 如果你想强制快速释放该端口&#xff0c;可以使用以下步骤&#xff…

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

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

AI时代的创新工具:如何利用AI生成独具个性的XMind思维导图?

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff0c;物联网搬砖工一名&#xff0c;致力于为大家淘出更多好用的AI工具&#xff01; 背景 随着互联网的发展&#xff0c;越来越多的人开始使用Markdown来编写文档。Markdown是一种轻量级的标记语言&#xff0c;它允许人们使…

openssl3.2/test/certs - 031 - purpose variants: clientAuth

文章目录 openssl3.2/test/certs - 031 - purpose variants: clientAuth概述笔记END openssl3.2/test/certs - 031 - purpose variants: clientAuth 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! \file my_openssl_linux_log_doc_031.txt \note openssl3.2/tes…

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

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;即可看到网站的源码…

【C++基础】认识回调函数

1. 什么是回调函数&#xff1a; 函数指针的调用&#xff0c;即是一个通过函数指针调用的函数&#xff1b; 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;就说这是回调函数。 In co…

备考CSP-J—贪心

额……既然是备考&#xff0c;那么一定要动脑筋&#xff0c;一共5题&#xff0c;大家好好思考一下。 一&#xff1a;P1250 种树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 二&#xff1a;P1020 [NOIP1999 提高组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn…