示例#1
0
文件: hd.c 项目: wwssllabcd/myOS
/**
 * 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);
    }
}
示例#2
0
文件: hd.c 项目: Zach41/OS
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);
    }
}
示例#3
0
文件: hd.c 项目: jamjr/Helios-NG
/*
 * 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));
}
示例#4
0
文件: hd.c 项目: 565407548/micro_os
/*
功能:
    处理硬盘相关请求的任务进程。初始化后,永久运行接收有关硬盘请求的信息
参数:
    (无)
返回值:
    (无)
*/
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);
    }
}
示例#5
0
文件: fs.c 项目: qinpan1003/linux_drv
//--------------------------------------------------------------------------------------------------*/
// 文件系统初始化
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;
}