XINU
|
新しいプロセスを作成する。 More...
#include <xinu.h>
Go to the source code of this file.
Macros | |
#define | roundew(x) ((x + 3) & ~0x3) |
4の倍数でスタックサイズを丸める。 More... | |
Functions | |
pid32 | create (void *procaddr, uint32 ssize, pri16 priority, char *name, uint32 nargs,...) |
関数の実行を開始するプロセスを作成する。 More... | |
local int | newpid () |
新しいプロセスIDを取得するnewpid()の宣言 More... | |
新しいプロセスを作成する。
Definition in file create.c.
#define roundew | ( | x | ) | ((x + 3) & ~0x3) |
関数の実行を開始するプロセスを作成する。
Step1. 割り込みを禁止する。
Step2. スタックサイズがMINSTKを下回っていた場合、サイズをMINSTKまで引き上げ、丸めを行う。
Step3. 以下のいずれかを満たした場合は、割り込み許可状態に復元し、SYSERRを返す。
・スタックが確保できなかった場合
・全てのプロセスがFREE状態ではなかった場合(使用中だった場合)
・引数のプロセス優先度が1より小さかった場合
Step4. アクティブプロセス数を1増やす。 Step5. プロセステーブルエントリを以下の状態で初期化する。
・プロセス状態 = サスペンド
・プロセス優先度 = 引数で指定した優先度
・スタックアドレス = getstk()で取得したスタックアドレス( プロセススタックの最上位にオーバフロー検知マーカを付与)
・スタックサイズ = 引数で指定されたスタックサイズ(MINSTK以上のサイズ)
・プロセス名 = 引数で指定した名前(15文字 + NULL終端)
・セマフォとメッセージ = 未使用状態
・デバイスディスクリプタ = XINU Shell用に0:STDIN(標準入力)、1:STDOUT(標準出力)、2:STDERR(標準エラー)を設定
Step6. 可変長引数と関数ポインタをスタックに積む。前提として、ARMはr0〜r3レジスタが引数渡しに使用される。
可変長引数の5個目〜N個目をスタックに積んだ後、関数ポインタをスタックに積む。
引数をレジスタ渡しするためにスタックにr4〜r11用の情報(=0)を積み、r3〜r0用の情報(引数次第で変化)を積む。
Step7. 関数のリターンアドレス(INITRET = userret()であり、kill()を呼び出す)をスタックに積む。
Step8. CPSR F bitを有効化し、スーパバイザモードに移行するためのビットマスクをスタックに積む。
このビットマスクは、コンテキストスイッチ中のリストア時に使用される。
Step9. 新しいスタックアドレスをプロセステーブルにセットする。
Step10. 割り込み許可状態に復元する。
[in] | procaddr | 関数ポインタ(プロセスのエントリポイント) |
[in] | ssize | スタックサイズ(Byte) |
[in] | priority | プロセスの優先度(> 0) |
[in] | name | プロセス名(デバッグ用) |
[in] | nargs | 本引数より後にある引数の総数 |
[in] | ... | 可変長引数 |
Definition at line 55 of file create.c.
References CONSOLE, disable(), FALSE, getpid(), getstk(), INITRET, MINSTK, newpid(), NULLCH, PNMLEN, PR_SUSP, prcount, procent::prdesc, procent::prhasmsg, procent::prname, proctab, procent::prparent, procent::prprio, procent::prsem, procent::prstate, procent::prstkbase, procent::prstklen, procent::prstkptr, restore(), roundew, STACKMAGIC, and SYSERR.
Referenced by main(), net_init(), nulluser(), rdsinit(), shell(), and startup().
新しいプロセスIDを取得するnewpid()の宣言
新しいPID(FREEなPID)を取o得する。
newpid()内で、前回のnewpid()実行結果に1を加算したPIDを保持している。
このPIDから順番に、状態がFREEなプロセスをプロセステーブルから探す。
検索は全てのプロセスに対して行われ、探索対象のPIDがNPROC(プロセス総数)と一致した場合、
検索対象のPIDが0番に戻る(nextpid %= NPROC;部分)
Definition at line 131 of file create.c.
References NPROC, PR_FREE, proctab, procent::prstate, and SYSERR.
Referenced by create().