4

システムコール呼び出しの実行を取得でき、カーネルで処理しています。しかし、私にはまだはっきりしていないことがいくつかあります。swi ルーチンに入ると、カーネルはユーザー モード レジスタをスタックに保存します。質問は-

  1. 誰のスタックですか?(swi 処理と対応するシステム コール ルーチンが動作するスタック フレームを必要とするため)

  2. カーネル独自のスタックの場合、スタックはどこから割り当てられますか..? 現在のスタックの使用を開始しますか? はいの場合、 current は、カーネルでその時点で実行されている可能性のあるプロセスです。これは現在のスタックを使い果たしませんか?

  3. 現在実行中のユーザー プロセスのスタックを swi ハンドラーで使用する場合、これはカーネルがアクセスするユーザー アドレス空間になります。これは可能ですか?カーネルのアドレス可能なメモリが 1GB 以内であるため (4GB RAM メモリ システムで 1:3 のカーネル対ユーザー アドレス空間比率が使用されている場合)。

4

2 に答える 2

5

ほとんどの ARM モードには個別のスタックがあります。スタックは通常、リセット ハンドラの直後に設定されます。arch/arm/kernel/setup.c から:

/*
 * setup stacks for re-entrant exception handlers
 */
__asm__ (
"msr    cpsr_c, %1\n\t"
"add    sp, %0, %2\n\t"
"msr    cpsr_c, %3\n\t"
"add    sp, %0, %4\n\t"
"msr    cpsr_c, %5\n\t"
"add    sp, %0, %6\n\t"
"msr    cpsr_c, %7"
    :
    : "r" (stk),
      "I" (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),
      "I" (offsetof(struct stack, irq[0])),
      "I" (PSR_F_BIT | PSR_I_BIT | ABT_MODE),
      "I" (offsetof(struct stack, abt[0])),
      "I" (PSR_F_BIT | PSR_I_BIT | UND_MODE),
      "I" (offsetof(struct stack, und[0])),
      "I" (PSR_F_BIT | PSR_I_BIT | SVC_MODE)
    : "r14");

PS SVC は、SWI と呼ばれていたものの現在の名前です。

于 2012-06-29T11:26:05.670 に答える
0

It is true that the stack is specific to ARM modes.

This is the fast syscall return path. We do as little as possible here, and this includes saving r0 back into the SVC stack.

The above lines are quoted in entry-common.S. So the stack is SVC stack. (Note: swi is replaced by svc).

于 2012-11-01T13:52:04.917 に答える