ARM裸机-8

news2025/1/23 11:59:44

1、ARM的编程模式和工作模式

1.1、ARM的基本设定

        ARM采用的是32位架构

        ARM约定:

                - Byte:8 bits

                - Halfword :16 bits (2 byte)

                - Word:32 bits (4 byte)

        大部分ARM core 提供:

                - ARM 指令集 (32-bit)

                - Thumb 指令集 (16-bit )

                - Thumb2指令集(16 &32bit)
        Jazelle cores 支持 Java bytecode

1.2、ARM处理器工作模式

ARM 有7个基本工作模式:

        User:非特权模式,大部分任务执行在这种模式。

        FIQ:当一个高优先级(fast) 中断产生时将会进入这种模式。

        RQ:当一个低优先级 (noral) 中断产生时将会进入这种模式。

        Supervisor:当复位或软中断指令执行时将会进入这种模式。

        Abort::当存取异常时将会进入这种模式。

        Undef:当执行未定义指令时会进入这种模式。

        System:使用和User模式相同寄存器集的特权模式。

注意:

        除User (用户模式) 是Normal (普通模式)外,其他6种都是Privilege (特权模式)。

        Privilege中除Sys模式外,其余5种为异常模式。

        各种模式的切换,可以是程序员通过代码主动切换 (通过写CPSR寄存器);也可以是CPU在某些情况下自动切换。

        各种模式下权限和可以访问的寄存器不同。

1.3、CPU为什么设计这些模式

        CPU是硬件,OS是软件,软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性。

        操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要。

2、ARM的37个寄存器

 

(1)ARM总共有37个寄存器,但是每种模式下最多只能看到18个寄存器,其他寄存器虽然名字相同但是在当前模式不可见。

(2)对r14这个名字来说,在ARM中共有6个名叫r14(又叫lr)的存器,但是在每种特定处理器模式下,只有一个r14是当前可见的,其他的r14必须切换到他的对应模式下才能看到。这种设计叫影子寄存器 (banked register)。

(3)System模式使用user模式寄存器集

总结:

        ARM共有37个寄存器,都是32位长度。

        37个寄存器中30个为“通用”型,1个固定用作PC,一个固定用作CPSR,5个固定用作5种异常模式下的SPSR。

PC (r15) 程序控制寄存器
        PC (Program control register) 为程序指针,PC指向哪里,CPU就会执行哪条指令(所以程序跳转时就是把目标地址代码放到PC中),整个CPU中只有一个PC (CPSR也只有一个,但SPSR有5个)。

3、ARM的异常处理方式简单介绍

3.1、什么是异常

        正常工作之外的流程都叫异常。

        异常会打断正在执行的工作,并且一般我们希望异常处理完成后继续回来执行原来的工作。

        中断是异常的一种。

3.2、异常向量表

        所有的CPU都有异常向量表,这是CPU设计时就设定好的,是硬件决定的。

        当异常发生时,CPU会自动动作 (PC跳转到异常向量处处理异常,有时伴有一些辅助动作)。

        异常向量表是硬件向软件提供的处理异常的支持。

3.3、ARM的异常处理机制

        当异常产生时,ARM core:

                - 拷贝 CPSR到SPSR_<mode>

                - 设置适当的 CPSR位:
                        改变处理器状态进入 ARM 态

                        改变处理器模式进入相应的异常模式

                        设置中断禁止位禁止相应中断(如果需要)

                - 保存返回地址到 LR _<mode>

                - 设置 PC 为相应的异常向量

        返回时,异常处理需要:

                -从SPSR_<mode>恢复CPSR

                - 从LR_<mode>恢复PC

                - Note:这些操作只能在 ARM 态执行

3.4、总结

        异常处理中有一些是硬件自动做的,有一些是程序员需要自己做的。需要搞清楚哪些是需要自己做的,才知道如何写代码。

        以上说的是CPU设计时提供的异常向量表,一般称为一级向量表。有些CPU为了支持多个中断,还会提供二级中断向量表,处理思路类似于这里说的一级中断向量表。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TiProxy 原理和实现

