当前位置: 首页 > 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、数据转码 六、建模与参数优…...

OpenClaw近一月版本更替讲解

如果你最近没追 OpenClaw 的更新&#xff0c;最容易产生一种错觉&#xff1a;它是不是又只是多接了几个模型、多加了几个花哨功能&#xff1f; 我看完最近一个月的变化后&#xff0c;感觉不是这样。 OpenClaw 这一个月真正值得关注的地方&#xff0c;不是“它更炫了”&#xff…...

ZYNQ UltraScale+ MPSoC实战:基于PL端AXI_UART16550 IP核与PS端中断机制,实现RS485多帧长数据可靠接收

1. 工业通信场景下的ZYNQ UltraScale MPSoC实战 在工业自动化领域&#xff0c;RS485总线因其抗干扰能力强、传输距离远等优势&#xff0c;成为设备间通信的主流选择。而ZYNQ UltraScale MPSoC凭借其独特的PSPL架构&#xff0c;能够完美应对工业通信中对实时性和可靠性的严苛要求…...

量子网络远程纠缠生成技术及其应用

1. 量子网络中的远程纠缠生成技术解析量子纠缠作为量子计算与量子通信的核心资源&#xff0c;其非局域特性为分布式系统提供了经典方法无法实现的协调能力。在金融高频交易、智能电网调度等对延迟极度敏感的领域&#xff0c;量子纠缠带来的协调优势尤为显著。基于腔量子电动力学…...

ARM PMU性能监控架构与寄存器详解

1. ARM PMU性能监控架构概述 性能监控单元(Performance Monitoring Unit, PMU)是现代处理器中用于硬件级性能分析的关键模块。作为ARM架构的重要组成部分&#xff0c;PMU通过一组可编程计数器来记录处理器运行过程中发生的各类微架构事件&#xff0c;为系统性能分析和优化提供数…...

AI辅助开发实战:用Electron+React+TS构建跳台滑雪模拟器

1. 项目概述&#xff1a;一个由AI驱动的滑雪跳台模拟器如果你是一个体育游戏迷&#xff0c;尤其是对冬季项目里的跳台滑雪着迷&#xff0c;同时又对现代前端开发技术栈感兴趣&#xff0c;那么这个名为Sj.Sim Predazzo Edition的开源项目&#xff0c;绝对值得你花时间深入研究。…...

Marko导入导出完全指南:掌握模块化组件的终极导入导出机制

Marko导入导出完全指南&#xff1a;掌握模块化组件的终极导入导出机制 【免费下载链接】marko A declarative, HTML-based language that makes building web apps fun 项目地址: https://gitcode.com/gh_mirrors/ma/marko Marko是一款声明式、基于HTML的语言&#xff0…...

GlosSI完全攻略:一键实现Steam控制器全局支持的终极方案

GlosSI完全攻略&#xff1a;一键实现Steam控制器全局支持的终极方案 【免费下载链接】GlosSI Tool for using Steam-Input controller rebinding at a system level alongside a global overlay 项目地址: https://gitcode.com/gh_mirrors/gl/GlosSI 有没有想过&#xf…...

Kubernetes网络沙箱BotBox:为AI Agent提供零改造的密钥安全与访问控制

1. 项目概述&#xff1a;为AI Agent打造坚不可摧的网络沙箱如果你正在Kubernetes里跑AI Agent&#xff0c;比如让Clawbot、Moltbot或者OpenClaw这类自主代码生成工具去联网干活&#xff0c;心里是不是总有点不踏实&#xff1f;我猜你肯定担心过这几个问题&#xff1a;我给的API…...

BG3ModManager终极指南:如何轻松管理博德之门3模组避免游戏崩溃?

BG3ModManager终极指南&#xff1a;如何轻松管理博德之门3模组避免游戏崩溃&#xff1f; 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. This is the only official source! 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager BG3ModMana…...

为什么你的Ziatype输出总是发灰?3分钟定位CMYK→RGB色域坍缩根源并一键修复

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Ziatype印相发灰现象的直观诊断与认知重构 Ziatype是一种基于铁-银工艺的古典摄影印相法&#xff0c;其典型特征是高对比度、深沉黑位与细腻中间调。然而在实际操作中&#xff0c;“发灰”&#xff08;…...