日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

SVC和PendSV

發布時間:2025/3/21 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SVC和PendSV 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.SVC

SVC(Supervisor Call)指令用于產生一個SVC異常。它是用戶模式代碼中的主進程,用于創造對特權操作系統代碼的調用。SVC是用于呼叫操作系統所提供API的正道。用戶程序只需知道傳遞給操作系統的參數,而不必知道各API函數的地址。

SVC指令帶一個8位的立即數,可以視為是它的參數,被封裝在指令自身,如:

??SVC??? 3:呼叫3號系統服務

則3被封裝在這個SVC指令中。因此在SVC服務例程中,需要讀取本次觸發SVC異常的SVC指令,并提取出8位立即數所在的位段,從而判斷系統調用號,工作流程如圖7-7所示。


?


實現上圖功能的代碼如下所示:
svc_handler
?TST?????? LR,?? #0x4;??;測試EXC_RETURN的比特2
?ITE?????? EQ;????;如果為0
?MRSEQ?? R0,?? MSP;???;則使用的是主堆棧,故把MSP的值取出
?MRSNE?? R0,?? PSP;???;否則,使用的是進程堆棧,故把PSP的值取出
?LDR????? R1,?? {R0,#24};?;從棧中讀取PC值
?LDRB???? R0,? {R1,#-2};??;從SVC指令中讀取立即數放到R0
; 準備調用系統服務函數。這需要適當調整入棧的PC值及LR(EXC_RETURN)來進入OS內部
??BX??????? LR; ????;借異常返回的形式,進入OS內部,最終調用系統服務函數

一旦獲取了調用號,就可以用它來調用系統服務函數了。有理由相信,操作系統應該使用TBB/TBH查表跳轉指令來加速定位正確的服務函數。然而,如果讀者是設計OS的人員,則必須檢查這個參數的合法性,以免因數字超出跳轉表的范圍而跳飛。因為不能在SVC服務例程中嵌套使用SVC,所以如果有需要,就要直接調用SVC函數,如使用BL指令。

2.PendSV

PendSV是為系統級服務提供的中斷驅動。在一個操作系統環境中,當沒有其他異常正在執行時,可以使用PendSV來進行上下文的切換。

在進入PendSV處理函數時:

(1)xPSR、PC、LR、R12、R0~R3已經在處理棧中被保存。

(2)處理模式切換到線程模式。

(3)棧是主堆棧。

由于PendSV在系統中被設置為最低優先級,因此只有當沒有其他異常或者中斷在執行時才會被執行。

總結

以上是生活随笔為你收集整理的SVC和PendSV的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。