arm与linux的些许问题,《ARM与Linux些许问题》第一章:ARM工作模式

早期的ARM核有状态(ARM或Thumb)切换(通过BX等指令修改CPSR寄存器(当前程序状态寄存器,存放条件码标志,中断禁止位,当前处理器模式以及其他状态和控制信息)中T的控制位完成程序状态的切换),现在ARM都只使用Thumb状态了。所以,我们不在讨论状态切换相关。

一、ARM七种工作模式及其应用场合(Linux操作系统使用了其中USR和SVC模式、出现异常时还可能通过进入其他模式转为Linux内核态)

在CPSR寄存器中设置M[4:0]位,分别对应如下七种模式(注意:用户模式和系统模式只有对CPSR的读权限,因此、这两种模式下不可以通过直接设置CPSR进入其他模式(SWI汇编指令除外)):

1.用户模式(USR):用于正常执行程序。在Linux操作系统中,用户空间进程就是在这种模式下运行。CPSR寄存器M[4:0]设置10000。

2.系统模式(SYS):运行有特权的操作系统任务。CPSR寄存器M[4:0]设置11011。

这个模式和用户模式共用R15-pc(程序计数器,存放下一条指令所在单元的地址)的值,因此不用ARM强制赋值。

ARM进入以下几种模式后,都需要给R15-PC寄存器重新赋值、也就是开始执行新的指令。

3.管理模式(SVC):操作系统使用的保护模式(高权限)。在Linux操作系统中,内核空间在这种模式下运行。CPSR寄存器M[4:0]设置10011。

当ARM刚上电或复位时、进入该模式,并强制PC从0x0000 0000处取指令;当系统软中断(如系统调用,调用ARM的SWI汇编指令)时、进入该模式,并强制PC从0x0000

0008处取指令——这也是ARM从用户模式主动切入管理模式(Linux从用户态主动进入内核态)的唯一方法。后面章节会详细分析。

当出现异常状况时,Linux还有可能在如下几种ARM模式下运行;如硬件中断、程序问题导致的异常等。

4.快速中断模式(FIQ):用于高速数据传输。CPSR寄存器M[4:0]设置10001。

进入该模式后、ARM强制PC从0x0000

001C处取指令。

5.外部中断模式(IRQ):用于通常的中断处理。CPSR寄存器M[4:0]设置10010。

进入该模式后、ARM强制PC从0x0000

0018处取指令。

6.数据访问终止模式(ABT):当数据或指令预取终止时进入该模式,可用于虚拟内存及存储保护。CPSR寄存器M[4:0]设置10111。

当指令取终止时、进入该模式,并强制PC从0x0000

000C处取指令;当数据取终止时、进入该模式;并强制PC从0x0000

0010处取指令。

7.未定义指令终止模式(UND):当未定义的指令执行时进入该模式,可用于支持硬件。CPSR寄存器M[4:0]设置11111。

当程序中出现未定义的指令时、进入该模式,并强制PC从0x0000 0004处取指令。

在非user模式下的其他6中模式,有SVC,FIQ,IRQ,ABT,UND,SYS

都可以修改CPSR寄存器、从而控制ARM工作模式的切换。

在Linux操作系统中;当CPU处于特权模式(Linux处于内核态)时,可以随意进入用户态。而当CPU处于用户模式(Linux处于用户态)时,Linux从用户态切换到内核态(ARM从用户模式切换到其他特权模式)只有在系统调用和中断(中断进入IRQ模式,也可以操作内核)两种情况下发生,一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过调用软中断进入内核态。

每一种工作模式的R13-SP(堆栈指针寄存器,在堆栈操作中使用)都是独立的。因此,对程序中需要用到的每一种模式都要给SP定义一个堆栈地址。方法是改变状态寄存器(CPSR)内的状态位,使处理器切换到不同的状态,然后给SP赋值。注意:不要切换到User模式进行User模式的堆栈设置,因为进入User模式后就不能再操作CPSR回到别的模式了,可能会对接下去的程序执行造成影响。

ARM在刚上电或复位后、进入SVC管理模式,并从0x0000 0000开始取指令;bootloader和Linux

Kernel都是工作在此模式。

二、ARM工作模式切换的两种方法

