XINU
create.c
Go to the documentation of this file.
1 
5 #include <xinu.h>
6 
8 local int newpid();
9 
16 #define roundew(x) ((x + 3) & ~0x3)
17 
55 pid32 create(void *procaddr, uint32 ssize, pri16 priority, char *name, uint32 nargs, ...)
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 }
122 
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 }
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
int16 pri16
プロセス優先度
Definition: kernel.h:30
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
#define NPROC
Definition: conf.h:79
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
#define PR_FREE
プロセステーブルエントリが使用されていない状態。
Definition: process.h:35
pid32 getpid(void)
現在実行中のプロセスIDを返す。
Definition: getpid.c:11
#define local
ローカル関数かローカル変数の宣言
Definition: kernel.h:60
struct procent proctab[]
プロセステーブル。
Definition: initialize.c:23
pid32 create(void *procaddr, uint32 ssize, pri16 priority, char *name, uint32 nargs,...)
関数の実行を開始するプロセスを作成する。
Definition: create.c:55
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