当前位置: 首页 > news >正文

记录第一个启动代码的诞生

        核使用R52,参考汇编模板,一步一步来实现。

        首先是ld文件,这个没啥好说的,主要是关注给vector_table划一块地址、stack地址,如下:

    .text.intvec :{_vectors_start = .;KEEP(*(.text.intvec))_vectors_end = .;} > BOOTROM.irq_stack :{. = ALIGN(16);__IrqStackBase = .;/* Place the irq_stack here. */KEEP(*(.irq_stack)). = irq_stack_size;__IrqStackLimit = .;} > ATCMx

        注意哦,我特别没有在这里还对齐处理,原因是想在.S里验证对齐的作用。

        现在开始写vector_table。

1.Vector Table

        默认情况下,R52复位后是在EL2(Hyp mode).

        因此首先是要把EL2、1等级下的中断向量表给做出来,例如:EL2_Vector_Tabel

.macro vector_section label
.section .text.intvec, "ax"
.endmvector_section EL2_VectorTable:ldr pc, = el2_reset_entryldr pc, = el2_undefine_entry...ldr pc, = el2_irq_entryldr pc, = el2_fiq_entry.align 5
EL1_VectorTable:nop...ldr pc, = el1_irq_entryldr pc, = el1_fiq_entry

        注意看,我在table前面加了个宏,这个标签有什么用呢?

        就是将EL2的table放到链接文件指定的section .text.intvec。

        后面我陆续试过,如果EL2table没有这个标签,会直接放到.text段;如果是放在EL2table下面,那么之后的代码会放到.intvec段,所以,这个宏感觉有点像块砖,哪里需要哪里搬。但是我后面又设计了一下,EL2Table放.intvec段,EL1Table放.text,就必须在EL1Table前加.text的放置。除了上述方式,参考#pragma。

        关于EL1的vectorTable定义,我特地没有做el1_reset_entry。因为R52 reset默认进入EL2模式,因此好像不太需要这个entry,直接定义一个el1的处理函数,这里留个口子,看以后是否会遇到reset 进el1的情况。

        此外,对EL1的table做了对齐,.align 5 表示以2^5对齐。

2. Reset_entry

        el2_reset_entry,以word对齐,为啥?我们现在用的32位,因此填充PC肯定是32位。这里没有.word也没关系,编译器会自动处理。

        现在R52进到了el2的reset_entry里,那么首先要做的就是再确认下是不是el2的模式,为啥?因为pc指针指向的只是一个地址,这个地址里可以是el1_vector_table、也可以是el2的。所以要确认,怎么确认?读取cpsr.mode,如果该mode ==hyp,跳转到正式处理hyp的函数里。否则panic。

2.1 hyp_reset_handler

        这里就主要是设置hyp的中断向量表到HVBAR,使能hyp的cache加快启动速度。

        步骤如下:

  1. 设置HVBAR
  2. 使能EL1访问协处理器寄存器的能力
  3. 如有需要、关闭HVC指令(用户模式下非安全态禁用、核处于安全态禁用)
  4. 设置EL1的VBAR
  5. 保存cpsr到SPSR_hyp(返回EL2模式需要用到)
  6. 设置elr_hyp 为 EL1_init (elr(exception linker register))
  7. 使能TCM,使得EL1\2\0均可访问;且配置TCM大小
  8. 根据情况使能或者关闭TCM slave接口
  9. 调用指令eret,进入EL1

2.2 EL1_init

        在EL1_init最先需要做啥?

        毫无疑问如果没有在EL2设置VBAR,那么就要在这里做VBAR。

        第二个事情就是,初始化C运行环境,具体如下:

  1. .bss段清零,防止出现ECC错误
  2. .data段初始化,将rom数据copy至ram
  3. 各种模式的stack初始化,包括svc、abt、und、irq、fiq等

如下:

    cps  #17                        /* FIQ mode */ldr  sp, =__FiqStackLimitcps  #18                        /* IRQ mode */ldr  sp, =__IrqStackLimitcps  #23                        /* Abort mode */ldr  sp, =__AbtStackLimitcps  #27                        /* Undef mode */ldr  sp, =__UndStackLimitcps  #31                        /* System mode */ldr  sp, =__SysStackLimitcps  #19                        /* SVC mode */ldr  sp, =__SvcStackLimitdsbisb

        最后跳转至main

舒服,学到了一些技巧