1.被动切换:是指ARM在当前工作模式下,没有要求模式切换、而被动地进入另外一种模式。在ARM运行的时候产生一些异常(包括软中断)或者中断(硬中断)来进行模式切换。如上边提到的Linux操作系统从用户态到内核态,如硬件中断或程序异常。内核态不会被动切换到用户态。

2.主动切换:是指ARM在当前工作模式下,通过一些自主操作、主动的要求切换工作模式。ARM通过软件改变,即软件设置寄存器来进行ARM的模式切换,因为ARM的工作模式都是可以通过相应寄存器的赋值来切换的。如上边提到的Linux操作系统从内核态到用户态;这里边有一个比较特殊的情况:Linux用户态可以通过系统调用主要要求切换到内核态。

====================================================================================================================================

ARM主要寄存器汇总:

CPSR及SPSR:当前程序状态寄存器和保存程序状态寄存器;

R15-PC及R14-LR:程序计数器和用户保存PC的连接寄存器;

R13-SP:堆栈指针。

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

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

相关文章

c语言给定一个字符串匹配,使用C语言解决字符串匹配问题的方法

最常想到的方法是使用KMP字符串匹配算法&#xff1a;#include #include #include int get_nextval(char *pattern,int next[]){//get the next value of the patternint i 0,j -1;next[0] -1;int patlen strlen(pattern);while ( i < patlen - 1){if ( j -1 || pattern…

c语言比较大小 谁大选谁,C语言比较优先级

满意答案wanggq2222018.03.14采纳率&#xff1a;42% 等级&#xff1a;7已帮助&#xff1a;57人#pragma once#include#include#include #includeusing namespace std;typedef struct SymKeyVal{string key;int val;};static SymKeyVal KeyValTable[]{{"",0},{"…

c语言ip地址吗,C语言:判断IP地址是否合法

