/*------------------------------------------------------------------------ * nulluser -- initialize system and become the null process (id==0) *------------------------------------------------------------------------ */ nulluser() /* babysit CPU when no one is home */ { int userpid; console_dev = SERIAL0; /* set console to COM0 */ initevec(); kprintf("system running up!\n"); sysinit(); /* create a process to execute the user's main program */ /*****************************/ enable(); /* enable interrupts */ sprintf(vers, "PC Xinu %s", VERSION); kprintf("\n\n%s\n", vers); if (reboot++ < 1) kprintf("\n"); else kprintf(" (reboot %d)\n", reboot); kprintf("%d bytes real mem\n", (unsigned long) maxaddr+1); #ifdef DETAIL kprintf(" %d", (unsigned long) 0); kprintf(" to %d\n", (unsigned long) (maxaddr) ); #endif kprintf("%d bytes Xinu code\n", (unsigned long) ((unsigned long) &end - (unsigned long) start)); #ifdef DETAIL kprintf(" %d", (unsigned long) start); kprintf(" to %d\n", (unsigned long) &end ); #endif #ifdef DETAIL kprintf("%d bytes user stack/heap space\n", (unsigned long) ((unsigned long) maxaddr - (unsigned long) &end)); kprintf(" %d", (unsigned long) &end); kprintf(" to %d\n", (unsigned long) maxaddr); #endif kprintf("clock %sabled\n", clkruns == 1?"en":"dis"); userpid = create(main, INITSTK, INITPRIO, INITNAME, INITARGS); enable_paging((proctab[NULLPROC].pd->frm_num) * NBPG); enable(); resume(userpid); /* create a process to execute the user's main program */ while (TRUE) /* empty */; }
/*------------------------------------------------------------------------ * nulluser -- initialize system and become the null process (id==0) *------------------------------------------------------------------------ */ int nulluser() /* babysit CPU when no one home */ { // int userpid; console_dev = SERIAL0; initevec(); sysinit(); sprintf(vers, "Xinu Version %s", VERSION); kprintf("\n\n%s\n", vers); if (reboot++ < 1) kprintf("\n"); else kprintf("(reboot #%d)\n", reboot); kprintf("%d bytes real mem\n", (unsigned long) maxaddr+1); #ifdef DETAIL kprintf(" %d", (unsigned long) 0); kprintf(" to %d\n", (unsigned long) (maxaddr) ); #endif kprintf("%d bytes Xinu code\n", (unsigned long) ((unsigned long) &end - (unsigned long) start)); #ifdef DETAIL kprintf(" %d", (unsigned long) start); kprintf(" to %d\n", (unsigned long) &end ); #endif #ifdef DETAIL kprintf("%d bytes user stack/heap space\n", (unsigned long) ((unsigned long) maxaddr - (unsigned long) &end)); kprintf(" %d", (unsigned long) &end); kprintf(" to %d\n", (unsigned long) maxaddr); #endif kprintf("clock %sabled\n", clkruns == 1?"en":"dis"); enable(); /* enable interrupts */ open(CONSOLE, console_dev, 0); /* create a process to execute the user's main program */ resume(create((int *)main,INITSTK,INITPRIO,INITNAME,INITARGS)); while (TRUE) /* empty */; dskend(&devtab[DISK0]); dskend(&devtab[DISK1]); }
/*------------------------------------------------------------------------ * nulluser -- initialize system and become the null process (id==0) *------------------------------------------------------------------------ */ nulluser() /* babysit CPU when no one home */ { int userpid; initevec(); sysinit(); /* associate CONSOLE with a tty */ open(CONSOLE, KBMON, 0); /* open(CONSOLE, SERIAL0); */ sprintf(vers, "Xinu Version %s", VERSION); kprintf("\n\n%s\n", vers); if (reboot++ < 1) kprintf("\n"); else kprintf(" (reboot %d)\n", reboot); kprintf("%d bytes real mem\n", (unsigned long) maxaddr+1); #ifdef DETAIL kprintf(" %d", (unsigned long) 0); kprintf(" to %d\n", (unsigned long) (maxaddr) ); #endif kprintf("%d bytes Xinu code\n", (unsigned long) ((unsigned long) &end - (unsigned long) start)); #ifdef DETAIL kprintf(" %d", (unsigned long) start); kprintf(" to %d\n", (unsigned long) &end ); #endif #ifdef DETAIL kprintf("%d bytes user stack/heap space\n", (unsigned long) ((unsigned long) maxaddr - (unsigned long) &end)); kprintf(" %d", (unsigned long) &end); kprintf(" to %d\n", (unsigned long) maxaddr); #endif kprintf("clock %sabled\n", clkruns == 1?"en":"dis"); enable(); /* enable interrupts */ /* create a process to execute the user's main program */ userpid = create(main,INITSTK,INITPRIO,INITNAME,INITARGS); /* start the network */ resume(create(netstart,NETSTK,NETPRI,NETNAM,NETARGC,userpid)); while (TRUE) /* empty */; }
/*------------------------------------------------------------------------ * * sysinit - Initialize all Xinu data structures and devices * *------------------------------------------------------------------------ */ static void sysinit() { int32 i; struct procent *prptr; /* Ptr to process table entry */ struct sentry *semptr; /* Ptr to semaphore table entry */ /* Platform Specific Initialization */ platinit(); /* kprintf("\033[39;49m\n\r%s\n\n\r", VERSION);*/ /* Initialize the interrupt vectors */ initevec(); /* Initialize free memory list */ meminit(); /* Initialize system variables */ /* Count the Null process as the first process in the system */ prcount = 1; /* Scheduling is not currently blocked */ Defer.ndefers = 0; /* Initialize process table entries free */ for (i = 0; i < NPROC; i++) { prptr = &proctab[i]; prptr->prstate = PR_FREE; prptr->prname[0] = NULLCH; prptr->prstkbase = NULL; prptr->prprio = 0; } /* Initialize the Null process entry */ prptr = &proctab[NULLPROC]; prptr->prstate = PR_CURR; prptr->prprio = 0; strncpy(prptr->prname, "prnull", 7); prptr->prstkbase = getstk(NULLSTK); prptr->prstklen = NULLSTK; prptr->prstkptr = 0; currpid = NULLPROC; /* Initialize semaphores */ for (i = 0; i < NSEM; i++) { semptr = &semtab[i]; semptr->sstate = S_FREE; semptr->scount = 0; semptr->squeue = newqueue(); } /* Initialize buffer pools */ bufinit(); /* Create a ready list for processes */ readylist = newqueue(); /* Initialize the real time clock */ clkinit(); for (i = 0; i < NDEVS; i++) { init(i); } return; }
/*------------------------------------------------------------------------ * nulluser -- initialize system and become the null process (id==0) *------------------------------------------------------------------------ */ nulluser() /* babysit CPU when no one is home */ { int userpid; //OS proj 3 modify int i; unsigned long nullproc_PDBR, main_PDBR; //int free_fr1,free_fr2,free_fr3,free_fr4; console_dev = SERIAL0; /* set console to COM0 */ initevec(); kprintf("system running up!\n"); sysinit(); enable(); /* enable interrupts */ sprintf(vers, "PC Xinu %s", VERSION); kprintf("\n\n%s\n", vers); if (reboot++ < 1) kprintf("\n"); else kprintf(" (reboot %d)\n", reboot); kprintf("%d bytes real mem\n", (unsigned long) maxaddr+1); #ifdef DETAIL kprintf(" %d", (unsigned long) 0); kprintf(" to %d\n", (unsigned long) (maxaddr) ); #endif kprintf("%d bytes Xinu code\n", (unsigned long) ((unsigned long) &end - (unsigned long) start)); #ifdef DETAIL kprintf(" %d", (unsigned long) start); kprintf(" to %d\n", (unsigned long) &end ); #endif #ifdef DETAIL kprintf("%d bytes user stack/heap space\n", (unsigned long) ((unsigned long) maxaddr - (unsigned long) &end)); kprintf(" %d", (unsigned long) &end); kprintf(" to %d\n", (unsigned long) maxaddr); #endif //OS proj 3 modify /*Create new page table for null process: - create page directory (outer page table) - initialize 1:1 mapping for the first 4096 pages - allocate 4 page tables (4x1024 pages) - assign each page table entry to the address starting from page number 0 to 1023 - this page tables should be shared between processes*/ nullproc_PDBR = init_pagedir(currpid); //func in frame.c write_cr3(nullproc_PDBR); proctab[currpid].pdbr = nullproc_PDBR; //create global frames to map 4096 /*All memory below page 4096 will be "global". That is, it is usable and visible by all processes and accessible by simply using its actual physical addresses. As a result, the first four page tables for every process will be the same, and thus should be shared.*/ for(i = 0; i < 4; ++i) { global_pagetable_fr[i] = get_frm(); global_pagetable_addr[i] = 0x00400000 + (unsigned long) global_pagetable_fr[i] * NBPG; map_frame_to_proc_virtpage(global_pagetable_fr[i], currpid, global_pagetable_addr[i] >> 12, FR_TBL); /* frm_tab[global_pagetable_fr[i]].fr_status = FRM_MAPPED; frm_tab[global_pagetable_fr[i]].fr_type = FR_TBL; frm_tab[global_pagetable_fr[i]].fr_dirty = 1; frm_tab[global_pagetable_fr[i]].fr_loadtime = ctr1000; */ } share_global_tables(nullproc_PDBR); //implement get_frm() enable_paging(); kprintf("clock %sabled\n", clkruns == 1?"en":"dis"); /* create a process to execute the user's main program */ userpid = create(main,INITSTK,INITPRIO,INITNAME,INITARGS); //OS proj 3 modify main_PDBR = init_pagedir(userpid); proctab[userpid].pdbr = main_PDBR; share_global_tables(main_PDBR); resume(userpid); while (TRUE) /* empty */; }
static void sysinit(void) { int32 i; struct procent *prptr; /* ptr to process table entry */ struct dentry *devptr; /* ptr to device table entry */ struct sentry *semptr; /* prr to semaphore table entry */ struct memblk *memptr; /* ptr to memory block */ /* Initialize the interrupt vectors */ initevec(); /* Initialize system variables */ /* Count the Null process as the first process in the system */ prcount = 1; /* Scheduling is not currently blocked */ Defer.ndefers = 0; /* Initialize the free memory list */ /* Note: PC version has to pre-allocate 640K-1024K "hole" */ maxheap = (void *)MAXADDR; minheap = &end; memptr = memlist.mnext = (struct memblk *)roundmb(minheap); if ((char *)(maxheap+1) > HOLESTART) { /* create two blocks that straddle the hole */ memptr->mnext = (struct memblk *)HOLEEND; memptr->mlength = (int) truncmb((unsigned) HOLESTART - (unsigned)&end - 4); memptr = (struct memblk *) HOLEEND; memptr->mnext = (struct memblk *) NULL; memptr->mlength = (int) truncmb( (uint32)maxheap - (uint32)HOLEEND - NULLSTK); } else { /* initialize free memory list to one block */ memlist.mnext = memptr = (struct memblk *) roundmb(&end); memptr->mnext = (struct memblk *) NULL; memptr->mlength = (uint32) truncmb((uint32)maxheap - (uint32)&end - NULLSTK); } /* Initialize process table entries free */ for (i = 0; i < NPROC; i++) { prptr = &proctab[i]; prptr->prstate = PR_FREE; prptr->prname[0] = NULLCH; prptr->prstkbase = NULL; prptr->prprio = 0; } /* Initialize the Null process entry */ prptr = &proctab[NULLPROC]; prptr->prstate = PR_CURR; prptr->prprio = 0; strncpy(prptr->prname, "prnull", 7); prptr->prstkbase = getstk(NULLSTK); prptr->prstklen = NULLSTK; prptr->prstkptr = 0; currpid = NULLPROC; /* Initialize semaphores */ for (i = 0; i < NSEM; i++) { semptr = &semtab[i]; semptr->sstate = S_FREE; semptr->scount = 0; semptr->squeue = newqueue(); } /* Initialize buffer pools */ bufinit(); /* Create a ready list for processes */ readylist = newqueue(); /* Initialize the PCI bus */ pci_init(); /* Initialize the real time clock */ clkinit(); for (i = 0; i < NDEVS; i++) { if (! isbaddev(i)) { devptr = (struct dentry *) &devtab[i]; (devptr->dvinit) (devptr); } } return; }
/*------------------------------------------------------------------------ * * sysinit - Initialize all Xinu data structures and devices * *------------------------------------------------------------------------ */ static void sysinit() { int32 i; struct procent *prptr; /* Ptr to process table entry */ struct sentry *semptr; /* Ptr to semaphore table entry */ /* Platform Specific Initialization */ platinit(); /* Initialize the interrupt vectors */ initevec(); /* Initialize free memory list */ meminit(); /* Initialize system variables */ /* Count the Null process as the first process in the system */ prcount = 1; /* Scheduling is not currently blocked */ Defer.ndefers = 0; /* Initialize process table entries free */ for (i = 0; i < NPROC; i++) { prptr = &proctab[i]; prptr->prstate = PR_FREE; prptr->prname[0] = NULLCH; prptr->prstkbase = NULL; prptr->prprio = 0; prptr->prcpu_wait_ratio = 0; // Initializing waits at creation for each process to 0 } /* Initialize the Null process entry */ prptr = &proctab[NULLPROC]; prptr->prstate = PR_CURR; /* Setting the null process initial priority as the highest so that all other processes can run before it*/ prptr->initprio = MAXKEY; prptr->prcpumsec = 0; prptr->prctxswintime = 0; /* Reversing the priority order in case of Dynamic Process Scheduling (Q4 and Q5.) */ if (LAB2COND) { prptr->prprio = MAXKEY;// prptr->initprio + prptr->prcpumsec; //Highest int16 value. The Null process must take the lowest priority. } else { prptr->prprio = MINPRIO; } strncpy(prptr->prname, "prnull", 7); prptr->prstkbase = getstk(NULLSTK); prptr->prstklen = NULLSTK; prptr->prstkptr = 0; currpid = NULLPROC; /* Initialize semaphores */ for (i = 0; i < NSEM; i++) { semptr = &semtab[i]; semptr->sstate = S_FREE; semptr->scount = 0; semptr->squeue = newqueue(); } /* Initialize buffer pools */ bufinit(); /* Create a ready list for processes */ readylist = newqueue(); initialize_mltfbq(); init_recieverq(); /* Initialize the real time clock */ clkinit(); for (i = 0; i < NDEVS; i++) { init(i); } return; }
/*------------------------------------------------------------------------ * nulluser -- initialize system and become the null process (id==0) *------------------------------------------------------------------------ */ nulluser() /* babysit CPU when no one is home */ { int userpid; unsigned long temp; console_dev = SERIAL0; /* set console to COM0 */ initevec(); kprintf("system running up!\n"); sysinit(); enable(); /* enable interrupts */ sprintf(vers, "PC Xinu %s", VERSION); kprintf("\n\n%s\n", vers); if (reboot++ < 1) kprintf("\n"); else kprintf(" (reboot %d)\n", reboot); kprintf("%d bytes real mem\n", (unsigned long) maxaddr+1); #ifdef DETAIL kprintf(" %d", (unsigned long) 0); kprintf(" to %d\n", (unsigned long) (maxaddr) ); #endif kprintf("%d bytes Xinu code\n", (unsigned long) ((unsigned long) &end - (unsigned long) start)); #ifdef DETAIL kprintf(" %d", (unsigned long) start); kprintf(" to %d\n", (unsigned long) &end ); #endif #ifdef DETAIL kprintf("%d bytes user stack/heap space\n", (unsigned long) ((unsigned long) maxaddr - (unsigned long) &end)); kprintf(" %d", (unsigned long) &end); kprintf(" to %d\n", (unsigned long) maxaddr); #endif kprintf("clock %sabled\n", clkruns == 1?"en":"dis"); /* initialize_pagedirectory(); initialize_pagetable(); get_frame(1,FR_DIR,0); get_frame(1,FR_TBL,0); get_frame(1,FR_TBL,0); get_frame(1,FR_TBL,0); get_frame(1,FR_TBL,0); */ init_frm(); init_bsm(); temp = create_ps() ; write_cr3(0x400000); set_evec(14,pfintr); proctab[currpid].pdbr = temp; // pageq.next= &pageq; //Always points to head myheadq = NULL; //actual pointer used by page replacement policyi currq = NULL; pcurrq = NULL; /* create a process to execute the user's main program */ userpid = create(main,INITSTK,INITPRIO,INITNAME,INITARGS); enable_paging(); resume(userpid); while (TRUE) /* empty */; }