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

📄 mem.c

📁 著名的AT&T UNIX v6 源码
💻 C
字号:
/* *	Memory special file *	minor device 0 is physical memory *	minor device 1 is kernel memory  *	minor device 2 is EOF/RATHOLE */#include "../h/param.h"#include "../h/dir.h"#include "../h/user.h"#include "../h/conf.h"#include "../h/buf.h"#include "../h/systm.h"#include "../h/page.h"#include "../h/mtpr.h"mmread(dev){	register char *p;	register c;	extern int mmap[];	extern char vmmap[];	if(minor(dev) == 2)		return;	if( minor(dev) == 1 ) {		if( kernacc(u.u_offset, u.u_count, B_READ)	    && !copyout(u.u_offset, u.u_base, u.u_count) ) {		c = u.u_count;		u.u_count = 0;		u.u_base += c;		u.u_offset += c;	} else 		u.u_error = EFAULT;	return;	}	if( minor(dev) == 0) {		while (u.u_count > 0 && u.u_error == 0) {			c = (int) u.u_offset >> 9;			if( c < 0 || c >= MAXMEM ) {				u.u_error = EFAULT;				break;			}			*mmap = c | (PG_V | PG_KR);			mtpr(TBIS, vmmap);			copyout(vmmap+((int)u.u_offset & 0x1ff), u.u_base, c=min(512-((int)u.u_offset & 0x1ff), u.u_count));			u.u_count -= c;			u.u_base += c;			u.u_offset += c;		}	return;	} 	if (minor(dev) == 3) { /* UNIBUS access */		if ((!kernacc(u.u_offset,u.u_count,B_READ)) ||		(!useracc(u.u_base,u.u_count,B_READ)) ||		UNIcpy(u.u_offset,u.u_base,u.u_count,B_READ))		  u.u_error = EFAULT;		else {			u.u_offset += u.u_count;			u.u_base += u.u_count;			u.u_count = 0;		}		return;	}}mmwrite(dev){	register char *p;	register c;	if(minor(dev) == 2) {		c = u.u_count;		u.u_count = 0;		u.u_offset += c;		return;	}	/*  kernel virt mem */	if (minor(dev) == 1) {		if ((!kernacc(u.u_offset,u.u_count,B_WRITE)) || copyin(u.u_base,u.u_offset,u.u_count))			u.u_error = EFAULT;		else {			u.u_offset += u.u_count;			u.u_base += u.u_count;			u.u_count = 0 ;		}		return;	} 	if (minor(dev) == 3) { /* UNIBUS access */		if ((!kernacc(u.u_offset,u.u_count,B_WRITE)) ||		(!useracc(u.u_base,u.u_count,B_WRITE)) ||		UNIcpy(u.u_offset,u.u_base,u.u_count,B_WRITE))			u.u_error = EFAULT;		else {			u.u_offset += u.u_count;			u.u_base += u.u_count;			u.u_count = 0;		}		return;	}}/* *  UNIBUS Address Space <-->  User Space transfer */UNIcpy(uniadd,usradd,bknt,direct)short *uniadd , *usradd;{	register short *from , *to;	register int i; 	if (direct == B_READ) {		from = uniadd;		to = usradd ;	} else {		if (direct == B_WRITE) {			from = usradd;			to = uniadd ;		}	} 	for (i = (bknt>>1) ; i>0 ; i--)		(*to++) = (*from++);	return(0);}

⌨️ 快捷键说明

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