int is_valid_ip(const char *ip){int section 0; //每一节的十进制值int dot 0; //几个点分隔符int last -1; //每一节中上一个字符while(*ip){if(*ip .){dot;if(dot > 3){return 0;}if(section > 0 && section <255){section 0;}else{retur…

10100的素数c语言程序,C语言基础题目及代码.doc

/*读入一个自然数n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。输入格式&#xff1a;每个测试输入包含1个测试用例&#xff0c;即给出自然数n的值。这里保证n小于10100。输出格式&#xff1a;在一行内输出n的各位数字之和的每一位&#xff0c;拼…

c语言闰年的判断条件DS1302,DS1302驱动程序(平年和闰年天数自动调整)

/*********************************************************************************1.本程序能够显示年&#xff0c;月&#xff0c;日&#xff0c;时&#xff0c;分&#xff0c;秒&#xff0c;星期七个参数.2.时间和日期可调。可分别完成年&#xff0c;月&#xff0c;日&am…

android 图片切割代码,Android用clip剪切图像资源

使用clip剪切图像资源可以做进度条&#xff0c;图像慢慢展开的效果&#xff0c;他使用以下几个属性来控制效果&#xff1a;android:drawable&#xff1a;指定要剪切的原图像。android:clipOrientation&#xff1a;截取的方向。可取的值&#xff1a;horizontal和vertical。分别表…

android gradle错误,Android studio gradle错误与顶级异常

我最近更新了我的Android Studio,从那以后我的项目没有构建...我得到错误,如下面的错误:Error Code:1Output:UNEXPECTED TOP-LEVEL EXCEPTION:com.android.dx.cf.iface.ParseException:class name (org/pervasivesystems/mobilehealth/activities/AppSettingsActivity$AppSetti…

Android中列表动态删除item,如何删除Android ExpandableListView中某个group item的child item?...

自定义了一个expandablelistview 想要删除其中的子项list使用remove方法把list中的指定项删除了11-09 21:04:20.585: I/MainActivity(13557): childData[{child_textsecond}, {child_textthird}]但是在expandablelistview界面显示中&#xff0c;并没有变化,并且还有list溢出报错…

android 首页广告显示不出来的,android – Admob插页式广告(全屏)不会显示

您没有为interstitialAd调用loadAd().广告插播广告应在您展示广告之前加载.interstitialAd.loadAd(adRequest);你也应该在调用show()之前检查它是否已加载.它可能无法立即使用,您可能希望在调用show之前提前加载它.if(mInterstitial.isLoaded()){mInterstitial.show();AdReques…

android新建项目错误,新建Android项目出错

新建Android项目出以下的错误&#xff1a;C:\Users\txxs\workspace\4sd\res\values\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name Theme.AppCompat.Light.[2016-11-23 11:57:46 - 4sd][2016-11-23 11:57:46 - 4sd] …

android 图片 切换,Android 应用开发笔记 - 切换图片(ImageSwitcher)

在面板拖拽图标&#xff0c;然后更改相关属性(Properties)&#xff0c;如下&#xff1a;android:id"id/imgSwit01"android:layout_width"wrap_content"android:layout_height"wrap_content" />ImageSwitcher使用的是setFactory()方法&#xf…

android layout.inflater,Android - LayoutInflater

在实际开发中LayoutInflater这个类还是非常有用的&#xff0c;它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件&#xff0c;并且实例化&#xff1b;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。具体作…

android preferenceactivity 源码,PreferenceActivity PreferenceScreen (3.0/API 11 以前)

Android提供了一个XML驱动的框架&#xff0c;用于为应用程序创建系统样式的PreferenceScreen.(3.0/API 11 以前)是这样使用的看代码&#xff1a;mypreference.xmlandroid:key"PREF_AUTO_REFRESH"android:defaultValue"true"android:summary"select to…

wps 将html转为word,用WPS快速将网页内容转换为WORD文档

当过学生的都知道&#xff0c;有时查找资料&#xff0c;看到图文并茂的网页想要把它Copy在WORD文档中&#xff0c;那么图片和文字相互参杂&#xff0c;想要保存下来很复杂&#xff0c;但是如果用WPS的话&#xff0c;一切就会很简单的&#xff0c;下面来看看WPS是怎么办到的。1.…

鸿蒙明年可以在手机上用吗,华为王成录:鸿蒙已满足在手机上使用,明年一二月份向部分用户开放...

在2019年的华为开发者大会上&#xff0c;华为消费者业务CEO余承东正式对外发布了基于微内核的分布式操作系统-HarmonyOS(鸿蒙OS)&#xff0c;余承东表示&#xff0c;鸿蒙OS的出发点和Android、iOS都不一样&#xff0c;它是一款全新的基于微内核的面向全场景的分布式操作系统&am…

go语言 doc转换html,go语言使用wkhtmltopdf工具将html转成pdf

最近收到网友的提问后端怎么把html转成pdf文件&#xff0c;于是我就把我以前做的例子发出来给大家参考一下&#xff0c;如果对你有帮助的话请点个赞1.首先选择适合自己的系统下载wkhtmltopdf工具mac下载后安装成功会自动添加到环境变量 直接执行 wkhtmltopdf -V 测试是否安装成…

java sound 多线程同一音频文件_Java在编程语言中占据何等优势?

现在是信息时代&#xff0c;出现了各种各样的行业&#xff0c;在这些众多行业里面&#xff0c;程序员算是高薪职业。在国内程序员的薪水要比其他行业高一些。也正是如此高薪的诱惑和充满挑战性的工作&#xff0c;令程序员近几年来成为了备受欢迎的职业。程序员日常的工作大多是…

dlna和miracast可以共存吗_高考化学必备之离子共存问题

发生复分解反应&#xff11;、有气体产生。H与CO32ˉ、HCO3ˉ、SO32ˉ、HSO3ˉ、S2ˉ、HSˉ等不能共存如CO32-、S2-、HS-、HSO3-、等易挥发的弱酸的酸根与H不能大量共存&#xff0c;主要是由于CO32-&#xff0b;2H&#xff1d;CO2↑&#xff0b;H2O、HS-&#xff0b;H&#xff…

html向上浮动的方式,JS 实现Div向上浮动的实现代码

Html 及 JS 代码如下&#xff1a;复制代码 代码如下:style"position: absolute; width: 100px;">我们var newsOne document.getElementById("newsOne");newsOne.style.bottom 0;newsOne.style.left window.screen.availWidth - 100;var bottom 0;fu…

perl数组硬引用_Perl 继续前行,Perl 7 将是下一代(硬核老王点评版)

它是默认带有现代行为的 Perl 5&#xff0c;将为以后更大的变化奠定基础。来源&#xff1a;https://linux.cn/article-12349-1.html作者&#xff1a;Brian D Foy译者&#xff1a;Xingyu.Wang(本文字数&#xff1a;5043&#xff0c;阅读时长大约&#xff1a;8 分钟)近日 召开的 …