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.pswp.cn/news/533165.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/533165.shtml
英文地址,請注明出處:http://en.pswp.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 分鐘)近日 召開的 …