2016-06-28 7 views
0

わかりましたが、ARMにはspおよびlrなどのバンクレジスタがあります。換言すれば、 IRQモードにある間、sp_usr(及びlr_usr)はsp_irqによって影、すなわち、見えません。だから、私の質問は、割り込みハンドラが保存する方法ですsp_usrsp_usrは、irqモードでは不可視でアクセス不可能なため、割り込みの処理中は自動的に変更されないため、これは不要であると考える人もいます。ただし、必ずしもそうではありません。以下のシナリオを検討してください。ARMでは、ユーザモードで実行中のスレッドが中断された場合、sp_usrレジスタを保存する方法

a)スレッドAはユーザー空間で実行されています。

b)外部割り込みが発生します。

c)ハンドラが実行され、高い優先度を持つスレッドBが待機していたリソースを取得したので、再スケジュールすることを決定します。

d)は、スレッドAのコンテキストは今Bは、次にバックユーザモードにおいて、SVCモードで最初の、実行スレッド保存します。 これは、スレッドBが睡眠のようなものを呼び出す)sp_usrの値は、スレッドB.

電子によって上書きされるだけの瞬間です。スレッドAは中断された時点から実行を再開します。

したがって、スレッドAが中断されたときにsp_usrが保存されなかった場合、スレッドAはどのようにコンテキストを復元しますか?

+0

明らかに、SP&LRを保存して後で復元する必要があります。 CPUがユーザモードまたはシステムモードのいずれかになっているときにそれらを保存する必要があります。 –

+0

あなたが見ているARMアーキテクチャのバージョンを明確にする必要があります。これは、解答の詳細に影響を与える可能性があります。 –

+0

@Sean Houlihane私はARMv7 Cortex-A9を使用しています – xiaokaoy

答えて

1

スレッドBへのコンテキスト切り替え前にsp_usrを保存してから、スレッドBがスリープ状態になり、スレッドAのコンテキストが復元される必要があります。スレッドAのsp_usrが保存されていない場合、スレッドAは失われます。一般に、コンテキストスイッチでは、現在のspが現在のタスク制御ブロックに保存されます。新しいタスクが選択されると、spは新しいタスク制御ブロックから復元されます。

このスレッドを参照してください:ARM. Access user R13 and R14 from Supervisor mode

これの多くは、使用している上、ARMアーキテクチャに依存しません!

関連する問題