/** * 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); } }
/* * This returns the size of the passed device in number of 512 blocks (?) */ int hd_size(dev_t dev) { u_int major = major(dev); u_int unit = dkunit(dev); u_int part = dkpart(dev); struct disk *du; int val; if (unit >= MAXDISKS) return(-1); du = &hd[major].disk[unit]; if (du->dk_state == CLOSED) { val = hd_open(dev,0,0); if (val < 0) return(-1); } return((int)((u_long)du->dk_lab.d_partitions[part].p_size * du->dk_lab.d_secsize / 512)); }
/* 功能: 处理硬盘相关请求的任务进程。初始化后,永久运行接收有关硬盘请求的信息 参数: (无) 返回值: (无) */ 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); } }
//--------------------------------------------------------------------------------------------------*/ // 文件系统初始化 void init_fs(void) { File_Desc* p_fd; Inode* p_inode; no_answer = 0; for(p_fd = file_table;p_fd < file_table + MAX_ALL_FILE;p_fd++) p_fd->fd_inode = 0; for(p_inode = inode_table;p_inode < inode_table + MAX_ALL_INODE;p_inode++) p_inode->i_cnt = 0; hd_open(ROOT_DEV); hd_read(ROOT_DEV,fsbuf,512,1); DEV_Super_Block* p_sb = (DEV_Super_Block*)fsbuf; if(p_sb->magic != MAGIC) fs_make(); // 只在建立文件系统的时候调用,调用之后会覆盖之前的文件系统 hd_read(ROOT_DEV,fsbuf,SECTOR_SIZE * INODE_1ST_SECTS,1); // 获取目录inode DEV_Inode* p_devinode = (DEV_Inode*)fsbuf; inode_table[0] = *(Inode*)(p_devinode + 1); // inode_table第0个元素用于存放目录inode inode_table[0].i_dev = ROOT_DEV; inode_table[0].i_cnt = 1; inode_table[0].i_num = 1; p_inode_de = inode_table; }