说明 在上篇《TiProxy 尝鲜》 中做了一些实验&#xff0c;比如加减tidb节点后tiproxy可以做到自动负载均衡&#xff0c;如果遇到会话有未提交的事务则等待事务结束才迁移。 本次主要研究这样的功能在tiproxy中是如何实现的&#xff0c;本次分享内容主要为以下几部分&#xff…

数据结构基础知识、名词概述

1.1 基本概念和术语1.1.1 数据、 数据元素、 数据项和数据对象1.1.2 数据结构1.1.3 数据类型和抽象数据类型 1.2 抽象数据类型的表示与实现1.3 算法与算法分析&#xff08;1&#xff09;1.4 算法与算法分析&#xff08;2&#xff09;1.5 算法与算法分析&#xff08;3&#xff0…

gti 远程操作

目录 一. 分布式版本控制管理系统 1. 理解分布式版本控制管理系统 二. 创建远程仓库 ​编辑 ​编辑 三. 克隆远程仓库_HTTP 四. 克隆远程仓库_SSH 配置公钥 添加公钥 五. git 向远程仓库推送 六. 拉取远程仓库 七. 忽略特殊文件 八. 配置别名 一. 分布式版本控制管理…

JVM内存分配机制详解

文章目录 一、对象的创建流程1、类加载检查2、分配内存3、初始化4、设置对象头5、执行方法 二、对象内存分配1、栈上分配2、对象在Eden区分配3、大对象直接进入老年代4、长期存活的对象进入老年代5、对象动态年龄判断6、老年代空间分配担保机制 三、对象内存回收1、引用计数法2…

别再分库分表了,试试TiDB!

什么是NewSQL 传统SQL的问题 升级服务器硬件 数据分片 NoSQL 的问题 优点 缺点 NewSQL 特性 NewSQL 的主要特性 三种SQL的对比 TiDB怎么来的 TiDB社区版和企业版 TIDB核心特性 水平弹性扩展 分布式事务支持 金融级高可用 实时 HTAP 云原生的分布式数据库 高度兼…

RT1052 的四定时器

文章目录 1 Quad Timer&#xff0c;简称&#xff1a;QTMR2 单个通道的框图3 QTMR配置3.1 QTMR1 时钟使能。3.2 初始化 QTMR1。3.2.1 QTMR_Init 3.3 设置 QTMR1 通道 0 的定时周期。3.3.1QTMR_SetTimerPeriod 3.4 使能 QTMR1 通道 0 的比较中断。3.4.1 QTMR_EnableInterrupts 3.…

14. Spring AOP 的组成和实现

目录 1. Spring AOP 简介 2. AOP 的组成 2.1 切面&#xff08;Aspect&#xff09; 2.2 连接点&#xff08;Join Point&#xff09; 2.3 切点&#xff08;Pointcut&#xff09; 2.4 通知&#xff08;Advice&#xff09; 3. Spring AOP的实现 3.1 新建项目 3.2 添加 AOP …

Zebec Card 将在亚洲、拉美等地区推出,生态全球化加速

随着以Visa、特斯拉、BNY Mellon、BlackRock、Mastercard、Gucci等为代表的传统商业机构巨头&#xff0c;以及萨尔瓦多、中非共和国等为代表的国家不断的向加密货币领域布局&#xff0c;越来越多的投资者开始以新的眼光来看待加密货币&#xff0c;仅在2022年&#xff0c;加密货…

1400*B. I Hate 1111(思维+数学)

Example input 3 33 144 69 output YES YES NO 题意&#xff1a; 问一个数字是否可以由 11&#xff0c;111&#xff0c;1111&#xff0c;11111...... 任意倍数加和所得。 解析&#xff1a; 可以观察到 1111%110&#xff0c;11111%1110&#xff0c;而后面更大的11111111…

C++部署学习

gcc -E src/main.c -o src/main.i gcc -S src/main.c -o src/main.s gcc -C src/main.c -o src/main.o gcc src/main.c -o exec ./exec

