PowerPC のシステムコールの仕組み

PowerPCのカーネルソース (/usr/src/linux/arch/ppc/kernel の head.S、entry.S、misc.S) を眺めてシステムコールの流れを追ってみました。


システムコールに伴う処理の流れの概要は次のようになっています。

  sc命令  (ユーザプログラム、r0にシステムコール番号、r3-r7に引数)

    ↓

  0xC00 の割り込みベクタ (linux/arch/ppc/kernel/head.S)

    ↓  レジスタ退避 (lr,ctr,cr,r0-r12)

  transfer_to_handler (linux/arch/ppc/kernel/head.S)

    ↓  飛び先:DoSyscall、戻り先:ret_from_exceptを指定

  DoSyscall (linux/arch/ppc/kernel/entry.S)

    ↓  r0 と sys_call_table (misc.S) から飛び先を決定

  システムコールを実行

    ↓  sys_XXX を実行 (XXXはシステムコール名)

  ret_from_except (linux/arch/ppc/kernel/entry.S) レジスタ復帰 (lr,ctr,cr,r0-r12)

    ↓  

  戻る (r3に結果)

システムコール自体は、名前に「sys_」がついたCの関数としてカーネルソース中に分散して書かれています。Cの関数は引数をレジスタで渡すようになっていて、 r3 以降に順に引数が格納されて呼び出され、結果は r3 に返ります。