PUBLIC void task_hd() { MESSAGE msg; init_hd(); while (true) { send_recv(RECEIVE, ANY, &msg); int src = msg.source; switch (msg.type) { case DEV_OPEN: hd_identify(0); //hd_open(msg.DEVICE); break; case DEV_CLOSE: hd_close(msg.DEVICE); break; case DEV_READ: case DEV_WRITE: hd_rdwt(&msg); break; case DEV_IOCTL: hd_ioctl(&msg); break; default: kprintf("[KERNEL ERROR]HD driveer::unknown msg"); break; } send_recv(SEND, src, &msg); } }
/** * Main loop of HD driver. * *****************************************************************************/ PUBLIC void task_hd() { MESSAGE msg; init_hd(); while (1) { send_recv(RECEIVE, ANY, &msg); int src = msg.source; switch (msg.type) { case DEV_OPEN: hd_open(msg.DEVICE); break; case DEV_CLOSE: hd_close(msg.DEVICE); break; case DEV_READ: case DEV_WRITE: hd_rdwt(&msg); break; case DEV_IOCTL: hd_ioctl(&msg); break; default: dump_msg("HD driver::unknown msg", &msg); spin("FS::main_loop (invalid msg.type)"); break; } send_recv(SEND, src, &msg); } }
PUBLIC void task_hd() { MESSAGE msg; init_hd(); printl("Task HD begins.\n"); while (TRUE) { send_recv(RECEIVE, ANY, &msg); int src = msg.source; switch(msg.type) { case DEV_OPEN: /* 获得硬盘的信息 */ /* hd_identify(0); */ hd_open(msg.DEVICE); break; case DEV_CLOSE: hd_close(msg.DEVICE); break; case DEV_READ: case DEV_WRITE: hd_rdwt(&msg); break; case DEV_IOCTL: hd_ioctl(&msg); break; default: panic("HD driver::unknown msg"); } send_recv(SEND, src, &msg); } }
/* 功能: 处理硬盘相关请求的任务进程。初始化后,永久运行接收有关硬盘请求的信息 参数: (无) 返回值: (无) */ void task_hd(){ MESSAGE message; #ifdef DEBUG_HD printl("in task_hd\n"); #endif //初始化硬盘 init_hd(); while(1){ reset_message(&message); send_receive(RECEIVE,ANY,&message); int src=message.source_pid; switch(message.type){ case INFO_FS_OPEN: hd_open(&message); break; case INFO_FS_CLOSE: hd_close(&message); break; case INFO_FS_READ: case INFO_FS_WRITE: hd_rdwt(&message); break; case INFO_FS_IOCTL: hd_ioctl(&message); break; case INFO_FS_DEVICE: hd_device_info(&message); break; default: //panic("unkonw message type(%d) in task_hd",src); break; } #ifdef DEBUG_HD printl("in task_hd\n"); #endif /* message.source_pid=process2pid(p_process_ready); */ send_receive(SEND,src,&message); } }
//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){} }
static void start_kernel() { init_clock(); //clock interrupt init get_memsize(&main_memory_end); main_memory_end &= 0xfffff000; paging_init(); init_mem(); //memeory management init buffer_init(); /* scheduler init */ init_sched(); init_hd(); //hard disk init init_fs(); //filesystem init init_task(); /*init_sock();*/ }