系统移植 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.mfbz.cn/a/345239.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

量化交易学习1

一、股票数据基本分类 可分为&#xff08;1&#xff09;技术面数据和&#xff08;2&#xff09;基本面数据 &#xff08;1&#xff09;技术面数据 技术面数据是通过股票的历史价格和交易量等市场数据进行计算和分析得出的指标。常用的技术指标包括移动平均线、相对强弱指标、…

服务器数据恢复—EVA存储raid5硬盘离线的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌EVA某型号存储&#xff0c;底层是RAID5阵列&#xff0c;划分了若干lun。 服务器故障&分析&#xff1a; 该存储设备中raid5阵列有两块硬盘掉线&#xff0c;存储中的lun丢失。 将故障服务器存储中的所有磁盘编号后取出&#xff0c;硬件…

磁盘d盘满了怎么清理?几个步骤轻松搞定!

当您的电脑D盘快满了的时候&#xff0c;需要对电脑D盘进行清理&#xff0c;以节省空间并使电脑运转更加流畅。下面是一些电脑清理的方法和工具介绍。 一、清理磁盘 1、首先我们打开此电脑 2、然后找到我们要清理的磁盘 3、接着我们右键单击属性选项 4、然后我们点击磁盘清理 …

locust快速入门--自定义用户增长形状

背景&#xff1a; locust 默认的用户增长模式&#xff0c;不方便分析不同用户量大对服务器的压力影响。因此&#xff0c;需要对用户增加的图形进行自定义。 locust官网说明&#xff1a;https://docs.locust.io/en/stable/custom-load-shape.html 自定义不同时间段用户的数量…

Linux 驱动开发基础知识——Hello驱动程序(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

CentOS安装Flume

CentOS安装Flume 一、简介二、安装1、下载2、解压3、创建配置文件4、启动flume agent5、验证 一、简介 Flume is a distributed, reliable, and available service for efficiently collecting, aggregating, and moving large amounts of log data. It has a simple and flexi…

防火墙接口配置实验

1、搭建拓扑 2、给云端添加网络&#xff0c;来实现真机与虚拟机的连接 3、 给防火墙g0/0/0口配置IP&#xff0c;由于我云端绑定的是192.168.100.10&#xff0c;所以这里IP配置为192.168.100.1/24,使用命令开启防火墙远程连接的服务&#xff0c;之后便可通过web远程登陆防火墙 …

JavaScript——forEach()方法

代码示例&#xff1a;数组变量.forEach(值变量名 > {代码块}) //每遍历一个值&#xff0c;就作为形参传入给代码块&#xff0c;执行一次该函数头&#xff0c;继续遍历 举例说明&#xff1a; <script>let arr [1, 2, 3, 4];//arr.forEach(val > {});arr.forEach(v…

OceanBase创建租户

租户是集群之上的递进概念&#xff0c;OceanBase 数据库采用了多租户架构。 集群偏部署层面的物理概念&#xff0c;是 Zone 和节点的集合&#xff0c;租户则偏向于资源层面的逻辑概念&#xff0c;是在物理节点上划分的资源单元&#xff0c;可以指定其资源规格&#xff0c;包括…

大数据平台红蓝对抗 - 磨利刃,淬精兵!

背景 目前大促备战常见备战工作&#xff1a;专项压测&#xff08;全链路压测、内部压测&#xff09;、灾备演练、降级演练、限流、巡检&#xff08;监控、应用健康度&#xff09;、混沌演练&#xff08;红蓝对抗&#xff09;&#xff0c;如下图所示。随着平台业务越来越复杂&a…

滚动条样式修改

对于 Chrome 和 Safari 用户 如果正在使用基于 WebKit 的浏览器&#xff0c;如 Chrome 或 Safari&#xff0c;可以使用以下代码来自定义滚动条样式。将此代码加入到你的 CSS 文件中&#xff1a; /* 设置滚动条的宽度 */ ::-webkit-scrollbar {width: 6px; }/* 设置滚动条轨道…

C++设计模式之迭代器模式

【声明】本题目来源于卡码网&#xff08;https://kamacoder.com/&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】 --什么是迭代器模式&#xff08;第19种设计模式&#xff09; 迭代器模式是⼀种行为设计模…

蓝桥杯---三羊献瑞

观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。 答案 代码 public class _03三羊献瑞 {public static void main(String[] args) {//c 生 b 瑞 g 献 d 辉…

算法练习-螺旋矩阵(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 给定一个正整数n&#xff0c;生成一个包含1到 n^2 所有元…

BACnet网关BL121BN 实现稳定可靠、低成本、简单的楼宇自控协议BACnet转OPC UA解决方案

随着楼宇自控系统的迅猛发展&#xff0c;人们深刻认识到在楼宇暖通行业中&#xff0c;实时、可靠、安全的数据传输至关重要。在此背景下&#xff0c;高性能的楼宇暖通数据传输解决方案——协议转换网关应运而生&#xff0c;广泛应用于楼宇自控和暖通空调系统应用中。 钡铼技术…

【数据结构】 循环队列的基本操作 (C语言版)

目录 一、顺序队列 1、顺序队列的定义&#xff1a; 2、顺序队列的优缺点&#xff1a; 二、循环队列 1、循环队列的定义&#xff1a; 2、循环队列的优缺点&#xff1a; 三、循环队列的基本操作算法&#xff08;C语言&#xff09; 1、宏定义 2、创建结构体 3、循环队…

PPO学习

openai用tf实现的真的看不懂&#xff0c;大佬的世界… PPO的详细细节 1. 奖励模型和策略的价值头将 query 和 response 的连接作为输入 奖励模型和策略的价值头 不 仅仅查看响应。相反&#xff0c;它将 query 和 response 连接在一起&#xff0c;作为 query_response def ge…

如何群发邮件outlook?外贸邮件群发教程?

outlook怎么设置邮件群发&#xff1f;outlook邮箱群发邮件方法&#xff1f; 在日常生活中&#xff0c;我们经常需要给多个人发送相同的邮件。这时候&#xff0c;群发邮件就显得尤为重要。Outlook作为一款常用的办公软件&#xff0c;提供了强大的邮件群发功能。蜂邮EDM就教大家…

Linux 文件:IO接口详解及实操

一、C语言中的文件IO读写操作 在c语言文件中&#xff0c;创建、打开、读、写操作可以通过如下的代码进行&#xff1a; 1.1写文件 通过w指令对文件进行写入操作时&#xff0c;编译器会先将文件内容清空然后重新写入。 #include <stdio.h> #include <string.h> i…

前端上传大文件使用分片上传

前提:分片上传针对于一些大的文件、普通大小的文件使用element中的上传组件可以实现效果,例如几G的文件就会比较卡,所以这时候就需要用到分片上传~ 前端及后端分片上传笔记 效果:(上传进度展示) 效果:(上传成功的效果展示) 1、 新建一个上传组件 2、使用vue-simple-…
最新文章