int main(int argc, char **argv) { int fd; int i; int l; DIR *dir; struct dirent *entry; char src_file[MAX_FILE_NAME_LEN]; char dst_file[MAX_FILE_NAME_LEN]; kfs_init(0, 0, 1); for (i = 1; i < argc; i++) { dir = opendir(argv[i]); if (dir == NULL) { printf("Could not find directory %s\n", argv[i]); printf("SAD :(\n"); return -1; } printf("In %s\n", argv[i]); while ((entry = readdir(dir))) { if (entry->d_name[0] == '.') continue; // skip l = snprintf(src_file, MAX_FILE_NAME_LEN, "%s/%s", argv[i], entry->d_name); assert(l < MAX_FILE_NAME_LEN); l = snprintf(dst_file, MAX_FILE_NAME_LEN, "/%s", entry->d_name); assert(l < MAX_FILE_NAME_LEN); printf("\tAdding %s to %s ...\n", src_file, dst_file); addFile(src_file, dst_file); } closedir(dir); } return 0; }
// This start is what starts the kernel. Note that virtual memory is enabled // at this point (And running, also, in the kernel's VAS). void start2(uint32_t *p_bootargs) { // Setup all of the exception handlers... (hrm, interaction with VM?) init_vector_table(); // Setup kmalloc... init_heap(); print_uart0("\nCourseOS!\n"); // Test stuff... /*int *p = (int*)0xFFFFFFF0; p[0] = 1; os_printf("0x%x == 1?\n", p[0]);*/ //run_vm_tests(); //INFO("There are %d free frames.\n", vm_count_free_frames()); //run_mem_alloc_tests(); //INFO("There are %d free frames.\n", vm_count_free_frames()); //run_prq_tests(); //run_hmap_tests(); kfs_init(0, 0, 0); /* 4-15-15: #Prakash: What happens if we let the program load here? Let's make argparse_process() do its thing Note: As of 4-15-15 this fails horribly with hello.o not being recognized as an ELF file and DATA ABORT HANDLER being syscalled */ // enable interrupt handling enable_interrupts(); // initialize the timers initialize_timers(); //assert(1==2 && "Test assert please ignore"); init_all_processes(); // FIXME: temporary os_printf("Programming the timer interrupt\n"); start_timer_interrupts(0, 5); sched_init(); argparse_process(p_bootargs); print_uart0("done parsing atag list\n"); //init_kheap(31 * 0x100000); //init_uheap(0x100000); //initialize pcb table and PID /* init_all_processes(); */ //print_process_state(0); //run_process_tests(); //print_PID(); // init_q(); //main(); SLEEP; }
/** * This is the architecture-independent kernel entry point. Before it is * called, architecture-specific code has done the bare minimum initialization * necessary. This function initializes the kernel and its various subsystems. * It calls back to architecture-specific code at several well defined points, * which all architectures must implement (e.g., setup_arch()). * * \callgraph */ void start_kernel() { unsigned int cpu; unsigned int timeout; int status; /* * Parse the kernel boot command line. * This is where boot-time configurable variables get set, * e.g., the ones with param() and DRIVER_PARAM() specifiers. */ parse_params(lwk_command_line); /* * Initialize the console subsystem. * printk()'s will be visible after this. */ console_init(); /* * Hello, Dave. */ printk("%s", lwk_banner); printk(KERN_DEBUG "%s\n", lwk_command_line); sort_exception_table(); /* * Do architecture specific initialization. * This detects memory, CPUs, architecture dependent irqs, etc. */ setup_arch(); /* * Setup the architecture independent interrupt handling. */ irq_init(); /* * Initialize the kernel memory subsystem. Up until now, the simple * boot-time memory allocator (bootmem) has been used for all dynamic * memory allocation. Here, the bootmem allocator is destroyed and all * of the free pages it was managing are added to the kernel memory * pool (kmem) or the user memory pool (umem). * * After this point, any use of the bootmem allocator will cause a * kernel panic. The normal kernel memory subsystem API should be used * instead (e.g., kmem_alloc() and kmem_free()). */ mem_subsys_init(); /* * Initialize the address space management subsystem. */ aspace_subsys_init(); sched_init_runqueue(0); /* This CPUs scheduler state + idle task */ sched_add_task(current); /* now safe to call schedule() */ /* * Initialize the task scheduling subsystem. */ core_timer_init(0); /* Start the kernel filesystems */ kfs_init(); /* * Initialize the random number generator. */ rand_init(); workq_init(); /* * Boot all of the other CPUs in the system, one at a time. */ printk(KERN_INFO "Number of CPUs detected: %d\n", num_cpus()); for_each_cpu_mask(cpu, cpu_present_map) { /* The bootstrap CPU (that's us) is already booted. */ if (cpu == 0) { cpu_set(cpu, cpu_online_map); continue; } printk(KERN_DEBUG "Booting CPU %u.\n", cpu); arch_boot_cpu(cpu); /* Wait for ACK that CPU has booted (5 seconds max). */ for (timeout = 0; timeout < 50000; timeout++) { if (cpu_isset(cpu, cpu_online_map)) break; udelay(100); } if (!cpu_isset(cpu, cpu_online_map)) panic("Failed to boot CPU %d.\n", cpu); } /* * Initialize the PCI subsystem. */ init_pci(); /* * Enable external interrupts. */ local_irq_enable(); #ifdef CONFIG_NETWORK /* * Bring up any network devices. */ netdev_init(); #endif #ifdef CONFIG_CRAY_GEMINI driver_init_list("net", "gemini"); #endif #ifdef CONFIG_BLOCK_DEVICE /** * Initialize the block devices */ blkdev_init(); #endif mcheck_init_late(); /* * And any modules that need to be started. */ driver_init_by_name( "module", "*" ); #ifdef CONFIG_KGDB /* * Stop eary (before "late" devices) in KGDB if requested */ kgdb_initial_breakpoint(); #endif /* * Bring up any late init devices. */ driver_init_by_name( "late", "*" ); /* * Bring up the Linux compatibility layer, if enabled. */ linux_init(); #ifdef CONFIG_DEBUG_HW_NOISE /* Measure noise/interference in the underlying hardware/VMM */ extern void measure_noise(int, uint64_t); measure_noise(0, 0); #endif /* * Start up user-space... */ printk(KERN_INFO "Loading initial user-level task (init_task)...\n"); if ((status = create_init_task()) != 0) panic("Failed to create init_task (status=%d).", status); current->state = TASK_EXITED; schedule(); /* This should not return */ BUG(); }