コンテキストスイッチ処理の詳細について #14
-
概要こちらの関数の この辺りの処理が今ひとつ理解できないのですが、やっていることとしては 開発環境No response ソースコードのURLNo response |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 3 replies
-
|
また各レジスタ( |
Beta Was this translation helpful? Give feedback.
-
その通りです!C言語で考えると次のようなイメージです。 struct frame {
uint32_t ra;
uint32_t s0;
uint32_t s1;
uint32_t s2;
uint32_t s3;
uint32_t s4;
uint32_t s5;
uint32_t s6;
uint32_t s7;
uint32_t s8;
uint32_t s9;
uint32_t s10;
uint32_t s11;
};
// 擬似コード。ra, s0, ...はレジスタを操作しているつもり。
void riscv32_task_switch(uint32_t *prev_sp, uint32_t *next_sp) {
struct frame *f_prev = (スタックポインタからframe構造体の大きさだけ引いたアドレス); // addi sp, sp, -13 * 4
f_prev->ra = ra; // sw ra, 0 * 4(sp)
f_prev->s0 = s0; // sw s0, 1 * 4(sp)
f_prev->s1 = s1; // sw s1, 2 * 4(sp)
f_prev->s2 = s2; // sw s2, 3 * 4(sp)
f_prev->s3 = s3; // sw s3, 4 * 4(sp)
f_prev->s4 = s4; // sw s4, 5 * 4(sp)
f_prev->s5 = s5; // sw s5, 6 * 4(sp)
f_prev->s6 = s6; // sw s6, 7 * 4(sp)
f_prev->s7 = s7; // sw s7, 8 * 4(sp)
f_prev->s8 = s8; // sw s8, 9 * 4(sp)
f_prev->s9 = s9; // sw s9, 10 * 4(sp)
f_prev->s10 = s10; // sw s10, 11 * 4(sp)
f_prev->s11 = s11; // sw s11, 12 * 4(sp)
*prev_sp = sp; // sw sp, (a0) // 実行中タスクのスタックポインタを保存
sp = *next_sp; // lw sp, (a1) // 次のタスクのスタックポインタを復元
ra = f_next->ra; // lw ra, 0 * 4(sp)
s0 = f_next->s0; // lw s0, 1 * 4(sp)
s1 = f_next->s1; // lw s1, 2 * 4(sp)
s2 = f_next->s2; // lw s2, 3 * 4(sp)
s3 = f_next->s3; // lw s3, 4 * 4(sp)
s4 = f_next->s4; // lw s4, 5 * 4(sp)
s5 = f_next->s5; // lw s5, 6 * 4(sp)
s6 = f_next->s6; // lw s6, 7 * 4(sp)
s7 = f_next->s7; // lw s7, 8 * 4(sp)
s8 = f_next->s8; // lw s8, 9 * 4(sp)
s9 = f_next->s9; // lw s9, 10 * 4(sp)
s10 = f_next->s10; // lw s10, 11 * 4(sp)
s11 = f_next->s11; // lw s11, 12 * 4(sp)
sp = (spにframe構造体の大きさだけ足したアドレス); // addi sp, sp, 13 * 4
goto ra; // raに復元された値へジャンプ (return)
}まず、スタック上で退避領域 ( ここで、
こちらもその通りです!CPUには「各レジスタをどのように利用すべきか」という規約 (呼出規約) があります (こちらのZennの記事が参考になるかもしれません)。 それらのレジスタについては、関数呼び出しの前後で同じ値を保持している (破壊される際はちゃんと呼び出し先 が保存・復元する責任を持つ) ことを仮定した機械語をコンパイラが生成します。そこで、特別扱いして別途保存してあげるのが上記の処理になります。 |
Beta Was this translation helpful? Give feedback.
その通りです!C言語で考えると次のようなイメージです。