XINU
Macros | Functions
create.c File Reference

新しいプロセスを作成する。 More...

#include <xinu.h>
Include dependency graph for create.c:

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...
 

Detailed Description

新しいプロセスを作成する。

Definition in file create.c.

Macro Definition Documentation

◆ roundew

#define roundew (   x)    ((x + 3) & ~0x3)

4の倍数でスタックサイズを丸める。

Parameters
[in]xスタックサイズ
Returns
下位2Bitを切り落とし、4の倍数で丸めたスタックサイズを返す。

Definition at line 16 of file create.c.

Referenced by create().

Function Documentation

◆ create()

pid32 create ( void *  procaddr,
uint32  ssize,
pri16  priority,
char *  name,
uint32  nargs,
  ... 
)

関数の実行を開始するプロセスを作成する。

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. 割り込み許可状態に復元する。

Parameters
[in]procaddr関数ポインタ(プロセスのエントリポイント)
[in]ssizeスタックサイズ(Byte)
[in]priorityプロセスの優先度(> 0)
[in]nameプロセス名(デバッグ用)
[in]nargs本引数より後にある引数の総数
[in]...可変長引数
Returns
成功時は作成したプロセスのID、以下の場合はSYSERRを返す。
 ・スタックが確保できなかった場合
 ・全てのプロセスがFREE状態ではなかった場合(使用中だった場合)
 ・引数のプロセス優先度が1より小さかった場合

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().

56 {
57  intmask mask; /* interrupt mask */
58  pid32 pid; /* stores new process id */
59  struct procent *prptr; /* pointer to proc. table entry */
60  int32 i;
61  uint32 *a; /* points to list of args */
62  uint32 *saddr; /* stack address */
63 
64  mask = disable();
65  if (ssize < MINSTK)
66  ssize = MINSTK;
67  ssize = (uint32)roundew(ssize);
68  if (((saddr = (uint32 *)getstk(ssize)) ==
69  (uint32 *)SYSERR) ||
70  (pid = newpid()) == SYSERR || priority < 1)
71  {
72  restore(mask);
73  return SYSERR;
74  }
75 
76  prcount++;
77  prptr = &proctab[pid];
78 
79  /* initialize process table entry for new process */
80  prptr->prstate = PR_SUSP; /* initial state is suspended */
81  prptr->prprio = priority;
82  prptr->prstkbase = (char *)saddr;
83  prptr->prstklen = ssize;
84  prptr->prname[PNMLEN - 1] = NULLCH;
85  for (i = 0; i < PNMLEN - 1 && (prptr->prname[i] = name[i]) != NULLCH; i++)
86  ;
87  prptr->prsem = -1;
88  prptr->prparent = (pid32)getpid();
89  prptr->prhasmsg = FALSE;
90 
91  /* set up initial device descriptors for the shell */
92  prptr->prdesc[0] = CONSOLE; /* stdin is CONSOLE device */
93  prptr->prdesc[1] = CONSOLE; /* stdout is CONSOLE device */
94  prptr->prdesc[2] = CONSOLE; /* stderr is CONSOLE device */
95 
96  /* Initialize stack as if the process was called */
97 
98  *saddr = STACKMAGIC;
99 
100  /* push arguments */
101  a = (uint32 *)(&nargs + 1); /* start of args */
102  a += nargs - 1; /* last argument */
103  for (; nargs > 4; nargs--) /* machine dependent; copy args */
104  *--saddr = *a--; /* onto created process's stack */
105  *--saddr = (long)procaddr;
106  for (i = 11; i >= 4; i--)
107  *--saddr = 0;
108  for (i = 4; i > 0; i--)
109  {
110  if (i <= nargs)
111  *--saddr = *a--;
112  else
113  *--saddr = 0;
114  }
115  *--saddr = (long)INITRET; /* push on return address */
116  *--saddr = (long)0x00000053; /* CPSR F bit set, */
117  /* Supervisor mode */
118  prptr->prstkptr = (char *)saddr;
119  restore(mask);
120  return pid;
121 }
pid32 prparent
このプロセスを作成したプロセスID(親プロセスID)。
Definition: process.h:102
void restore(intmask)
int32 prcount
現在アクティブのプロセス。
Definition: initialize.c:30
#define MINSTK
最小のスタックサイズ(Byte)
Definition: kernel.h:89
#define PR_SUSP
プロセスがサスペンド(休止)させられた状態。
Definition: process.h:45
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define roundew(x)
4の倍数でスタックサイズを丸める。
Definition: create.c:16
#define CONSOLE
Definition: conf.h:28
local int newpid()
新しいプロセスIDを取得するnewpid()の宣言
Definition: create.c:131
#define INITRET
プロセスが戻るアドレス。
Definition: process.h:61
uint32 prstklen
Bytesで表されたスタックの長さ(最大値。Byte)。
Definition: process.h:96
pri16 prprio
プロセスのスケジューリング優先度。
Definition: process.h:90
#define PNMLEN
プロセス名の長さ
Definition: process.h:52
#define FALSE
Boolean False(0)
Definition: kernel.h:63
sid32 prsem
プロセスが待機しているセマフォ。
Definition: process.h:100
char prname[PNMLEN]
プロセス名。
Definition: process.h:98
char * prstkbase
ランタイムスタックの基点(メモリ領域で最上位のアドレス)。
Definition: process.h:94
uint32 intmask
保存された割り込みマスク
Definition: kernel.h:38
int16 prdesc[NDESC]
プロセス用のデバイスディスクリプタ
Definition: process.h:108
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition: process.h:88
#define STACKMAGIC
プロセススタックの最上位に配置するマーカ(オーバフロー検出に用いる)
Definition: process.h:112
pid32 getpid(void)
現在実行中のプロセスIDを返す。
Definition: getpid.c:11
struct procent proctab[]
プロセステーブル。
Definition: initialize.c:23
int32 pid32
プロセスID
Definition: kernel.h:26
プロセステーブル(32bitsの倍数)。
Definition: process.h:85
unsigned int uint32
符号なし32ビット整数(unsigned int)
Definition: kernel.h:15
bool8 prhasmsg
有効(Valid)メッセージの場合、非0となる。
Definition: process.h:106
#define NULLCH
NULL文字(NULL終端)
Definition: kernel.h:70
char * getstk(uint32)
スタックメモリを割り当て、最上位のワードアドレスを返す。
Definition: getstk.c:25
intmask disable(void)
割り込み禁止(intr.Sに定義がある)
char * prstkptr
保存されたスタックポインタ。
Definition: process.h:92
Here is the call graph for this function:
Here is the caller graph for this function:

