记录第一个启动代码的诞生
核使用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加快启动速度。
步骤如下:
- 设置HVBAR
- 使能EL1访问协处理器寄存器的能力
- 如有需要、关闭HVC指令(用户模式下非安全态禁用、核处于安全态禁用)
- 设置EL1的VBAR
- 保存cpsr到SPSR_hyp(返回EL2模式需要用到)
- 设置elr_hyp 为 EL1_init (elr(exception linker register))
- 使能TCM,使得EL1\2\0均可访问;且配置TCM大小
- 根据情况使能或者关闭TCM slave接口
- 调用指令eret,进入EL1

2.2 EL1_init
在EL1_init最先需要做啥?
毫无疑问如果没有在EL2设置VBAR,那么就要在这里做VBAR。
第二个事情就是,初始化C运行环境,具体如下:
- .bss段清零,防止出现ECC错误
- .data段初始化,将rom数据copy至ram
- 各种模式的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 官方链接: 组件 | Elementhttps://element.eleme.cn/#/zh-CN/component/installation el-select <!-- 用户类型选择框<template> 看情况使用value选择框绑定的值 命名必须是value不能改v-for"item in Options" options数据源来自于…...
微信小程序+echart实现点亮旅游地图
背景 最近看抖音有个很火的特效就是点亮地图,去过哪些地方,于是乎自己也想做一个,结合自己之前做的以家庭为单位的小程序,可以考虑做一个家庭一起点亮地图的功能。 效果图 过程 1,首先就是得去下微信小程序适配的ec…...
Git(8)——Git命令总结
一、简介 本篇文章将基于Git(4)——Git命令小总结,补充后续的Git使用命令 二、总结 # 添加远程连接 git remote add origin 远端地址# 推送本地代码 git push origin 分支名称# 拉取远端代码(第一次) git clone 远端克隆地址# 更新远端代码…...
9.15 滴滴笔试
T1(二分) #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 &…...
有趣的设计模式——适配器模式让两脚插头也能使用三孔插板
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 场景与问题 众所周知,我们国家的生活用电的电压是220V而笔记本电脑、手机等电子设备的工作压没有这么高。为了使笔记本、手机等设备可以使用220V的生活用电就需…...
2.10 PE结构:重建重定位表结构
Relocation(重定位)是一种将程序中的一些地址修正为运行时可用的实际地址的机制。在程序编译过程中,由于程序中使用了各种全局变量和函数,这些变量和函数的地址还没有确定,因此它们的地址只能暂时使用一个相对地址。当…...
关于content-type的理解
一.content-type的结论 告诉后端传过去的数据是什么类型的数据 二.没有请求体 (1)没有请求体的情况下content-type没有意义。 (2):图示 里面是没有请求体的 (3)有请求体的情况 二.常见的三种方式 (1)application/x-www-form-urlencoded(默认) 参数的表现形式: 传递之前可以…...
<图像处理> 空间滤波基础二
空间滤波基础二:锐化 锐化的作用的突出灰度中的过渡。图像锐化通过空间微分来实现,微分将增强边缘和其他不连续(噪声),不强化灰度变化缓慢的区域。图像锐化也叫做高通滤波,通过高频,抑制低频。…...
Java中的队列Queue
Queue(队列)是一种在计算机科学中常见的数据结构,它基于先进先出(FIFO)的原则,即最先进入队列的元素最先出队。在Java中,Queue是一个接口,定义了一组操作队列的方法,而具体的实现类可以选择性地实现这些方法。 以下是Queue的一些常见用途和操作: 添加元素: 使用off…...
机器学习技术(十)——决策树算法实操,基于运营商过往数据对用户离网情况进行预测
机器学习技术(十)——决策树算法实操 文章目录 机器学习技术(十)——决策树算法实操一、引言二、数据集介绍三、导入相关依赖库四、读取并查看数据1、读取数据2、查看数据 五、数据预处理1、选择数据2、数据转码 六、建模与参数优…...
深度解析PDFMathTranslate:揭秘AI如何实现毫秒级学术文档翻译与精准排版保留
深度解析PDFMathTranslate:揭秘AI如何实现毫秒级学术文档翻译与精准排版保留 【免费下载链接】PDFMathTranslate PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Ollama/Op…...
OneAgent智能体全球发布会圆满落幕:引领金融AI交易新时代
2026年3月25日,聚焦金融AI领域的盛会《OneAgent智能体全球产品发布会》在中国杭州成功落幕。本次发布会吸引了全球金融科技领域的行业专家、投资机构以及技术爱好者的关注,标志着OneAgent在全球AI金融市场的战略布局正式启动。AI原生对冲交易新物种&…...
【CPython内存管理白皮书级解析】:从PyObject到ob_refcnt,看懂泄漏发生的底层5层机制
第一章:CPython内存管理的底层基石与泄漏本质CPython 的内存管理并非依赖操作系统级 malloc/free 的直接映射,而是构建在三层抽象之上的精密系统:最底层为系统内存分配器(如 mmap 或 malloc),中间层为 CPyt…...
游戏玩家如何选?网易UU/ToDesk远程控制延迟实测(含手机投屏技巧)
游戏玩家专属远程控制工具深度评测:延迟、画质与投屏技巧全解析 作为一名资深游戏玩家,你是否遇到过这样的场景:出差在外想用手机继续刷副本,却苦于找不到合适的远程控制方案;或是想在平板上玩PC独占的3A大作ÿ…...
IntelliJ IDEA终极教程:从零基础到高效开发的完整指南
IntelliJ IDEA终极教程:从零基础到高效开发的完整指南 【免费下载链接】IntelliJ-IDEA-Tutorial IntelliJ IDEA 简体中文专题教程 项目地址: https://gitcode.com/gh_mirrors/in/IntelliJ-IDEA-Tutorial IntelliJ IDEA 是目前所有 IDE 中最具备沉浸式的 JVM …...
PyTorch 2.8镜像一文详解:CUDA 12.4兼容性、cuDNN版本匹配与驱动升级要点
PyTorch 2.8镜像一文详解:CUDA 12.4兼容性、cuDNN版本匹配与驱动升级要点 1. 镜像概述与核心特性 PyTorch 2.8深度学习镜像是一个专为高性能计算设计的优化环境,基于RTX 4090D 24GB显卡和CUDA 12.4深度调优。这个镜像解决了深度学习开发者经常遇到的环…...
突破语言壁垒:XUnity.AutoTranslator的创新解决方案
突破语言壁垒:XUnity.AutoTranslator的创新解决方案 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 当你打开一款期待已久的国外游戏,却发现满屏外文让剧情理解寸步难行࿱…...
手把手教你搞定CMT2300A的315MHz匹配电路:从原理图到物料清单(附实测数据)
深入解析CMT2300A在315MHz频段的射频匹配电路设计与实战优化 作为一名长期深耕射频硬件设计的工程师,我最近在工业遥控器项目中遇到了一个典型挑战:如何为CMT2300A设计稳定可靠的315MHz匹配电路。与常见的433MHz应用不同,315MHz频段在元件参数…...
别只点‘Passive’!深入理解Altium Designer引脚电气类型,从根源上杜绝原理图ERC错误
深入解析Altium Designer引脚电气类型:从原理到实践的设计规范 在电子设计自动化(EDA)领域,原理图设计是整个产品开发流程的基石。许多工程师在使用Altium Designer(AD)时,往往将注意力集中在布…...
移动端视频适配难题:xgplayer的CSS全屏模式实战指南(含16:9与9:16适配技巧)
移动端视频适配难题:xgplayer的CSS全屏模式实战指南(含16:9与9:16适配技巧) 在移动端视频播放场景中,屏幕比例适配一直是开发者面临的棘手问题。传统全屏模式在处理非常规比例视频(如竖屏9:16内容)时往往表…...
