Annotation of researchv10no/sys/os/main.c, revision 1.1.1.1

1.1       root        1: #include "sys/param.h"
                      2: #include "sys/systm.h"
                      3: #include "sys/user.h"
                      4: #include "sys/filsys.h"
                      5: #include "sys/mtpr.h"
                      6: #include "sys/pte.h"
                      7: #include "sys/proc.h"
                      8: #include "sys/inode.h"
                      9: #include "sys/conf.h"
                     10: #include "sys/buf.h"
                     11: #include "sys/clock.h"
                     12: #include "sys/vm.h"
                     13: #include "sys/text.h"
                     14: #include "sys/vlimit.h"
                     15: #include "sys/file.h"
                     16: 
                     17: /*
                     18:  * Initialization code.
                     19:  * Called from cold start routine as
                     20:  * soon as a stack and segmentation
                     21:  * have been established.
                     22:  * Functions:
                     23:  *     clear and free user core
                     24:  *     turn on clock
                     25:  *     hand craft 0th process
                     26:  *     call all initialization routines
                     27:  *     fork - process 0 to schedule
                     28:  *          - process 2 to page out
                     29:  *          - process 1 execute bootstrap
                     30:  *
                     31:  * loop at low addr in user mode -- /etc/init
                     32:  *     cannot be executed.
                     33:  */
                     34: struct proc *procNPROC;
                     35: struct text *textNTEXT;
                     36: struct file *fileNFILE;
                     37: struct inode *inodeNINODE;
                     38: time_t bootime;                /* should probably go away */
                     39: 
                     40: main()
                     41: {
                     42:        register int i;
                     43:        register struct proc *p;
                     44:        extern char sigcode[];
                     45:        extern int szsigcode;
                     46:        extern char icode[];
                     47:        extern int szicode;
                     48:        extern int swbufcnt;
                     49: 
                     50:        rqinit();
                     51:        procNPROC = &proc[SYSPIDS];
                     52:        textNTEXT = &text[textcnt];
                     53:        fileNFILE = &file[filecnt];
                     54:        inodeNINODE = &inode[inodecnt];
                     55:        startup();
                     56: 
                     57:        /*
                     58:         * set up system process 0 (swapper)
                     59:         */
                     60:        p = &proc[SWAPPID];
                     61:        p->p_stat = SRUN;
                     62:        p->p_flag |= SLOAD|SSYS;
                     63:        p->p_nice = NZERO;
                     64:        u.u_procp = p;
                     65:        bcopy((caddr_t)sigcode, (caddr_t)u.u_pcb.pcb_sigc, szsigcode);
                     66:        u.u_cmask = CMASK;
                     67:        for (i = 0; i < NGROUPS; i++)
                     68:                u.u_groups[i] = NOGROUP;        /* null access group for init */
                     69:        for (i = 1; i < sizeof(u.u_limit)/sizeof(u.u_limit[0]); i++)
                     70:                u.u_limit[i] = INFINITY;
                     71:        u.u_limit[LIM_STACK] = ctob(maxssize);
                     72:        u.u_limit[LIM_DATA] = ctob(maxdsize);
                     73:        u.u_limit[LIM_TEXT] = ctob(maxtsize);
                     74:        p->p_maxrss = INFINITY/NBPG;
                     75:        callinit();
                     76:        clkstart();
                     77: 
                     78:        /*
                     79:         * Initialize devices and
                     80:         * set up 'known' i-nodes
                     81:         */
                     82: 
                     83:        ihinit();
                     84:        bhinit();
                     85:        binit();
                     86:        qinit();
                     87:        bswinit();
                     88:        iinit();
                     89:        bootime = time;
                     90:        u.u_dmap = zdmap;
                     91:        u.u_smap = zdmap;
                     92: 
                     93:        /*
                     94:         * Set the scan rate and other parameters of the paging subsystem.
                     95:         */
                     96:        setupclock();
                     97: 
                     98:        /*
                     99:         * make page-out daemon (process 2)
                    100:         * the daemon has ctopt(swbufcnt*CLSIZE*KLMAX) pages of page
                    101:         * table so that it can map dirty pages into
                    102:         * its address space during asychronous pushes.
                    103:         * this stuff should be shoved out to a vm init routine.
                    104:         */
                    105: 
                    106:        p->p_szpt = clrnd(ctopt(swbufcnt*CLSIZE*KLMAX + UPAGES));
                    107:        if (newproc(&proc[PAGEPID], PAGEPID)) {
                    108:                proc[PAGEPID].p_flag |= SLOAD|SSYS;
                    109:                proc[PAGEPID].p_dsize = u.u_dsize = swbufcnt*CLSIZE*KLMAX; 
                    110:                pageout();
                    111:        }
                    112:        /*
                    113:         * make init process and
                    114:         * enter scheduling loop
                    115:         */
                    116:        p->p_szpt = CLSIZE;
                    117:        if (newproc(&proc[INITPID], INITPID)) {
                    118:                expand(clrnd((int)btoc(szicode)), P0BR);
                    119:                (void) swpexpand(u.u_dsize, 0, &u.u_dmap, &u.u_smap);
                    120:                (void) copyout((caddr_t)icode, (caddr_t)0, (unsigned)szicode);
                    121:                /*
                    122:                 * Return goes to loc. 0 of user init
                    123:                 * code just copied out.
                    124:                 */
                    125:                return;
                    126:        }
                    127:        p->p_szpt = 1;
                    128:        sched();
                    129: }
                    130: 
                    131: /*
                    132:  * iinit is called once (from main)
                    133:  * very early in initialization.
                    134:  * It reads the root's super block
                    135:  * it mounts the root filesystem.
                    136:  * there is a small amount of magic:
                    137:  * an inode is invented to hold the special file
                    138:  * for the root device, so it is known that
                    139:  * a special file in that filesystem is involved;
                    140:  * the filesystem is mounted on the special file,
                    141:  * then patched so that the root is also the mount point.
                    142:  * some of this magic should be removed.
                    143:  *
                    144:  * some filesystem types init the date, again through magic
                    145:  */
                    146: 
                    147: static struct inode rootspcl;
                    148: 
                    149: iinit()
                    150: {
                    151:        register struct inode *ip;
                    152:        extern int rootfstyp;
                    153: 
                    154:        bdevopen(rootdev);
                    155:        if (u.u_error)
                    156:                panic("iinit root");
                    157:        bdevopen(swapdev);
                    158:        if (u.u_error)
                    159:                panic("iinit swap");
                    160:        rootspcl.i_dev = NODEV;
                    161:        rootspcl.i_fstyp = rootfstyp;
                    162:        rootspcl.i_mode = IFBLK;
                    163:        rootspcl.i_un.i_rdev = rootdev;
                    164:        rootspcl.i_count = 1;
                    165:        /* rootspcl.i_un.i_bufp == NULL; does it matter? */
                    166:        if (fstypsw[rootfstyp] == NULL)
                    167:                panic("iinit fstyp");
                    168:        (*fstypsw[rootfstyp]->t_mount)(&rootspcl, &rootspcl, 0, 1, rootfstyp);
                    169:        if (u.u_error)
                    170:                panic("iinit mount");
                    171:        ip = rootspcl.i_mroot;
                    172:        ip->i_mpoint = ip;
                    173:        ip->i_mroot = NULL;     /* own mount point, but not mounted on self */
                    174:        rootdir = ip;
                    175:        u.u_cdir = ip;
                    176:        ip->i_count += 2;       /* needed? */
                    177:        u.u_rdir = NULL;
                    178: }
                    179: 
                    180: /*
                    181:  * open a block device, with no more than dev
                    182:  */
                    183: 
                    184: bdevopen(dev)
                    185: dev_t dev;
                    186: {
                    187:        register unsigned maj;
                    188: 
                    189:        maj = major(dev);
                    190:        if (maj >= nblkdev || bdevsw[maj] == NULL) {
                    191:                u.u_error = ENODEV;
                    192:                return;
                    193:        }
                    194:        (*bdevsw[maj]->d_open)(dev, FREAD|FWRITE);
                    195: }
                    196: 
                    197: /*
                    198:  * Initialize the buffer I/O system by freeing
                    199:  * all buffers and setting all device buffer lists to empty.
                    200:  */
                    201: binit()
                    202: {
                    203:        register struct buf *bp;
                    204:        register struct buf *dp;
                    205:        register int i;
                    206: 
                    207:        for (dp = bfreelist; dp < &bfreelist[BQUEUES]; dp++) {
                    208:                dp->b_forw = dp->b_back = dp->av_forw = dp->av_back = dp;
                    209:                dp->b_flags = B_HEAD;
                    210:        }
                    211:        dp--;                           /* dp = &bfreelist[BQUEUES-1]; */
                    212:        for (i=0; i<nbuf; i++) {
                    213:                bp = &buf[i];
                    214:                bp->b_dev = NODEV;
                    215:                bp->b_un.b_addr = buffers + i * BUFSIZE;
                    216:                bp->b_back = dp;
                    217:                bp->b_forw = dp->b_forw;
                    218:                dp->b_forw->b_back = bp;
                    219:                dp->b_forw = bp;
                    220:                bp->b_flags = B_BUSY|B_INVAL;
                    221:                brelse(bp);
                    222:        }
                    223: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.