SWIソフトブレーク詳細


ソフトブレーク:プログラミング異常は、通常、ソフトブレークソフトブレークと呼ばれ、通信プロセス間でハードブレークをシミュレートするための信号通信方式である.割り込み元が割り込み要求またはソフト割り込み信号を送信した後、CPUまたは受信プロセスが適切なタイミングで自動的に割り込み処理またはソフト割り込み信号に対応する機能ソフト割り込みを完了することは、ソフトウェアによって実現される割り込みであり、すなわちプログラム実行時に他のプログラムがそれに対する割り込みである.ハード割り込みはハードウェア実装の割り込みであり、プログラム実行時のデバイスの割り込みである. 
1.ソフト割り込みが発生する時間はプログラムによって制御され、ハード割り込みが発生する時間はランダムである.ソフト割り込みはプログラム呼び出しによって発生するが、ハード割り込みは外付け機器によって発生する.ハードウェア割り込みハンドラは、プログラムが実行されるまで長時間待たないように、タスクを迅速に完了できるようにします.
SWI:ソフトウェア割込み
(S oftw are I nterrupt)
  SWI{  }  <24    >

命令フォーマットこれは簡単な施設ですが、最もよく使われるかもしれません.多くのオペレーティングシステム施設はSWIで提供されています.SWIのないRISC OSは考えられない.
Nava WhitefordはSWIがどのように動作するかを説明した(最初はFrobnicate issue 12で½)...
 
SWIって何?
SWIはSoftware Interruptを表します.RISC OSで
で使用することができます.多くのアプリケーションでは、モジュールを使用して他のアプリケーションに低レベルの外部アクセスを提供します.
SWIの例は次のとおりです.
  • ファイルSWIは、ディスクの読み書き、プロパティの設定などを支援します.
  • プリンタドライバSWIは、印刷パラレルポートの使用を支援します.
  • FreeNet/Acorn TCP/IPプロトコルスタックSWIは、TCP/IPプロトコルでインターネット上でデータを送信および受信する.

  • このように使用する場合、SWIは、オペレーティングシステムがモジュール構造を有することを可能にし、これは、完全なオペレーティングシステムを構築するために必要なコードが多くの小さな部分(モジュール)とモジュールハンドラ(handler)に分割されることを意味する.
    SWIプロセッサは、特定のルーチン番号に対する要求を取得すると、そのルーチンの位置を見つけて実行し、任意のデータを渡す.
    どのように働いていますか?まず、使用方法を確認します.SWI命令(アセンブリ言語)は次のように見えます.
       SWI &02
    または
       SWI "OS_Write0"
    これらの命令は実際には同じであり、同じ命令にアセンブリされる.唯一の違いは、2番目の命令がSWI番号&02を表す文字列を使用することである.文字列番号を採用したプログラムを使用する場合は、実行前にまずこの文字列を検索します.
    ここでは文字列を処理したくありません.それは何をするかの真実な表現を与えることができません.これらは通常、プログラムの明確さを増進するために使用されますが、実際に実行される命令ではありません.
    最初のコマンドをもう一度見てみましょう.
       SWI &02
    これはどういう意味ですか?文字通りSWIプロセッサに入って値&02を渡すという意味です.RISC OSでは、実行番号が&02のルーチンであることを意味する.
    どうやってやったの?SWI番号をどのように渡してSWIプロセッサに入りますか?
    メモリの先頭32バイト(0-&1 C)を表示し、逆アセンブリ(実際のARMコマンドを確認)すると、次のように表示されます.
    アドレスコンテンツ逆アセンブル00000000:0..å : E5000030 : STR R0,[R0,#-48] 00000004 : .óŸå : E59FF31C : LDR PC,&00000328 00000008 : .óŸå : E59FF31C : LDR PC,&0000032C 0000000C : .óŸå : E59FF31C : LDR PC,&00000330 00000010 : .óŸå : E59FF31C : LDR PC,&00000334 00000014 : .óŸå : E59FF31C : LDR PC,&00000338 00000018 : .óŸå : E59FF31C : LDR PC,&0000033C 0000001C : 2?ü:E 3 A 0 A 632:MOV R 10,#&3200000よく見てみましょう.
    最初の命令と最後の命令(特殊な場合)を除いて、新しい値をPC(プログラムカウンタ)にロードする命令が見えます.コンピュータに次の命令を実行する場所を教えます.この値はメモリの1つのアドレスから受け入れられることも示した.(Zapメインメニューで「Read Memory」オプションを使って自分で見ることができます.)
    これはSWIとはあまり関係ないように見えますが、以下でさらに説明します.
    1つのSWIがしたことは、モードをスーパーユーザーに変更し、PCを設定してアドレス&08で次のコマンドを実行することです.プロセッサをスーパーユーザモードに変換すると2つのレジスタr 13とr 14が切り替わりr 13_svcとr 14_svcで置き換えます.
    スーパーユーザーモードに入るとr 14_svcは、このSWIコマンドの後のアドレスに設定されます.
    これは実際にはアドレス&08に接続された分岐命令(BL&08)のように見えるが、いくつかのデータ(SWI番号)に使用される空間がある.
    私が言ったように、アドレス&08には別のアドレスにジャンプする命令が含まれています.実際のSWIプログラムのアドレスです.
    「ちょっと待って!SWI番号は?」と思うかもしれません.実際にプロセッサはこの値自体を無視します.SWIプロセッサは、渡されたr 14_を使用するsvcの値を取得します.
    次に、メモリレジスタr 0~r 12の後に、そのステップを完了する.
  • r 14から4を減算して、SWI命令のアドレスを取得する.
  • この命令をレジスタにロードします.
  • この命令のハイエンド8ビットをクリアし、OpCodeを除いて残りのSWI番号のみを削除します.
  • この値を使用して、実行されるコードのインスタンスのアドレス(ルックアップテーブルなどを使用)を見つけます.
  • はレジスタr 0−r 12を復元する.
  • は、プロセッサをスーパーユーザモードから離す.
  • はこのルーチンのアドレスにジャンプします.

  • やさしいでしょう.
    次に、ARM 610 datasheetからの例を示します.
    0x08 B Supervisor

    EntryTable
    DCD ZeroRtn
    DCD ReadCRtn
    DCD WriteIRtn

    ...

    Zero EQU 0
    ReadC EQU 256
    WriteI EQU 512

    ; SWI 8-23 ( ) 0-7 。
    ; R13_svc

    STMFD R13, {r0-r2 , R14}
    ; 。
    LDR R0,[R14,#-4]
    ; SWI 。
    BIC R0,R0, #0xFF000000
    ; 8 。
    MOV R1, R0, LSR #8
    ; 。
    ADR R2, EntryTable
    ; (EntryTable) 。
    LDR R15,[R2,R1,LSL #2]
    ;

    WriteIRtn
    ; R0 0 - 7 。

    .............
    LDMFD R13, {r0-r2 , R15}^
    ; , 、 。
    これがSWI命令の基本的な処理ステップである.