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

        核使用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

舒服,学到了一些技巧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/109707.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

健康与福祉:心理健康和身体健康的重要性

健康与福祉:心理健康和身体健康的重要性 健康与福祉:心理健康和身体健康的重要性摘要引言心理健康的重要性1. 理解心理健康2. 影响心理健康的因素 影响心理健康的因素社会支持的重要性实际案例:孤独与社会支持实际案例:家庭支持与…

低代码开源项目整理

低代码是基于可视化和模型驱动理念,结合云原生与多端体验技术,它能够在多数业务场景下实现大幅度的提效降本,为专业开发者提供了一种全新的高生产力开发范式。下面就来分享几个值得学习和使用的前端低代码开源项目,更深入地了解什…

利用芯片74hc165为单片机增加输入扩展端口proteus仿真arduino

我们前面的博文《输入端口少如何扩展?74hc148或74ls148级联在arduino中实现16转4的应用》介绍了148,148输入后可以立即输出到数码管,可以说它是自带编BCD编码器的。而今天这里我们主要介绍的74hc165是没有编码器,这里我们以proteus为仿真环境…

OPTEE异常调用栈解析

安全之安全(security)博客目录导读 目录 一、OPTEE标准的异常调用栈格式 二、OPTEE异常调用栈解析脚本 三、如何执行解析命令 四、OPTEE异常调用栈解析结果 序言:当OPTEE发生异常时,安全控制台会输出dump信息,虽然有了Call stack&#x…

【Unity每日一记】资源加载相关和检测相关

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

初识Mybatis(二)动态SQL、缓存和逆向工程

动态SQL Mybatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能,它存在的意义是为了解决拼接SQL语句字符串时的痛点问题。 (比如多条件查询的设置,实现判空等) 1、if 创建DynamicSQLMapper接口,DynamicSQL…

机器学习——boosting之XGBoost(未完)

划水一整天,模型看了仨!不错,虽然现在在打哈欠,还是很想把XGBoost梳理梳理 先从名字开始 XGBoost,eXtreme Gradient Boosting: em。。。。不理解 书上说,XGBoost有很好的性能,在各大比赛中大放异…

python-xpath语法-爬取彼岸图4k高清动漫壁纸

安装 pip install lxml导入 from lxml import etreexpath使用路径表达式提取html文档中的元素或元素集,然后元素通过沿路径path或步steps来选取数据 XPath常用语法格式 表达式描述div选取div元素的所有子元素/div选取根元素divul//li选取ul元素下的所有li子元素…

【算法专题突破】滑动窗口 - 水果成篮(13)

目录 1. 题目解析 2. 算法原理 3. 代码编写 写在最后: 1. 题目解析 题目链接:904. 水果成篮 - 力扣(Leetcode) 题目有很长一段话,但是我们读一遍题目可以提炼转化出题目的要求 : 其实就是找出一个最长…

数据中心液冷服务器详情说明

目录 前言 何为液冷服务器? 为什么需要液冷? 1.数据中心降低PUE的需求 2.政策导向 3.芯片热功率已经达到风冷散热极限 4.液冷比热远大于空气 液冷VS风冷,区别在哪? 1.液冷服务器跟风冷服务器的区别 2.液冷数据中心跟风冷…

Java“牵手”速卖通商品列表页数据采集+速卖通商品价格数据排序,速卖通API接口申请指南

速卖通是阿里巴巴旗下的面向国际市场打造的跨境电商平台,被称为国际版淘宝,速卖通面向海外买家客户,通过支付宝国际账户进行担保交易,并使用国际物流渠道运输发货,是全球第三大英文在线购物网站。 速卖通商品列表数据…

《论文阅读》通过动态融入常识知识来提高同理心对话的生成

《论文阅读》通过动态融入常识知识来提高同理心对话的生成 前言简介模型架构Contextual ProbingContextual Unification Workspace代码实现Knowledge-Aware Decoder实验结果前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到…