⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hdb.c

📁 用于motorala 68K系列处理器的小实时多任务操作系统 The OMU Kernel was written to provide a cut-down Unix-like O/S for a
💻 C
字号:
/******************************************************************************* *	Hd.c	Hard disk driver ******************************************************************************* */# include	<errno.h># include	"../../include/buf.h"# include	"hd.h"# include	"scsi.h"# include	"devbuf.h"# define	HDNOTRACKS	1216	/* No of tracks on a drive */# define	HDNOSECTORS	34	/* Number of sectors per track */struct Drive_info drive_info[NHDDEVS];int	no_hdopen;		/* Total number of hard disks open */hdopen(dev)int	dev;{	int	err;	if((dev < 0) || (dev >= NHDDEVS)) return -1;	/* If first open to any drive initialise system */	if(!no_hdopen++){		si_init();		initdevbuf();	}	/* If drive is not already open initialise it */	if(!drive_info[dev].d_nopen++){		if(err = hdrestore(dev)) return -1;	}	return 0;}hdclose(dev)int	dev;{	int	err;	/* Close drives entry */	no_hdopen--;	if(!(--drive_info[dev].d_nopen)){		if(err = hdrestore(dev)) return -1;	}	return 0;}hdstrat(buf)struct	buf *buf;{	int	err;	/* Verify device and track number */	if((buf->b_dev < 0) || (buf->b_dev >= NHDDEVS)){		buf->b_flags = ABORT;		hderr("HD: No such dev", buf);		return error(ENXIO);	}	if((buf->b_bno < 0) || (buf->b_bno > (HDNOSECTORS * HDNOTRACKS))){		buf->b_flags = ABORT;		hderr("HD: block out of range", buf);		return error(ENXIO);	}	/* Check if write if so put straight to disk */	if(buf->b_flags == WRITE)		err = hdwrite(buf);	/* copy to disk */	else		err = hdread(buf);	/* go get a buffer */	/* Test if error occured if so report it and return -1 */	if(err == ERROR){		buf->b_flags = ABORT;		return error(EIO);	}	else return err;}hdioctl(dev, req, data)int	dev, req;int	*data;{	int	err;	if((dev < 0) || (dev >= NHDDEVS)) return -1;	switch(req){	case HDFORMAT:		if(err = si_cmd(SIFORMAT, dev, 0, 1, 0)) return -1;		break;	case HDCERTIFY:		if(err = si_cmd(SICERTIFY, dev, 1, 0, 0)) return -1;		break;	}	return 0;}/* *	Hdrestore()	Restores drive */hdrestore(dev)int	dev;{	return si_cmd(SIREZERO, dev, 0, 0, 0);}/* *	Hdread()	Read from disk */hdread(buf)struct	buf *buf;{	int	err;	struct	Dbuf *dbuf;	err = 0;	if(fromdevbuf(buf) == -1){		dbuf = getdevbuf();		err = si_cmd(SIREAD, buf->b_dev, buf->b_bno, 2, dbuf->data);		dbuf->flags = READABLE;		dbuf->mindev = buf->b_dev;		dbuf->bstart = buf->b_bno;		dbuf->bend = buf->b_bno + 2;		if(fromdevbuf(buf) == -1) err = -1;	}	return err;}/* *	Hdwrite()	Write to disk */hdwrite(buf)struct	buf *buf;{	struct Dbuf *dbuf;	/* If in buffer system remove */	if(dbuf = checkdevbuf(buf)){		dbuf->flags = AVAILABLE;		if(dbuf->prev) dbuf->prev->next = dbuf->next;		if(dbuf->next) dbuf->next->prev = dbuf;	}	return si_cmd(SIWRITE, buf->b_dev, buf->b_bno, 1, buf->b_buf);}/* *	Hderr()		Hard disk error */hderr(str, buf)char	*str;struct buf *buf;{	printf("%s device %d block %d\n\r",str, buf->b_dev, buf->b_bno);	return error(EIO);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -