103 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
| Copyright (C) 2015-2019 The University of Notre Dame
 | |
| This software is distributed under the GNU General Public License.
 | |
| See the file LICENSE for details.
 | |
| */
 | |
| #include "kernel/config.h"
 | |
| #include "console.h"
 | |
| #include "page.h"
 | |
| #include "process.h"
 | |
| #include "keyboard.h"
 | |
| #include "mouse.h"
 | |
| #include "interrupt.h"
 | |
| #include "clock.h"
 | |
| #include "ata.h"
 | |
| #include "device.h"
 | |
| #include "cdromfs.h"
 | |
| #include "string.h"
 | |
| #include "graphics.h"
 | |
| #include "kernel/ascii.h"
 | |
| #include "kernel/syscall.h"
 | |
| #include "rtc.h"
 | |
| #include "kernelcore.h"
 | |
| #include "kmalloc.h"
 | |
| #include "memorylayout.h"
 | |
| #include "kshell.h"
 | |
| #include "cdromfs.h"
 | |
| #include "diskfs.h"
 | |
| #include "serial.h"
 | |
| 
 | |
| /*
 | |
| This is the C initialization point of the kernel.
 | |
| By the time we reach this point, we are in protected mode,
 | |
| with interrupts disabled, a valid C stack, but no malloc heap.
 | |
| Now we initialize each subsystem in the proper order:
 | |
| */
 | |
| 
 | |
| int kernel_main()
 | |
| {
 | |
| 	struct console *console = console_create_root();
 | |
| 	console_addref(console);
 | |
|   printf("Basekernel Version %d.%d %s\n",KERNEL_MAJOR,KERNEL_MINOR,__DATE__);
 | |
| 	printf("video: %d x %d (addr %x)\n", video_xres, video_yres, video_buffer);
 | |
| 	printf("kernel: %d bytes\n", kernel_size);
 | |
| 
 | |
| 	page_init();
 | |
| 	kmalloc_init((char *) KMALLOC_START, KMALLOC_LENGTH);
 | |
| 	interrupt_init();
 | |
| 	mouse_init();
 | |
| 	keyboard_init();	
 | |
| 	serial_init(); 
 | |
| 	rtc_init();
 | |
| 	clock_init();
 | |
| 	process_init();
 | |
| 	ata_init();
 | |
| 	cdrom_init();
 | |
| 	diskfs_init();
 | |
| 
 | |
| 	current->ktable[KNO_STDIN]   = kobject_create_console(console);
 | |
| 	current->ktable[KNO_STDOUT]  = kobject_copy(current->ktable[0]);
 | |
| 	current->ktable[KNO_STDERR]  = kobject_copy(current->ktable[1]);
 | |
| 	current->ktable[KNO_STDWIN]  = kobject_create_window(&window_root);
 | |
| 	current->ktable[KNO_STDDIR]  = 0; // No current dir until something is mounted.
 | |
| 
 | |
| 	
 | |
| 	printf("kernel initialization is done.\n");
 | |
| #define KSHELL_SERIAL
 | |
| #ifndef KSHELL_SERIAL
 | |
| 	kshell_launch();
 | |
|   // never reached!
 | |
| #else
 | |
|   // main IO loop, from kshell_launch
 | |
|   char line[100];
 | |
|   int  lineIndex=0;
 | |
|   
 | |
| 	while(1) {
 | |
| 		// console_putchar(console,console_getchar(console));
 | |
| 	  char c;
 | |
| 		while ((c = serial_read_nonblock(0))<0) clock_wait(10);
 | |
| 		console_putchar(console,c);
 | |
| 		if (c=='\n') { // End of line
 | |
| 	    const char *argv[100];
 | |
| 	    int argc;
 | |
| 		  argc = 0;
 | |
| 		  line[lineIndex]=0;
 | |
| 		  argv[argc] = strtok(line, " ");
 | |
| 		  
 | |
| 		  // split line in tokens separated by spaces
 | |
| 		  while(argv[argc]) {
 | |
| 			  argc++;
 | |
| 			  argv[argc] = strtok(0, " ");
 | |
| 		  }
 | |
| 
 | |
| 		  if(argc > 0) {
 | |
| 			  kshell_execute(argc, argv);
 | |
| 		  }
 | |
| 		  lineIndex=0;
 | |
| 		} else line[lineIndex++]=c; // collect char
 | |
| 	}
 | |
| #endif
 | |
|   // never reached
 | |
| 	return 0;
 | |
| }
 |