◆ newpid()

local pid32 newpid ( void  )

新しいプロセスIDを取得するnewpid()の宣言

新しいPID(FREEなPID)を取o得する。

newpid()内で、前回のnewpid()実行結果に1を加算したPIDを保持している。
このPIDから順番に、状態がFREEなプロセスをプロセステーブルから探す。
検索は全てのプロセスに対して行われ、探索対象のPIDがNPROC(プロセス総数)と一致した場合、
検索対象のPIDが0番に戻る(nextpid %= NPROC;部分)

Returns
成功時は新しいPID、全てのプロセスがFREE状態ではなかった場合SYSERRを返す。

Definition at line 131 of file create.c.

References NPROC, PR_FREE, proctab, procent::prstate, and SYSERR.

Referenced by create().

132 {
133  uint32 i; /* iterate through all processes*/
134  static pid32 nextpid = 1; /* position in table to try or */
135  /* one beyond end of table */
136 
137  /* check all NPROC slots */
138 
139  for (i = 0; i < NPROC; i++)
140  {
141  nextpid %= NPROC; /* wrap around to beginning */
142  if (proctab[nextpid].prstate == PR_FREE)
143  {
144  return nextpid++;
145  }
146  else
147  {
148  nextpid++;
149  }
150  }
151  return (pid32)SYSERR;
152 }
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define NPROC
Definition: conf.h:79
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition: process.h:88
#define PR_FREE
プロセステーブルエントリが使用されていない状態。
Definition: process.h:35
struct procent proctab[]
プロセステーブル。
Definition: initialize.c:23
int32 pid32
プロセスID
Definition: kernel.h:26
unsigned int uint32
符号なし32ビット整数(unsigned int)
Definition: kernel.h:15
Here is the caller graph for this function: