void main(void) /* This really IS void, no error here. */ { /* The startup routine assumes (well, ...) this */ /* * Interrupts are still disabled. Do necessary setups, then * enable them */ time_init(); tty_init(); trap_init(); sched_init(); buffer_init(); hd_init(); sti(); move_to_user_mode(); if (!fork()) { /* we count on this going ok */ init(); } /* * NOTE!! For any other task 'pause()' would mean we have to get a * signal to awaken, but task0 is the sole exception (see 'schedule()') * as task 0 gets activated at every idle moment (when no other tasks * can run). For task0 'pause()' just means we go check if some other * task can run, and if not we return here. */ for(;;) pause(); }
int main(void) { /* Interrupts are still disabled. Do necessary setups, then enable them. */ time_init(); tty_init(); trap_init(); sched_init(); buffer_init(); hd_init(); sti(); move_to_user_mode(); if (!fork()) { /* we count on this going ok */ init(); } /* * NOTE!! * For any other task 'pause()' would mean we have to get a signal to awaken, * but task 0 gets activated at every idle moment (when no other tasks can run). * For task0 'pause()' just means we go check if some other task can run, and * if not we return here. */ // for(;;) pause(); return 0; }
int main(void) { /* NOTE! 这些初始化函数的位置别随便改动! */ trap_init(); /* 在设置其他中断之前 */ console_init(); /* 需打印的在这之后 */ keyboard_init(); hd_init(); /* 需读磁盘的放其后 */ /* graph_init(); */ mem_init(); sched_init(); buff_init(); /* 在内存初始化之后 */ inode_init(); file_table_init(); debug_init(); sti(); super_init(0); /* 开中断之后 */ files_init(); /* unsigned short color = rgb_to_565color(255,255,255); draw_rect(0, 0, 800, 600, color, 1); */ move_to_user_mode(); /* * 进程0马上execve(),替换掉用户态空间,这样进程0就 * 可以写时复制了。注意此时原来的用户态堆栈也被丢弃 * 了,换成了新堆栈。更多参见内存管理。 */ if(!execve("/init")) printf("main: execve init-process failed.\n");
/* the kernel main func */ int pretty_main() { start_kernel(); move_to_user_mode(); /* from kernel mode to user mode and scheduler process */ return 0; }
void main(void) /* This really IS void, no error here. */ { /* The startup routine assumes (well, ...) this */ /* * Interrupts are still disabled. Do necessary setups, then * enable them */ ROOT_DEV = ORIG_ROOT_DEV; drive_info = DRIVE_INFO; memory_end = (1<<20) + (EXT_MEM_K<<10); memory_end &= 0xfffff000; if (memory_end > 16*1024*1024) memory_end = 16*1024*1024; if (memory_end > 12*1024*1024) buffer_memory_end = 4*1024*1024; else if (memory_end > 6*1024*1024) buffer_memory_end = 2*1024*1024; else buffer_memory_end = 1*1024*1024; main_memory_start = buffer_memory_end; #ifdef RAMDISK main_memory_start += rd_init(main_memory_start, RAMDISK*1024); #endif mem_init(main_memory_start,memory_end); trap_init(); blk_dev_init(); chr_dev_init(); tty_init(); time_init(); sched_init(); buffer_init(buffer_memory_end); hd_init(); floppy_init(); sti(); move_to_user_mode(); setup((void *) &drive_info); (void) open("/dev/tty0",O_RDWR,0); (void) dup(0); (void) dup(0); (void) open("/var/process.log",O_CREAT|O_TRUNC|O_WRONLY,0666); #ifdef dis_func (void) open("/var/dis_func.log",O_CREAT|O_TRUNC|O_WRONLY,0666); #endif if (!fork()) { /* we count on this going ok */ init(); } /* * NOTE!! For any other task 'pause()' would mean we have to get a * signal to awaken, but task0 is the sole exception (see 'schedule()') * as task 0 gets activated at every idle moment (when no other tasks * can run). For task0 'pause()' just means we go check if some other * task can run, and if not we return here. */ for(;;) pause(); }
int main(void) { trap_init(); sched_init(); sti(); move_to_user_mode(); myprint("In kernel"); while(1){} return 0; }
/* * This is the kernel main routine. When the boot process is completed, this * function is called. */ void start_kernel(void) { int pid, i; char *names[N_CONSOLES] = { "PRG1", "PRG2", "PRG3", "PRG4", "PRG5", "PRG6" }; // init traps init_traps(); // initialize IRQs init_irq(); // initialize the tty driver. The tty is composed by a keyboard driver // that read input keys a print the relative ASCII code on video. tty_init(); // initialize the timer. time_init(); // initialize the scheduler sched_init(); printk("Kernel info: %u bytes, start at 0x%x0 end at 0x%x0.\n", &__KERNEL_END__-K_START, K_START, &__KERNEL_END__); sti(); // calibrate delay calibrate_delay(); // floppy driver initialization floppy_init(); // switch in user mode move_to_user_mode(); // for a process for each console and execute the program PRGi for (i=0; i<N_CONSOLES; ++i) { // spawn process i and run PRG1 pid = fork(); if (pid == 0) { exec(names[i]); } else if (pid < 0) { print("idle: cannot duplicate myself.\n"); } } print("Idle: ok!\n"); // idle loop while(1); }
void main(void) /* This really IS void, no error here. */ { /* The startup routine assumes (well, ...) this */ /* * Interrupts are still disabled. Do necessary setups, then * enable them */ ROOT_DEV = ORIG_ROOT_DEV; drive_info = DRIVE_INFO; memory_end = (1<<20) + (EXT_MEM_K<<10); memory_end &= 0xfffff000; if (memory_end > 16*1024*1024) memory_end = 16*1024*1024; if (memory_end > 12*1024*1024) buffer_memory_end = 4*1024*1024; else if (memory_end > 6*1024*1024) buffer_memory_end = 2*1024*1024; else buffer_memory_end = 1*1024*1024; main_memory_start = buffer_memory_end; #ifdef RAMDISK main_memory_start += rd_init(main_memory_start, RAMDISK*1024); #endif mem_init(main_memory_start,memory_end); trap_init(); /* set the IDT in 0x00080000~0x000807ff(4KB)*/ blk_dev_init(); chr_dev_init(); /* this function do nothing */ tty_init(); /* rs_init() and con_init() */ time_init(); sched_init(); buffer_init(buffer_memory_end); hd_init(); floppy_init(); sti(); move_to_user_mode(); if (!fork()) { /* we count on this going ok */ init(); } /* * NOTE!! For any other task 'pause()' would mean we have to get a * signal to awaken, but task0 is the sole exception (see 'schedule()') * as task 0 gets activated at every idle moment (when no other tasks * can run). For task0 'pause()' just means we go check if some other * task can run, and if not we return here. */ for(;;) pause(); }
//init process pid = 0; static void start_kernel() { // init_trap();// define in kernel/start.c init_clock(); //clock interrupt init main_memory_end = (1<<20) + (EXT_MEM_K << 10); main_memory_end &= 0xfffff000; if(main_memory_end > 12 * 1024 * 1024) //内存大于6M时 { buffer_memory_start = 3 * 1024 * 1024; buffer_memory_end = 4 * 1024 * 1024; } else { buffer_memory_start = 3 * 1024 * 1024 - 512 * 1024; buffer_memory_end = 3 * 1024 * 1024; } main_memory_start = buffer_memory_end; //主内存的起始地址 = 缓冲区末端 main_memory_start &= 0xfffff000; printk("start memroy = %d\t end memory = %d\n",main_memory_start,main_memory_end); // buffer_memory_end = (buffer_memory_end + BUFFER_SIZE) & (~BUFFER_SIZE)- 1; //align BUFFER_SIZE init_buffer(buffer_memory_start,buffer_memory_end); //buffer init paging_init(main_memory_start,main_memory_end); init_mem(main_memory_start,main_memory_end); //memeory management init init_hd(); //hard disk init init_fs(); //filesystem init // init_sock(); move_to_user_mode(); while(1){} }