create.c,v
来自「TCP-IP红宝书源代码」· C,V 代码 · 共 316 行
C,V
316 行
head 1.5;
access;
symbols;
locks
dls:1.5; strict;
comment @ * @;
1.5
date 97.09.21.19.29.30; author dls; state Dist;
branches;
next 1.4;
1.4
date 94.05.07.19.26.36; author dls; state Works;
branches;
next 1.3;
1.3
date 94.05.06.03.12.23; author dls; state Works;
branches;
next 1.2;
1.2
date 94.05.06.02.31.36; author dls; state Old;
branches;
next 1.1;
1.1
date 94.05.01.16.07.01; author dls; state Works;
branches;
next ;
desc
@
@
1.5
log
@pre-3e code
@
text
@/* create.c - create, newpid */
#include <conf.h>
#include <i386.h>
#include <kernel.h>
#include <proc.h>
#include <sem.h>
#include <mem.h>
#include <io.h>
static unsigned long esp;
/*------------------------------------------------------------------------
* create - create a process to start running a procedure
*------------------------------------------------------------------------
*/
SYSCALL create(procaddr,ssize,priority,name,nargs,args)
int *procaddr; /* procedure address */
int ssize; /* stack size in words */
int priority; /* process priority > 0 */
char *name; /* name (for debugging) */
int nargs; /* number of args that follow */
long args; /* arguments (treated like an */
/* array in the code) */
{
unsigned long savsp, *pushsp;
STATWORD ps;
int pid; /* stores new process id */
struct pentry *pptr; /* pointer to proc. table entry */
int i;
unsigned long *a; /* points to list of args */
unsigned long *saddr; /* stack address */
unsigned long *getstk();
int INITRET();
disable(ps);
if (ssize < MINSTK)
ssize = MINSTK;
ssize = (int) roundew(ssize);
if (((saddr = (unsigned long *)getstk(ssize)) ==
(unsigned long *)SYSERR ) ||
(pid=newpid()) == SYSERR || priority < 1 ) {
restore(ps);
return(SYSERR);
}
numproc++;
pptr = &proctab[pid];
pptr->fildes[0] = 0; /* stdin set to console */
pptr->fildes[1] = 0; /* stdout set to console */
pptr->fildes[2] = 0; /* stderr set to console */
for (i=3; i < _NFILE; i++) /* others set to unused */
pptr->fildes[i] = FDFREE;
pptr->pstate = PRSUSP;
for (i=0 ; i<PNMLEN && (int)(pptr->pname[i]=name[i])!=0 ; i++)
;
pptr->pprio = priority;
pptr->pbase = (long) saddr;
pptr->pstklen = ssize;
pptr->psem = 0;
pptr->phasmsg = FALSE;
pptr->plimit = pptr->pbase - ssize + sizeof (long);
pptr->pirmask[0] = 0;
pptr->pnxtkin = BADPID;
pptr->pdevs[0] = pptr->pdevs[1] = BADDEV;
/* Bottom of stack */
*saddr = MAGIC;
savsp = (unsigned long)saddr;
/* push arguments */
pptr->pargs = nargs;
a = (unsigned long *)(&args) + (nargs-1); /* last argument */
for ( ; nargs > 0 ; nargs--) /* machine dependent; copy args */
*--saddr = *a--; /* onto created process' stack */
*--saddr = (long)INITRET; /* push on return address */
*--saddr = pptr->paddr = (long)procaddr; /* where we "ret" to */
*--saddr = savsp; /* fake frame ptr for procaddr */
savsp = (unsigned long) saddr;
/* this must match what ctxsw expects: flags, regs, old SP */
/* emulate 386 "pushal" instruction */
*--saddr = 0;
*--saddr = 0; /* %eax */
*--saddr = 0; /* %ecx */
*--saddr = 0; /* %edx */
*--saddr = 0; /* %ebx */
*--saddr = 0; /* %esp; fill in below */
pushsp = saddr;
*--saddr = savsp; /* %ebp */
*--saddr = 0; /* %esi */
*--saddr = 0; /* %edi */
*pushsp = pptr->pesp = (unsigned long)saddr;
restore(ps);
return(pid);
}
/*------------------------------------------------------------------------
* newpid -- obtain a new (free) process id
*------------------------------------------------------------------------
*/
LOCAL newpid()
{
int pid; /* process id to return */
int i;
for (i=0 ; i<NPROC ; i++) { /* check all NPROC slots */
if ( (pid=nextproc--) <= 0)
nextproc = NPROC-1;
if (proctab[pid].pstate == PRFREE)
return(pid);
}
return(SYSERR);
}
@
1.4
log
@*** empty log message ***
@
text
@a25 1
struct sd *psd;
d27 2
a28 2
STATWORD ps;
int pid; /* stores new process id */
d30 5
a34 5
int i, base;
unsigned long *a; /* points to list of args */
unsigned long *saddr; /* stack address */
unsigned long *getstk();
int INITRET();
d40 3
a42 2
if (((saddr = getstk(ssize)) == (long *)SYSERR ) ||
(pid=newpid()) == SYSERR || priority < 1 ) {
a45 1
kprintf("in create, newpid %d\n", pid);
d72 1
a72 1
savsp = saddr;
d76 1
a76 1
a = (&args) + (nargs-1); /* point to last argument */
d83 1
a83 1
savsp = saddr;
@
1.3
log
@*** empty log message ***
@
text
@d46 1
a46 1
kprintf("getstk returns %d (%X) ssize %d\n", saddr, saddr, ssize);
a69 2
kprintf("pbase %X plimit %X pstklen %d\n", pptr->pbase, pptr->plimit,
pptr->pstklen);
a70 2
asm("movl %esp,_esp");
kprintf("create esp before %X\n", esp);
a71 1
kprintf("setting %X to %X (MAGIC)\n", saddr, MAGIC);
a98 1
kprintf("base %d (%X) saddr last %d (%X)\n", pptr->pbase, pptr->pbase,saddr, saddr);
@
1.2
log
@*** empty log message ***
@
text
@a85 11
*--saddr = savsp; /* frame pointer for INITRET */
savsp = saddr;
/*
* At this point, the stack looks like a call of the new process
* by INITRET(). Now push frame for call to ctxsw and the saved
* state that ctxsw expects to restore.
*/
*--saddr = (unsigned long)&pptr->pirmask; /* arg4 to ctxsw; new mask */
*--saddr = (unsigned long)&pptr->pesp; /* arg3 to ctxsw; newsp */
*--saddr = 0; /* space for fake oldsp */
*--saddr = 0; /* space for fake oldmask */
d88 2
a89 1
*--saddr = savsp; /* fake frame ptr for ctxsw */
@
1.1
log
@Initial revision
@
text
@d11 2
d23 1
a23 1
WORD args; /* arguments (treated like an */
d27 1
d32 3
a34 3
WORD *a; /* points to list of args */
WORD *saddr; /* stack address */
WORD *getstk();
d41 1
a41 1
if (((saddr = getstk(ssize)) == (WORD *)SYSERR ) ||
d46 2
a47 2
kprintf("getstk returns %X\n", saddr);
d62 1
a62 1
pptr->pbase = (WORD) saddr;
d66 9
a74 1
pptr->plimit = pptr->pbase - ssize + sizeof (WORD);
d76 5
a80 1
*saddr-- = MAGIC;
a81 6
for (i=0 ; i<PNREGS ; i++)
pptr->pregs[i]=INITREG;
/* pptr->pregs[PC] = pptr->paddr = (WORD)procaddr; */
/* pptr->pregs[PS] = INITPS; */
pptr->pnxtkin = BADPID;
pptr->pdevs[0] = pptr->pdevs[1] = BADDEV;
d83 32
a114 28
for ( ; nargs > 0 ; nargs--) { /* machine dependent; copy args */
*saddr-- = *a--;
}
/* onto created process' stack */
*saddr = (WORD)INITRET; /* push on return address */
/* pptr->pregs[SSP] = (WORD)saddr; */
pptr->segtr.len = sizeof(pptr->segdesc) - 1;
pptr->segtr.addr = pptr->segdesc;
psd = &pptr->segdesc[ILSTACK];
/* set up stack segment descriptor */
psd->sd_lolimit = ssize;
psd->sd_hilimit = ssize >> 16;
base = pptr->plimit - sizeof(WORD);
kprintf("stack base %X limit %d\n", base, ssize);
psd->sd_lobase = base;
psd->sd_midbase = base >> 16;
psd->sd_hibase = base >> 24;
psd->sd_perm = 3; /* R/W */
psd->sd_iscode = 0;
psd->sd_isapp = 1;
psd->sd_dpl = 0;
psd->sd_present = 1;
psd->sd_avl = 1;
psd->sd_mbz = 0;
psd->sd_32b = 1;
@
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?