Vue2第八节 收集表单数据

&#xff08;1&#xff09;文本类型/密码类型 v-model收集的是value值 用户输入的就是value值 <input type"text" v-model"usrInfo.account"> <input type"password" v-model"usrInfo.password"> &#xff08;2&#xf…

Java程序逻辑控制的几个小练习(熟悉一下Java的语法)

虽然都是一些很简单的题目&#xff0c;但是都是很经典的编程题&#xff0c;多写几道可以熟悉一些Java代码&#xff0c; 之前C语言敲多了一时半会有点不适应&#xff0c;敲起来怪怪的&#xff0c;感觉手不是自己的了哈哈 目录 1. 根据年龄, 来打印出当前年龄的人是少年(低于18)…

多臂治疗规则的 Qini 曲线(Stefan Wager)

英文题目&#xff1a; Qini Curves for Multi-Armed Treatment Rules 中文题目&#xff1a;多臂治疗规则的 Qini 曲线 单位&#xff1a;Stefan Wager 论文链接&#xff1a; 代码&#xff1a;GitHub - grf-labs/maq: Treatment rule evaluation via the multi-armed Qini …

软件测试面试【证券项目公司】

这家公司是做证券项目的&#xff0c;约的9点钟&#xff0c;路程还是有点遥远&#xff0c;转了一趟公交两趟地铁&#xff0c;精力都花在了路上&#xff0c;感觉有点累&#xff0c;以下是今天得面试流程。 到公司前台给我了一张面试表&#xff0c;写完之后就是等待面试。一共面试…

Python模块psycopg2连接postgresql

目录 1. 基础语法 2. 基础用法 3. 多条SQL 4. 事务SQL 1. 基础语法 语法 psycopg2.connect(dsn #指定连接参数。可以使用参数形式或 DSN 形式指定。host #指定连接数据库的主机名。dbname #指定数据库名。user #指定连接数据库使用的用户名。…

TMS XData v5.11 2023 crack,全功能查询机制

TMS XData v5.11 2023 crack,全功能查询机制 用于多层REST/JON-HTTP/HTTPS应用服务器开发和ORM远程处理的Delphi框架。 功能概述 基于REST/JONS架构风格的服务器 从不同的客户端平台(如.NET、Java、jаvascript)轻松访问&#xff0c;因为它是基于REST/JSON的 使用标准POST、GET…

【RabbitMQ】golang客户端教程2——工作队列

任务队列/工作队列 在上一个教程中&#xff0c;我们编写程序从命名的队列发送和接收消息。在这一节中&#xff0c;我们将创建一个工作队列&#xff0c;该队列将用于在多个工人之间分配耗时的任务。 工作队列&#xff08;又称任务队列&#xff09;的主要思想是避免立即执行某些…

[golang gin框架] 43.Gin商城项目-微服务实战之后台Rbac微服务之管理员的增删改查以及管理员和角色关联

上一节讲解了后台Rbac微服务角色增删改查微服务,这里讲解权限管理Rbac微服务管理员的增删改查微服务以及管理员和角色关联微服务功能 一.实现后台权限管理Rbac之管理员增删改查微服务服务端功能 1.创建Manager模型 要实现管理员的增删改查,就需要创建对应的模型,故在server/r…

使用Beego和MySQL实现帖子和评论的应用,并进行接口测试(附源码和代码深度剖析)

文章目录 小项目介绍源码分析main.gorouter.gomodels/user.gomodels/Post.gomodels/comment.gocontrollers/post.gocontrollers/comment.go 接口测试测试增加帖子测试查看帖子测试增加评论测试查看评论 小项目介绍 经过对需求的分析&#xff0c;我增加了一些额外的东西&#x…

Linux学习之脚本优先级控制

fork炸弹 在编写Shell脚本时不要写出不可控的死循环&#xff0c;比如func() { func | func& } ; func&#xff0c;简写版为.(){ .|.& };.。接下来见证一下这两条语句的威力。因为在root用户下许多资源没有限制&#xff0c;所以useradd userfork新建一个用户userfork&a…