相关文章:

记录第一个启动代码的诞生

核使用R52,参考汇编模板,一步一步来实现。 首先是ld文件,这个没啥好说的,主要是关注给vector_table划一块地址、stack地址,如下: .text.intvec :{_vectors_start .;KEEP(*(.text.intvec))_vectors_end .;…...

基于STM32的简化版智能手表

一、前言 本文的OLED多级菜单UI为一个综合性的STM32小项目,使用多传感器与OLED显示屏实现智能终端的效果。项目中的多级菜单UI使用了较为常见的结构体索引法去实现功能与功能之间的来回切换,搭配DHT11,RTC,LED,KEY等器…...

揭秘弹幕游戏制作

最近好多人问弹幕游戏,甚至是招人的也要DOTS做弹幕游戏... 实际上目前的弹幕游戏绝大多数应该和DOTS没有半点关系,别忘了DOTS这项技术渲染问题还没能够被合理解决呢 所以目前用的全都是GPU Instance这项技术,于是乎我决定下场写这篇帖子&am…...

2327. 知道秘密的人数;1722. 执行交换操作后的最小汉明距离;2537. 统计好子数组的数目

2327. 知道秘密的人数 核心思想:动态规划,每天的人可以分为三种,可分享秘密的人,不可分享秘密的人,忘记秘密的人。定义f[i]为第i天可分享秘密的人,那么第(idelay ,iforget)天,会增加f[i]个可分…...

【TCPDF】使用TCPDF导出PDF文件

目录 一、安装TCPDF类库 二、安装字体 三、使用TCPDF导出PDF文件 目的:PHP通过TCPDF类库导出文件为PDF。 开发语言及类库:ThinkPHP、TCPDF 效果图如下 一、安装TCPDF类库 在项目根目录使用composer安装TCPDF,安装完成后会在vendor目录下…...

MacBook苹果电脑重装、降级系统

1、下载balenaEtcher镜像启动盘制作工具 https://tails.net/etcher/balenaEtcher-portable.exe 2、选择从文件烧录选择下载好的Mac 镜像文件 百度网盘 请输入提取码(Mac OS 10.10-12版本镜像文件) 第二步选择目标磁盘,这里需要准备一块1…...

Java 解决long类型数据在前后端传递失真问题

问题:雪花算法的id长度为19位,前端能够接收的数字最多只能是16位的,因此就会造成精度丢失,得到的ID不是真正的ID。 解决: 在拦截器中加入Long类型转换,返回给前端string package io.global.iot.common.c…...

IDEA的快捷键大全

快捷键 说明 IntelliJ IDEA 的便捷操作性,快捷键的功劳占了一大半,对于各个快捷键组合请认真对待。IntelliJ IDEA 本身的设计思维是提倡键盘优先于鼠标的,所以各种快捷键组合层出不穷,对于快捷键设置也有各种支持,对…...

简单记一下Vue router 路由中使用 vue-i18n 进行标题国际化

引入状态管理和国际化文件 import store from ../store import i18n from /configs/i18n使用状态管理设置路由当前国际化选项 // 使用状态管理 i18n.locale store.state.setStore.i18n??zh路由中使用i18n { path: /login, name: login, component: LoginPage, meta: { ti…...

【Gitea】 Post “http://localhost:3000/api/internal/hook/pre-receive/aa/bbb“ 异常

引 使用 JGit 做了一个发布代码到 Gitea 的接口,使用该接口发布代码到 http://xxx-local/{name}/{project} ,报了 Post "http://localhost:3000/api/internal/hook/pre-receive/{name}/{project} 相关的异常。具体内容如下: Gitea: In…...

如何使用element-ui相关组件如:el-select,el-table,el-switch,el-pagination,el-dialog

element-ui 官方链接&#xff1a; 组件 | Elementhttps://element.eleme.cn/#/zh-CN/component/installation el-select <!-- 用户类型选择框<template> 看情况使用value选择框绑定的值 命名必须是value不能改v-for"item in Options" options数据源来自于…...

微信小程序+echart实现点亮旅游地图

背景 最近看抖音有个很火的特效就是点亮地图&#xff0c;去过哪些地方&#xff0c;于是乎自己也想做一个&#xff0c;结合自己之前做的以家庭为单位的小程序&#xff0c;可以考虑做一个家庭一起点亮地图的功能。 效果图 过程 1&#xff0c;首先就是得去下微信小程序适配的ec…...

Git(8)——Git命令总结

一、简介 本篇文章将基于Git&#xff08;4&#xff09;——Git命令小总结&#xff0c;补充后续的Git使用命令 二、总结 # 添加远程连接 git remote add origin 远端地址# 推送本地代码 git push origin 分支名称# 拉取远端代码(第一次) git clone 远端克隆地址# 更新远端代码…...

9.15 滴滴笔试

T1&#xff08;二分&#xff09; #include <bits/stdc.h>#define endl \nusing namespace std;typedef long long LL;const int N 1e5 10;int n, k; int a[N];bool check(int mid) {int rec 1e9, cnt 1;for(int i 0; i < n; i ) {int j i;while(j < n &…...

有趣的设计模式——适配器模式让两脚插头也能使用三孔插板

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 场景与问题 众所周知&#xff0c;我们国家的生活用电的电压是220V而笔记本电脑、手机等电子设备的工作压没有这么高。为了使笔记本、手机等设备可以使用220V的生活用电就需…...

2.10 PE结构:重建重定位表结构

Relocation&#xff08;重定位&#xff09;是一种将程序中的一些地址修正为运行时可用的实际地址的机制。在程序编译过程中&#xff0c;由于程序中使用了各种全局变量和函数&#xff0c;这些变量和函数的地址还没有确定&#xff0c;因此它们的地址只能暂时使用一个相对地址。当…...

关于content-type的理解

一.content-type的结论 告诉后端传过去的数据是什么类型的数据 二.没有请求体 (1)没有请求体的情况下content-type没有意义。 (2):图示 里面是没有请求体的 (3)有请求体的情况 二.常见的三种方式 (1)application/x-www-form-urlencoded(默认) 参数的表现形式: 传递之前可以…...

<图像处理> 空间滤波基础二

空间滤波基础二&#xff1a;锐化 锐化的作用的突出灰度中的过渡。图像锐化通过空间微分来实现&#xff0c;微分将增强边缘和其他不连续&#xff08;噪声&#xff09;&#xff0c;不强化灰度变化缓慢的区域。图像锐化也叫做高通滤波&#xff0c;通过高频&#xff0c;抑制低频。…...

Java中的队列Queue

Queue(队列)是一种在计算机科学中常见的数据结构,它基于先进先出(FIFO)的原则,即最先进入队列的元素最先出队。在Java中,Queue是一个接口,定义了一组操作队列的方法,而具体的实现类可以选择性地实现这些方法。 以下是Queue的一些常见用途和操作: 添加元素: 使用off…...

机器学习技术(十)——决策树算法实操,基于运营商过往数据对用户离网情况进行预测

机器学习技术&#xff08;十&#xff09;——决策树算法实操 文章目录 机器学习技术&#xff08;十&#xff09;——决策树算法实操一、引言二、数据集介绍三、导入相关依赖库四、读取并查看数据1、读取数据2、查看数据 五、数据预处理1、选择数据2、数据转码 六、建模与参数优…...

大数据之-kafka学习笔记

Kafka Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 Kafka可以用作Flink应用程序的数据源。Flink可以轻松地从一个或多个Kafka主题中消费数据流。这意味着您可以使用Kafka来捕获和传输…...

虚幻动画系统概述

本文主要整理一下高层次的概述&#xff0c;方便后续查阅 1.动画流程 DCC产出动画文件 -> UE动画导入 -> 动画蓝图驱动&#xff08;类似unity的动画状态机&#xff09; ->动画后处理蓝图驱动&#xff08;例如修型骨&#xff0c;骨骼矫正等后期处理&#xff09; 2.动…...

什么是集成测试?集成测试方法有哪些?

1、基本概念&#xff1a; 将软件集成起来后进行测试。集成测试又叫子系统测试、组装测试、部件测试等。集成测试主要是针对软件高层设计进行测试&#xff0c;一般来说是以模块和子系统为单位进行测试。 2、集成测试包含的层次&#xff1a; 1. 模块内的集成&#xff0c;主要是…...

elementUI中的el-form常用校验规则

elementUI中的el-form常用校验规则: 校验使用方式&#xff1a; rules: {name: [{ required: true, message: 请输入活动名称, trigger: blur },{ min: 3, max: 5, message: 长度在 3 到 5 个字符, trigger: blur }],region: [{ required: true, message: 请选择活动区域, trig…...

蓝桥杯打卡Day9

文章目录 直角三角形最长平衡串 一、直角三角形IO链接 本题思路:本题就是利用欧几里得距离求解即可。 #include <bits/stdc.h>int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);std::cout.tie(nullptr);int T;std::cin>>T;while(T--){int x…...

C# 辗转相除法求最大公约数

辗转相除法求最大公约数 public static void CalcGCD(int largeNumber, int smallNumber, out int GCD){GCD 1;int remain -1;while (remain ! 0){remain largeNumber % smallNumber;GCD smallNumber;largeNumber smallNumber;smallNumber remain;}}...

腾讯mini项目-【指标监控服务重构】2023-08-03

今日已办 a&#xff0c;b两组的trace放到一个分支里 可以看到先前的没看到的 profile trace 的耗时&#xff0c;是由于时间跨度较长&#xff0c;没有滑动到 trace 末尾 明日待办 组长会议汇报项目进度和问题...

redis缓存穿透、击穿、雪崩介绍

缓存穿透 概念 缓存穿透指某一特定时间批量请求打进来并访问了缓存和数据库都没有的key&#xff0c;此时会直接穿透缓存直达数据库&#xff0c;从而造成数据库瞬时压力倍增导致响应速度下降甚至崩溃的风险&#xff1b; 解决方案 一、通过布隆过滤器解决 原理&#xff1a;将…...

Redis 基础总结

1、NoSQL概述 1.1 数据库分类 目前数据库分&#xff1a;关系型数据库与非关系型数据库 常用的关系型数据库&#xff1a; Oracle&#xff0c;MySQL&#xff0c;SqlServer&#xff0c;DB2 常用的非关系数据库&#xff1a;Redis&#xff0c;MongoDB&#xff0c;ElasticSearch&…...

基于nginx的tomcat负载均衡和集群(超简单)

今天看到"基于apache的tomcat负载均衡和集群配置 "这篇文章成为javaEye热点。 略看了一下&#xff0c;感觉太复杂&#xff0c;要配置的东西太多&#xff0c;因此在这里写出一种更简洁的方法。 要集群tomcat主要是解决SESSION共享的问题&#xff0c;因此我利用memcac…...

宁波网络营销推广外包公司/长沙靠谱关键词优化公司电话

看到标题&#xff0c;可能有的同学会说不是可以敲代码得到相应的可视化图形的吗&#xff1f;为什么还要用Tableau这种专业的数据分析软件呢&#xff1f;那么我觉得得先认识一下什么是Tableau&#xff1f;在开始学习之前&#xff0c;我想先做一个思维导图来说明学习Tableau的顺序…...

国外 网站 设计/营销策略怎么写

1 官网 https://launchpad.net/ 2 安装使用参考网站 http://www.cnblogs.com/digdeep/p/4925560.html转载于:https://www.cnblogs.com/jackspider/p/5217676.html...

wordpress 默认缩略图/站长统计app下载

OSPF网络Router ID重复导致网络故障 网络拓扑如图9.1所示&#xff0c;三个路由器运行OSPF协议并都属于区域0。网络规划如下&#xff1a; n R1和R2的互联地址为&#xff1a;10.0.0.0/30&#xff1b;R1和R3的互联地址为&#xff1a;30.0.0.0/30&#xff1b; n 使用路由器的Loopba…...

热搜词排行榜关键词/seo排名关键词

383. 赎金信 难度&#xff1a;easy 用一个数组来记录每个字母出现次数&#xff1b; class Solution {public boolean canConstruct(String ransomNote, String magazine) {int[] table new int[27];for (int i 0; i < magazine.length(); i) {table[magazine.charAt(i) …...

天安节能科技园公司做网站/全自动推广引流软件

runstats是由Thomas Kyte开发的脚本&#xff0c;该脚本能对做同一件事的两个不同方法进行比较&#xff0c;得出孰优孰劣的结果。 1.授权 SQL> grant select on v_$statname to livan;Grant succeeded.SQL> grant select on v_$mystat to livan;Grant succeeded.SQL> g…...

WordPress点链接没反应/无忧seo博客

-                    ------ android培训、java培训、期待与您交流&#xff01; ---------- 异常 就是程序在运行时出现的不正常的情况 异常的由来&#xff0c;问题是现实一个具体的事物&#xff0c;也可以通过java类来进行描述 其实就是java对不正常情况…...