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

📄 rk.c

📁 UNIX v6源代码 这几乎是最经典的unix版本 unix操作系统设计和莱昂氏unix源代码分析都是用的该版
💻 C
字号:
#/* *//* * RK disk driver */#include "../param.h"#include "../buf.h"#include "../conf.h"#include "../user.h"#define	RKADDR	0177400#define	NRK	4#define	NRKBLK	4872#define	RESET	0#define	GO	01#define	DRESET	014#define	IENABLE	0100#define	DRY	0200#define	ARDY	0100#define	WLO	020000#define	CTLRDY	0200struct {	int rkds;	int rker;	int rkcs;	int rkwc;	int rkba;	int rkda;};struct	devtab	rktab;struct	buf	rrkbuf;rkstrategy(abp)struct buf *abp;{	register struct buf *bp;	register *qc, *ql;	int d;	bp = abp;	if(bp->b_flags&B_PHYS)		mapalloc(bp);	d = bp->b_dev.d_minor-7;	if(d <= 0)		d = 1;	if (bp->b_blkno >= NRKBLK*d) {		bp->b_flags =| B_ERROR;		iodone(bp);		return;	}	bp->av_forw = 0;	spl5();	if (rktab.d_actf==0)		rktab.d_actf = bp;	else		rktab.d_actl->av_forw = bp;	rktab.d_actl = bp;	if (rktab.d_active==0)		rkstart();	spl0();}rkaddr(bp)struct buf *bp;{	register struct buf *p;	register int b;	int d, m;	p = bp;	b = p->b_blkno;	m = p->b_dev.d_minor - 7;	if(m <= 0)		d = p->b_dev.d_minor;	else {		d = lrem(b, m);		b = ldiv(b, m);	}	return(d<<13 | (b/12)<<4 | b%12);}rkstart(){	register struct buf *bp;	if ((bp = rktab.d_actf) == 0)		return;	rktab.d_active++;	devstart(bp, &RKADDR->rkda, rkaddr(bp), 0);}rkintr(){	register struct buf *bp;	if (rktab.d_active == 0)		return;	bp = rktab.d_actf;	rktab.d_active = 0;	if (RKADDR->rkcs < 0) {		/* error bit */		deverror(bp, RKADDR->rker, RKADDR->rkds);		RKADDR->rkcs = RESET|GO;		while((RKADDR->rkcs&CTLRDY) == 0) ;		if (++rktab.d_errcnt <= 10) {			rkstart();			return;		}		bp->b_flags =| B_ERROR;	}	rktab.d_errcnt = 0;	rktab.d_actf = bp->av_forw;	iodone(bp);	rkstart();}rkread(dev){	physio(rkstrategy, &rrkbuf, dev, B_READ);}rkwrite(dev){	physio(rkstrategy, &rrkbuf, dev, B_WRITE);}

⌨️ 快捷键说明

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