您当前的位置:首页 > IT编程 > C++
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:C++ sys_page_map函数代码示例

51自学网 2021-06-03 08:37:24
  C++
这篇教程C++ sys_page_map函数代码示例写得很实用,希望能帮到您。

本文整理汇总了C++中sys_page_map函数的典型用法代码示例。如果您正苦于以下问题:C++ sys_page_map函数的具体用法?C++ sys_page_map怎么用?C++ sys_page_map使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。

在下文中一共展示了sys_page_map函数的29个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。

示例1: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why do we need to mark ours// copy-on-write again if it was already copy-on-write at the beginning of// this function?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.//static intduppage(envid_t envid, unsigned pn){	int r;	// LAB 4: Your code here.//------------  Lab4  ----------------------------------------------------------------------------------------			if (pn * PGSIZE == UXSTACKTOP - PGSIZE) return 0;	uintptr_t addr = (uintptr_t)(pn * PGSIZE);	if ( (uvpt[pn] & PTE_W) || (uvpt[pn] & PTE_COW) ) {		r = sys_page_map(0, (void *)addr, envid, (void *)addr, PTE_P | PTE_U | PTE_COW);		if (r < 0)			panic("sys_page_map failed in duppage %e/n", r);		r = sys_page_map(0, (void *)addr, 0, (void *)addr, PTE_P | PTE_U | PTE_COW);		if (r < 0)			panic("sys_page_map failed in duppage %e/n", r);	}	else {		r = sys_page_map(0, (void *)addr, envid, (void *)addr, PTE_P | PTE_U);		if (r < 0)			panic("sys_page_map failed in duppage %e/n", r);	}	return 0;//------------  Lab4  ----------------------------------------------------------------------------------------				//panic("duppage not implemented");	return 0;}
开发者ID:CuiZhicheng,项目名称:JOS,代码行数:40,


示例2: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why do we need to mark ours// copy-on-write again if it was already copy-on-write at the beginning of// this function?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.//static intduppage(envid_t envid, unsigned pn){	int r;	uint32_t perm = PTE_P | PTE_COW;	envid_t this_envid = thisenv->env_id;	// LAB 4: Your code here.	if (uvpt[pn] & PTE_SHARE) {		if ((r = sys_page_map(this_envid, (void *) (pn*PGSIZE), envid, (void *) (pn*PGSIZE), uvpt[pn] & PTE_SYSCALL)) < 0)			panic("sys_page_map: %e/n", r);	} else if (uvpt[pn] & PTE_COW || uvpt[pn] & PTE_W) {		if (uvpt[pn] & PTE_U)			perm |= PTE_U;		// Map page COW, U and P in child		if ((r = sys_page_map(this_envid, (void *) (pn*PGSIZE), envid, (void *) (pn*PGSIZE), perm)) < 0)			panic("sys_page_map: %e/n", r);		// Map page COW, U and P in parent		if ((r = sys_page_map(this_envid, (void *) (pn*PGSIZE), this_envid, (void *) (pn*PGSIZE), perm)) < 0)			panic("sys_page_map: %e/n", r);	} else { // map pages that are present but not writable or COW with their original permissions		if ((r = sys_page_map(this_envid, (void *) (pn*PGSIZE), envid, (void *) (pn*PGSIZE), uvpt[pn] & PTE_SYSCALL)) < 0)			panic("sys_page_map: %e/n", r);	}	return 0;}
开发者ID:1060351485,项目名称:6.828-JOS,代码行数:42,


示例3: dup

// Make file descriptor 'newfdnum' a duplicate of file descriptor 'oldfdnum'.// For instance, writing onto either file descriptor will affect the// file and the file offset of the other.// Closes any previously open file descriptor at 'newfdnum'.// This is implemented using virtual memory tricks (of course!).intdup(int oldfdnum, int newfdnum){	int r;	char *ova, *nva;	pte_t pte;	struct Fd *oldfd, *newfd;	if ((r = fd_lookup(oldfdnum, &oldfd)) < 0)		return r;	close(newfdnum);	newfd = INDEX2FD(newfdnum);	ova = fd2data(oldfd);	nva = fd2data(newfd);	if ((vpd[VPD(ova)] & PTE_P) && (vpt[VPN(ova)] & PTE_P))		if ((r = sys_page_map(0, ova, 0, nva, vpt[VPN(ova)] & PTE_SYSCALL)) < 0)			goto err;	if ((r = sys_page_map(0, oldfd, 0, newfd, vpt[VPN(oldfd)] & PTE_SYSCALL)) < 0)		goto err;	return newfdnum;err:	sys_page_unmap(0, newfd);	sys_page_unmap(0, nva);	return r;}
开发者ID:HarounH,项目名称:COL331_HardwareVirtualization,代码行数:34,


示例4: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why do we need to mark ours// copy-on-write again if it was already copy-on-write at the beginning of// this function?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.//static intduppage(envid_t envid, unsigned pn){	if (pn * PGSIZE == UXSTACKTOP - PGSIZE) return 0;	int r;	// LAB 4: Your code here.	if (uvpt[pn] & PTE_SHARE) {		r = sys_page_map (0, (void*) (pn * PGSIZE), envid, (void*) (pn * PGSIZE), uvpt[pn] & PTE_SYSCALL);		if (r < 0) panic("duppage sys_page_map error : %e/n", r);	} 	else if ((uvpt[pn] & PTE_W) || (uvpt[pn] & PTE_COW)) {		r = sys_page_map(0, (void*) (pn * PGSIZE), envid, (void*) (pn * PGSIZE), PTE_U | PTE_P | PTE_COW);		if (r < 0) panic("map failed");		r = sys_page_map(0, (void*) (pn * PGSIZE), 0, (void*) (pn * PGSIZE), PTE_U | PTE_P | PTE_COW);		if (r < 0) panic("map failed");	}	else {		r = sys_page_map(0, (void*) (pn * PGSIZE), envid, (void*) (pn * PGSIZE), PTE_U | PTE_P);		if (r < 0) panic("map failed");	}//	panic("duppage not implemented");	return 0;}
开发者ID:plutoshe,项目名称:JOS_OperatingSystemlab,代码行数:36,


示例5: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why might we need to mark ours// copy-on-write again if it was already copy-on-write at the beginning of// this function?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.//static intduppage(envid_t envid, unsigned pn){    int r;    // LAB 4: Your code here.    // seanyliu    // LAB 7: add in a new if check    if (vpt[pn] & PTE_SHARE) {        if ((r = sys_page_map(sys_getenvid(), (void *)(pn * PGSIZE), envid, (void *)(pn * PGSIZE), vpt[pn] & PTE_USER)) < 0) {            return r;        }    } else if (vpt[pn] & (PTE_W | PTE_COW)) {        // If the page is writable or copy-on-write, the new mapping must be created copy-on-write        if ((r = sys_page_map(sys_getenvid(), (void *)(pn*PGSIZE), envid, (void *)(pn*PGSIZE), PTE_U | PTE_COW | PTE_P)) < 0) {            panic("duppage: sys_page_map %d", r);        }        // and then our mapping must be marked copy-on-write as well        //vpt[pn] = vpt[pn] | PTE_COW;        if ((r = sys_page_map(sys_getenvid(), (void *)(pn*PGSIZE), sys_getenvid(), (void *)(pn*PGSIZE), PTE_U | PTE_COW | PTE_P)) < 0) {            panic("duppage: sys_page_map %d", r);        }    } else {        if ((r = sys_page_map(sys_getenvid(), (void *)(pn*PGSIZE), envid, (void *)(pn*PGSIZE), PTE_U | PTE_P)) < 0) {            panic("duppage: sys_page_map %d", r);        }    }    //panic("duppage not implemented");    return 0;}
开发者ID:HVNT,项目名称:6.828,代码行数:41,


示例6: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why do we need to mark ours// copy-on-write again if it was already copy-on-write at the beginning of// this function?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.//    static intduppage(envid_t envid, unsigned pn){    int r;    unsigned va;    // LAB 4: Your code here.	pte_t pte = vpt[pn];        int perm = pte & 0xfff;        int perm_share = pte & PTE_USER;        va = pn * PGSIZE;        if (perm_share & PTE_SHARE)                return sys_page_map(0, (void *)(uint64_t)va, envid, (void *)(uint64_t)va, perm_share);        if (pte & (PTE_W|PTE_COW)) {                //child                if ((r = sys_page_map(0, (void *)(uint64_t)va, envid, (void *)(uint64_t)va, PTE_P|PTE_U|PTE_COW)) < 0)                        panic("sys_page_map failed: %e/n", r);                // parent                return sys_page_map(0, (void *)(uint64_t)va, 0, (void *)(uint64_t)va, PTE_P|PTE_U|PTE_COW);        }        return sys_page_map(0, (void *)(uint64_t)va, envid, (void *)(uint64_t)va, PTE_P|PTE_U|perm);    //panic("duppage not implemented");    //return 0;}
开发者ID:sumanthkanuparthi,项目名称:Hypervisor,代码行数:39,


示例7: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why do we need to mark ours// copy-on-write again if it was already copy-on-write at the beginning of// this function?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.//    static intduppage(envid_t envid, unsigned pn){	// LAB 4: Your code here.	int r;	pte_t pte = vpt[pn];	void * addr = (void *)((uint64_t)pn * PGSIZE);		int perm = pte & PTE_USER;		if(perm&PTE_SHARE) {		if((r = sys_page_map(0, addr, envid, addr, perm)) < 0)	//map shared pages			panic("Couldn't map shared page %e",r);		return 0;	}	else if((perm&PTE_W) || (perm&PTE_COW)) {	//if write or COW pages		 perm &= ~PTE_W;   		 perm |= PTE_COW;		if((r = sys_page_map(0, addr, envid, addr, perm)) < 0)	// map once in child			panic("Couldn't map page COW child %e",r);				if((r = sys_page_map(0, addr, 0, addr, perm)) < 0) //map once in yourself			panic("Couldn't map page COW parent %e",r);			return 0;	}	else {		//cprintf("perm: %x/n",perm);		if((r = sys_page_map(0, addr, envid, addr, PTE_P|PTE_U)) < 0)	//map readonly pages			panic("Couldn't map readonly page %e",r);		return 0;	}}
开发者ID:HeidCloud,项目名称:Hypervisor,代码行数:42,


示例8: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why do we need to mark ours// copy-on-write again if it was already copy-on-write at the beginning of// this function?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.// static intduppage(envid_t envid, unsigned pn){	int r;	// LAB 4: Your code here.	pde_t *pde;	pte_t *pte;	void *addr=(void*)(pn*PGSIZE);	pde =(pde_t*) &vpd[VPD(addr)];	if(*pde&PTE_P)	{		pte=(pte_t*)&vpt[VPN(addr)];	}	else    panic("page table for pn page is not exist");	if((*pte&PTE_W)||(*pte&PTE_COW))	{		if((r=sys_page_map(0,addr,envid,addr,PTE_COW|PTE_U))<0)			return r;		if((r=sys_page_map(0,addr,0,addr,PTE_COW|PTE_U))<0)//映射的时候注意env的id                        return r;	}	else{			if((r=sys_page_map(0,addr,envid,addr,PTE_U|PTE_P))<0)			return r;	}	//panic("duppage not implemented");	return 0;}
开发者ID:wuxy,项目名称:mitjos,代码行数:40,


示例9: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why do we need to mark ours// copy-on-write again if it was already copy-on-write at the beginning of// this function?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.//static intduppage(envid_t envid, unsigned pn){	int perm = uvpt[pn]&PTE_SYSCALL;	// If the old permissions were write and the page isn't being shared,	//  the new permissions should include COW and not include PTE_W.	if((uvpt[pn]&(PTE_W|PTE_COW)) != 0 && (uvpt[pn]&PTE_SHARE) == 0) {		perm |= PTE_COW;		perm &= ~PTE_W;	}	// Now map the page to the new environment	if(sys_page_map(0, (void *)(pn*PGSIZE), envid, (void *)(pn*PGSIZE), perm) != 0)		panic("duppage: unable to map page 0x%x to child", pn*PGSIZE);	// The old mapping must be converted to COW as well. This must be done	//  after the child mapping because of mapping the user stack.  A fault	//  happens immediately, switching that mapping to a writable page.  That	//  mapping is then copied over to the child incorrectly.	if(perm&PTE_COW) {		if(sys_page_map(0, (void *)(pn*PGSIZE), 0, (void *)(pn*PGSIZE), perm) != 0)			panic("duppage: unable to set permissions for own page");	}	return 0;}
开发者ID:AkshayRShukla,项目名称:jos-mmap,代码行数:38,


示例10: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why mark ours copy-on-write again// if it was already copy-on-write?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.// static intduppage(envid_t envid, unsigned pn){	int r;	void *addr;	pte_t pte;	envid_t our_envid;	// LAB 4: Your code here.	our_envid = sys_getenvid();	addr = (void *) (pn*PGSIZE);	pte = (pte_t)vpt[VPN(addr)];	        // + LAB 6:        if ( pte & PTE_SHARE ){            if ( (r = sys_page_map(our_envid, addr, envid, addr, pte & PTE_USER)) < 0)			panic("duppage() - failed to map shared page!");            return 0;        }        // - LAB 6        	if ( (pte & PTE_W) || (pte & PTE_COW) ){		if ( (r = sys_page_map(our_envid, addr, envid, addr, PTE_COW | PTE_U | PTE_P)) < 0)			panic("duppage() - failed to map writable or COW page!");		if ( (r = sys_page_map(our_envid, addr, our_envid, addr, PTE_COW | PTE_U | PTE_P)) < 0)			panic("duppage() - failed to remap!");	}else{		if ( (r = sys_page_map(our_envid, addr, envid, addr, PTE_U | PTE_P)) < 0)			panic("duppage() - failed to map read-only page!");	}		return 0;}
开发者ID:ren85,项目名称:jos2006,代码行数:44,


示例11: duppage

//// Map our virtual page pn (address pn*PGSIZE) into the target envid// at the same virtual address.  If the page is writable or copy-on-write,// the new mapping must be created copy-on-write, and then our mapping must be// marked copy-on-write as well.  (Exercise: Why do we need to mark ours// copy-on-write again if it was already copy-on-write at the beginning of// this function?)//// Returns: 0 on success, < 0 on error.// It is also OK to panic on error.// static intduppage(envid_t envid, unsigned pn){	int r;		// LAB 4: Your code here.	if (debug)		cprintf("/n duppage: 1/n");		pte_t pte = vpt[pn];	int perm = pte & PTE_USER;	void *va = (void*) (pn*PGSIZE);		if (debug)		cprintf("/n duppage: 2/n");			if ((perm & PTE_P) != PTE_P)		panic ("user panic: lib/fork.c: duppage(): page to be duplicated is not PTE_P/n");	if ((perm & PTE_U) != PTE_U)		panic ("user panic: lib/fork.c: duppage(): page to be duplicated is not PTE_U/n");	if (debug)		cprintf("/n duppage: 3/n");		// LAB 7: Include PTE_SHARE convention	if ( !(perm & PTE_SHARE) && (((perm & PTE_W) == PTE_W) || ((perm & PTE_COW) == PTE_COW)))	{		if (debug)			cprintf("/n duppage: 4/n");			// perm = PTE_P | PTE_U | PTE_COW;	// buggy permissions, removed in LAB 7		perm &= ~PTE_W;				// remove write from perm		perm |= PTE_COW;			// add copy-on-write		if (debug)			cprintf("/n duppage: 10/n");			if ((r = sys_page_map(0, va, envid, va, perm)) < 0)			return r;		if (debug)			cprintf("/n duppage: 11/n");			if ((r = sys_page_map(0, va, 0, va, perm)) < 0)			return r;					if (debug)			cprintf("/n duppage: 5/n");		}	// LAB 7: Include PTE_SHARE convention	else	{		if (debug)			cprintf("/n duppage: 6/n");			if ((r = sys_page_map(0, va, envid, va, perm)) < 0)			return r;		if (debug)			cprintf("/n duppage: 7/n");		}	//	cprintf("duppage() tried to copy a page which is neither PTE_W nor PTE_COW/n");	// panic("duppage not implemented");	return 0;}
开发者ID:ksandeep,项目名称:JOS-Labs,代码行数:66,


示例12: duppage

static intduppage(envid_t envid, unsigned pn){	int r;        int i=0;        int dir_index = 0 ;        uint32_t perm = 0 ;        //check if vpt[i] is marked as Write or cow, if so         //mark it as COW  for child and parent            //cprintf("i %d vpt[i] %x /n",i,&vpt[i]);         //Make sure that this page is not the exception stack       if ( pn * PGSIZE >= ( UXSTACKTOP - PGSIZE ) &&            pn * PGSIZE <= ( UXSTACKTOP )          )          {             //cprintf("Found a Exception stack at %d/n",pn);              return 0;          }          if( ( vpt[pn] & PTE_P ) == PTE_P )         {             perm = vpt[pn] & 0xFFF; //Get last 12 bits            if(( vpt[pn] & PTE_SHARED) == PTE_SHARED)            {                perm |= PTE_SHARED;              //cprintf("Mapping the page for child %d/n",pn);              //insert this page in child's PG DIR               r = sys_page_map(0,(void*)( pn * PGSIZE), envid,(void*)(pn*PGSIZE),perm | PTE_P);              if( r < 0 )               {                   panic("Unable to map a page %d/n",pn);              }              //cprintf("Mapping the page for parent %d/n",pn);              //update the Parent PGDIR to reflect new permission             r = sys_page_map(0,(void*)( pn * PGSIZE), 0,(void*)(pn*PGSIZE),perm | PTE_P);              if( r < 0 )               {                   panic("Unable to map a page %d/n",pn);              }          }        } 	// LAB 4: Your code here.	//panic("duppage not implemented");	return 0;}
开发者ID:ganeshskudva,项目名称:JOS,代码行数:54,


示例13: map_segment

static intmap_segment(envid_t child, uintptr_t va, size_t memsz,	int fd, size_t filesz, off_t fileoffset, int perm){	int i, r;	void *blk;	//cprintf("map_segment %x+%x/n", va, memsz);	if ((i = PGOFF(va))) {		va -= i;		memsz += i;		filesz += i;		fileoffset -= i;	}	for (i = 0; i < memsz; i += PGSIZE) {		if (i >= filesz) {			// allocate a blank page			if ((r = sys_page_alloc(0, UTEMP, perm)) < 0) {				return r;			}                        memset(UTEMP, 0, PGSIZE);			sys_page_map(0, UTEMP, child, (void *)(va+i), perm);			return r;		} else {			// from file			if (perm & PTE_W) {				// must make a copy so it can be writable				if ((r = sys_page_alloc(0, UTEMP, PTE_P|PTE_U|PTE_W)) < 0)					return r;				if ((r = seek(fd, fileoffset + i)) < 0)					return r;				if ((r = read(fd, UTEMP, MIN(PGSIZE, filesz-i))) < 0)					return r;                                memset(UTEMP+MIN(PGSIZE, filesz-i), 0, PGSIZE-MIN(PGSIZE, filesz-i));				if ((r = sys_page_map(0, UTEMP, child, (void*) (va + i), perm)) < 0)					panic("spawn: sys_page_map data: %e", r);				sys_page_unmap(0, UTEMP);			} else {				// can map buffer cache read only				if ((r = read_map(fd, fileoffset + i, &blk)) < 0)					return r;				if ((r = sys_page_map(0, blk, child, (void*) (va + i), perm)) < 0)					panic("spawn: sys_page_map text: %e", r);			}		}	}	return 0;}
开发者ID:ichaos,项目名称:jos,代码行数:50,


示例14: pgfault

//// Custom page fault handler - if faulting page is copy-on-write,// map in our own private writable copy.//static voidpgfault(struct UTrapframe *utf){	void *addr = (void *) utf->utf_fault_va;	uint32_t err = utf->utf_err;	int r;	// Check that the faulting access was (1) a write, and (2) to a	// copy-on-write page.  If not, panic.	// Hint:	//   Use the read-only page table mappings at uvpt	//   (see <inc/memlayout.h>).	// LAB 4: Your code here.	if ((err & FEC_WR) == 0 || (vpd[VPD(addr)] & PTE_P) == 0 || (vpt[VPN(addr)] & PTE_COW) == 0)		panic ("pgfault: not a write or attempting to access a non-COW page");	// Allocate a new page, map it at a temporary location (PFTEMP),	// copy the data from the old page to the new page, then move the new	// page to the old page's address.	// Hint:	//   You should make three system calls.	//   No need to explicitly delete the old page's mapping.	// LAB 4: Your code here.	if ((r = sys_page_alloc (0, (void *)PFTEMP, PTE_U|PTE_P|PTE_W)) < 0)		panic ("pgfault: page allocation failed : %e", r);	addr = ROUNDDOWN (addr, PGSIZE);	memmove (PFTEMP, addr, PGSIZE);	if ((r = sys_page_map (0, PFTEMP, 0, addr, PTE_U|PTE_P|PTE_W)) < 0)		panic ("pgfault: page mapping failed : %e", r);	//panic("pgfault not implemented");}
开发者ID:zbh24,项目名称:JosLab,代码行数:36,


示例15: copy_shared_pages

// Copy the mappings for shared pages into the child address space.static intcopy_shared_pages(envid_t child){	// LAB 7: Your code here.	int r;	int pdeno, pteno;	uint32_t pn = 0;		for (pdeno = 0; pdeno < VPD(UTOP); pdeno++) 	{		if (vpd[pdeno] == 0) 		{			// skip empty PDEs			pn += NPTENTRIES;			continue;		}						for (pteno = 0; pteno < NPTENTRIES; pteno++,pn++) 		{			if (vpt[pn] == 0)				// skip empty PTEs				continue;								int perm = vpt[pn] & PTE_USER;			if (perm & PTE_SHARE) 			{				void *addr = (void *)(pn << PGSHIFT);				r = sys_page_map(0, addr, child, addr, perm);				if (r)					return r;			}		}	}	return 0;}
开发者ID:PennPanda,项目名称:mitjos,代码行数:36,


示例16: read_block

// Make sure a particular disk block is loaded into memory.// Returns 0 on success, or a negative error code on error.// // If blk != 0, set *blk to the address of the block in memory.//// Hint: Use diskaddr, map_block, and ide_read.static intread_block(uint32_t blockno, char **blk){	int r;	char *addr;	if (super && blockno >= super->s_nblocks)		panic("reading non-existent block %08x/n", blockno);	if (bitmap && block_is_free(blockno))		panic("reading free block %08x/n", blockno);	// LAB 5: Your code here.	r = map_block(blockno);	if (r)		return r;	addr = diskaddr(blockno);	r = ide_read(blockno * BLKSECTS, addr, BLKSECTS);	if (r)		return r;	if (blk)		*blk = addr;	return sys_page_map(0, addr, 0, addr, vpt[VPN(addr)] & PTE_USER);}
开发者ID:reesun,项目名称:guavaos,代码行数:33,


示例17: flush_block

// Flush the contents of the block containing VA out to disk if// necessary, then clear the PTE_D bit using sys_page_map.// If the block is not in the block cache or is not dirty, does// nothing.// Hint: Use va_is_mapped, va_is_dirty, and ide_write.// Hint: Use the PTE_USER constant when calling sys_page_map.// Hint: Don't forget to round addr down.voidflush_block(void *addr){	uint32_t blockno = ((uint32_t)addr - DISKMAP) / BLKSIZE; 	uint32_t secno, r;	if (addr < (void*)DISKMAP || addr >= (void*)(DISKMAP + DISKSIZE))		panic("flush_block of bad va %08x", addr);	// LAB 5: Your code here.        addr = ROUNDDOWN(addr,PGSIZE);        secno = blockno*BLKSECTS;		if(va_is_mapped(addr) && va_is_dirty(addr))	{			r = ide_write(secno, addr, BLKSECTS);		if(r)			panic("IDE write failed: %e", r);		//cprintf("/nClearing PTE_D : 0x%08x/n", vpt[VPN(addr)] & (~PTE_D));		r = sys_page_map(0,addr,0,addr, ((vpt[VPN(addr)] | PTE_USER) & (~PTE_D)));		// & PTE_USER  		if(r)			cprintf("/nPage Mapping failed %e/n", r);	}	//panic("flush_block not implemented");}
开发者ID:nitin-aggarwal,项目名称:JOS,代码行数:32,


示例18: copy_shared_pages

// Copy the mappings for shared pages into the child address space.    static intcopy_shared_pages(envid_t child){    // LAB 7: Your code here.    uint64_t vaddr;    int r;    for(vaddr=0; vaddr<UTOP; vaddr += PGSIZE) {                // Copying from lib/fork.c bruh.        if( // Gotta use the virtual types apparently.            (vpml4e[VPML4E(vaddr)] & PTE_P) // Mota mota level is present.            && ((vpde[VPDPE(vaddr)] & PTE_U) && (vpde[VPDPE(vaddr)] & PTE_P)) // Slighlt less mota level is also present.            && ((vpd[VPD(vaddr)] & PTE_U) && (vpd[VPD(vaddr)] & PTE_P))            &&  ((vpt[VPN(vaddr)] & PTE_U) && (vpt[VPN(vaddr)] & PTE_P))            )            if(vpt[VPN(vaddr)]&PTE_SHARE) {                r = sys_page_map(0, (void*)vaddr, child, (void*)vaddr, vpt[VPN(vaddr)] & PTE_SYSCALL);                if(r<0) {                    cprintf("WARN: Your environments are now throughly done for man./n");                    return -1;                }            }    }    return 0;}
开发者ID:HarounH,项目名称:COL331_HardwareVirtualization,代码行数:26,


示例19: fork

//// User-level fork with copy-on-write.// Set up our page fault handler appropriately.// Create a child.// Copy our address space and page fault handler setup to the child.// Then mark the child as runnable and return.//// Returns: child's envid to the parent, 0 to the child, < 0 on error.// It is also OK to panic on error.//// Hint://   Use vpd, vpt, and duppage.//   Remember to fix "thisenv" in the child process.//   Neither user exception stack should ever be marked copy-on-write,//   so you must allocate a new page for the child's user exception stack.//    envid_tfork(void){    // LAB 4: Your code here.    envid_t envid;        uint64_t addr;        uint32_t err;        extern unsigned char end[];        int r;        set_pgfault_handler(pgfault);        envid = sys_exofork();        if (envid < 0)                panic("sys_exofork: %e", envid);        if (envid == 0) {                // We're the child.                // The copied value of the global variable 'thisenv'                // is no longer valid (it refers to the parent!).                // Fix it and return 0.                thisenv = &envs[ENVX(sys_getenvid())];                return 0;        }        //Allocate exception stack for the child        if ((err = sys_page_alloc(envid, (void *) (UXSTACKTOP - PGSIZE), PTE_P|PTE_U|PTE_W)) < 0)                panic("Error in sys_page_alloc: %e", err);        // We're the parent.        // Map our entire address space into the child.        for (addr = UTEXT; addr < USTACKTOP-PGSIZE; addr += PGSIZE) {               if((vpml4e[VPML4E(addr)] & PTE_P) && (vpde[VPDPE(addr)] & PTE_P)                        && (vpd[VPD(addr)] & PTE_P) && (vpt[VPN(addr)] & PTE_P)) {                       duppage(envid, VPN(addr));                }        }        //Allocate a new stack for the child and copy the contents of parent on to it.        addr = USTACKTOP-PGSIZE;	if ((r = sys_page_alloc(0, (void *)PFTEMP, PTE_P|PTE_U|PTE_W)) < 0)                panic("sys_page_alloc failed: %e/n", r);        memcpy(PFTEMP, (void *) ROUNDDOWN(addr, PGSIZE), PGSIZE);        void *vaTemp = (void *) ROUNDDOWN(addr, PGSIZE);        if ((r = sys_page_map(0, (void *)PFTEMP, envid, vaTemp, PTE_P|PTE_U|PTE_W)) < 0)                panic("sys_page_map failed: %e/n", r);        if ((r = sys_page_unmap(0, (void *)PFTEMP)) < 0)                panic("sys_page_unmap failed: %e/n", r);        //Set child's page fault handler        if ((err = sys_env_set_pgfault_upcall(envid, _pgfault_upcall) < 0))                panic("Error in sys_env_set_pgfault_upcall: %e",err);        //Set the child ready to run        if ((err = sys_env_set_status(envid, ENV_RUNNABLE)) < 0)                panic("sys_env_set_status: %e", err);        return envid;    panic("fork not implemented");}
开发者ID:sumanthkanuparthi,项目名称:Hypervisor,代码行数:76,


示例20: copy_shared_pages

// Copy the mappings for shared pages into the child address space.static intcopy_shared_pages(envid_t child){	int pn, perm;	int retval = 0;	// Step through each page below UTOP. If the page is PTE_SHARE,	//  then copy the mapping of that page to the child environment.	for(pn = 0; pn < PGNUM(UTOP); pn++) {		// Check to see if the page directory entry and page table		//  entry for this page exist, and if the page is marked		//  PTE_SHARE.		if((uvpd[PDX(pn*PGSIZE)]&PTE_P) == 0 ||		   (uvpt[pn]&PTE_P) == 0 ||		   (uvpt[pn]&PTE_SHARE) == 0)			continue;		// Grab the permissions for the page		perm = uvpt[pn]&PTE_SYSCALL;		// Copy the current page number over		if((retval = sys_page_map(0, (void *)(pn*PGSIZE), child, (void *)(pn*PGSIZE), perm)) != 0)			break;	}	return 0;}
开发者ID:AkshayRShukla,项目名称:jos-mmap,代码行数:28,


示例21: flush_block

// Flush the contents of the block containing VA out to disk if// necessary, then clear the PTE_D bit using sys_page_map.// If the block is not in the block cache or is not dirty, does// nothing.// Hint: Use va_is_mapped, va_is_dirty, and ide_write.// Hint: Use the PTE_SYSCALL constant when calling sys_page_map.// Hint: Don't forget to round addr down.voidflush_block(void *addr){    uint32_t blockno = ((uint32_t)addr - DISKMAP) / BLKSIZE;    int r;    if (addr < (void*)DISKMAP || addr >= (void*)(DISKMAP + DISKSIZE))        panic("flush_block of bad va %08x", addr);    // LAB 5: Your code here.    addr = (void *)ROUNDDOWN(addr, PGSIZE);    if (!va_is_mapped(addr) || !va_is_dirty(addr))        return;    if ((r = ide_write(BLKSECTS * blockno, addr, BLKSECTS)) < 0) {        panic("flush_block: ide_write error %e/n", r);    }    if ((r = sys_page_map(0, addr, 0, addr, uvpt[PGNUM(addr)] & PTE_SYSCALL & ~PTE_D))) {        panic("flush_block: sys_page_map error %e/n", r);    }    return;}
开发者ID:macfij,项目名称:macfij_jos,代码行数:32,


示例22: write_block

// Copy the current contents of the block out to disk.// Then clear the PTE_D bit using sys_page_map.// Hint: Use ide_write.// Hint: Use the PTE_USER constant when calling sys_page_map.voidwrite_block(uint32_t blockno){	char *addr;	if (!block_is_mapped(blockno))		panic("write unmapped block %08x", blockno);		// Write the disk block and clear PTE_D.	// LAB 5: Your code here.	// We will use the VM hardware to keep track of whether a 	// disk block has been modified since it was last read from 	// or written to disk. To see whether a block needs writing, 	// we can just look to see if the PTE_D "dirty" bit is set 	// in the vpt entry.	addr = diskaddr(blockno);	if(!va_is_dirty(addr)) return;		int error;	int secno = blockno*BLKSECTS;	error = ide_write(secno, addr, BLKSECTS);	if(error<0) panic("write block error on writing");	int env_id = sys_getenvid();	error = sys_page_map(env_id, addr, 		env_id, addr, ((PTE_U|PTE_P|PTE_W) & ~PTE_D));	if(error<0) panic("write block error on clearing PTE_D");	// panic("write_block not implemented");}
开发者ID:darfux,项目名称:jos,代码行数:37,


示例23: syscall

// Dispatches to the correct kernel function, passing the arguments.int64_tsyscall(uint64_t syscallno, uint64_t a1, uint64_t a2, uint64_t a3, uint64_t a4, uint64_t a5){	// Call the function corresponding to the 'syscallno' parameter.	// Return any appropriate return value.	// LAB 3: Your code here.//	panic("syscall not implemented");	switch (syscallno) {	case SYS_cputs:			sys_cputs((const char *)a1, (size_t)a2);			return 0;	case SYS_cgetc:			return sys_cgetc();        case SYS_getenvid:			return sys_getenvid();        case SYS_env_destroy:			return sys_env_destroy(a1);	case SYS_yield:			sys_yield();			return 0;				case SYS_page_alloc:        		return sys_page_alloc((envid_t)a1, (void *)a2,(int)a3);	case SYS_page_map:			return sys_page_map((envid_t)a1, (void *)a2, (envid_t)a3, (void *)a4, (int)a5);        	case SYS_page_unmap:			return sys_page_unmap((envid_t)a1, (void *)a2);        	case SYS_exofork:			return sys_exofork();        	case SYS_env_set_status:			return sys_env_set_status((envid_t)a1, a2);		case SYS_env_set_pgfault_upcall:			return sys_env_set_pgfault_upcall((envid_t)a1,(void *)a2);			case SYS_ipc_try_send:			return sys_ipc_try_send((envid_t)a1, (uint32_t)a2, (void *)a3, a4);	case SYS_ipc_recv:			return sys_ipc_recv((void *)a1);		case SYS_env_set_trapframe:			return sys_env_set_trapframe((envid_t)a1, (struct Trapframe *)a2);	case SYS_time_msec:			return sys_time_msec();	case SYS_packet_transmit:			return sys_packet_transmit((char*)a1,(size_t)a2);	case SYS_packet_receive:                        return sys_packet_receive((char *)a1);	//lab 7 code from here	case SYS_insmod:			return sys_insmod((char *)a1, (char *)a2,(char *)a3);	case SYS_rmmod:			return sys_rmmod((char *)a1);	case SYS_lsmod:			return sys_lsmod();	case SYS_depmod:			return sys_depmod((char *)a1);	//lab7 code ends here	default:		return -E_NO_SYS;	}}
开发者ID:deepakkumar-b,项目名称:JOS-Labs_Project,代码行数:61,


示例24: sys_ipc_try_send

// Try to send 'value' to the target env 'envid'.// If srcva < UTOP, then also send page currently mapped at 'srcva',// so that receiver gets a duplicate mapping of the same page.//// The send fails with a return value of -E_IPC_NOT_RECV if the// target is not blocked, waiting for an IPC.//// The send also can fail for the other reasons listed below.//// Otherwise, the send succeeds, and the target's ipc fields are// updated as follows://    env_ipc_recving is set to 0 to block future sends;//    env_ipc_from is set to the sending envid;//    env_ipc_value is set to the 'value' parameter;//    env_ipc_perm is set to 'perm' if a page was transferred, 0 otherwise.// The target environment is marked runnable again, returning 0// from the paused sys_ipc_recv system call.  (Hint: does the// sys_ipc_recv function ever actually return?)//// If the sender wants to send a page but the receiver isn't asking for one,// then no page mapping is transferred, but no error occurs.// The ipc only happens when no errors occur.//// Returns 0 on success, < 0 on error.// Errors are://	-E_BAD_ENV if environment envid doesn't currently exist.//		(No need to check permissions.)//	-E_IPC_NOT_RECV if envid is not currently blocked in sys_ipc_recv,//		or another environment managed to send first.//	-E_INVAL if srcva < UTOP but srcva is not page-aligned.//	-E_INVAL if srcva < UTOP and perm is inappropriate//		(see sys_page_alloc).//	-E_INVAL if srcva < UTOP but srcva is not mapped in the caller's//		address space.//	-E_INVAL if (perm & PTE_W), but srcva is read-only in the//		current environment's address space.//	-E_NO_MEM if there's not enough memory to map srcva in envid's//		address space.static intsys_ipc_try_send(envid_t envid, uint32_t value, void *srcva, unsigned perm){	// LAB 4: Your code here.	// My code : alaud	//cprintf("Trying to send to %x, for %x, nice %x/n", envid,curenv->env_id, curenv->env_nice);	int status = 0;	struct Env *target_env;	if((status = envid2env(envid, &target_env, 0)) < 0)	{		return status;	}	if(!target_env -> env_ipc_recving)	{		return -E_IPC_NOT_RECV;	}	//cprintf("Still Trying to send to %x, for %x, nice %x/n", envid,curenv->env_id, curenv->env_nice);	target_env -> env_ipc_perm = 0;	if((uint32_t)srcva < UTOP && (uint32_t)target_env -> env_ipc_dstva < UTOP)	{		if((status = sys_page_map(curenv -> env_id, srcva, envid, target_env -> env_ipc_dstva, perm)) < 0)		{			return status;		}		target_env -> env_ipc_perm = perm;	}	//cprintf("Still Still Trying to send to %x, for %x, nice %x/n", envid,curenv->env_id, curenv->env_nice);	target_env -> env_ipc_value = value;	target_env -> env_ipc_recving = 0;	target_env -> env_ipc_from = curenv -> env_id;	target_env -> env_status = ENV_RUNNABLE;	return 0;	//panic("sys_ipc_try_send not implemented");}
开发者ID:reddragon,项目名称:cse506,代码行数:72,


示例25: sys_ipc_try_send

// Try to send 'value' to the target env 'envid'.// If va != 0, then also send page currently mapped at 'va',// so that receiver gets a duplicate mapping of the same page.//// The send fails with a return value of -E_IPC_NOT_RECV if the// target has not requested IPC with sys_ipc_recv.//// Otherwise, the send succeeds, and the target's ipc fields are// updated as follows://    env_ipc_recving is set to 0 to block future sends;//    env_ipc_from is set to the sending envid;//    env_ipc_value is set to the 'value' parameter;//    env_ipc_perm is set to 'perm' if a page was transferred, 0 otherwise.// The target environment is marked runnable again, returning 0// from the paused ipc_recv system call.//// If the sender sends a page but the receiver isn't asking for one,// then no page mapping is transferred, but no error occurs.// The ipc doesn't happen unless no errors occur.//// Returns 0 on success where no page mapping occurs,// 1 on success where a page mapping occurs, and < 0 on error.// Errors are://	-E_BAD_ENV if environment envid doesn't currently exist.//		(No need to check permissions.)//	-E_IPC_NOT_RECV if envid is not currently blocked in sys_ipc_recv,//		or another environment managed to send first.//	-E_INVAL if srcva < UTOP but srcva is not page-aligned.//	-E_INVAL if srcva < UTOP and perm is inappropriate//		(see sys_page_alloc).//	-E_INVAL if srcva < UTOP but srcva is not mapped in the caller's//		address space.//	-E_NO_MEM if there's not enough memory to map srcva in envid's//		address space.static intsys_ipc_try_send(envid_t envid, uint32_t value, void *srcva, unsigned perm){	// LAB 4: Your code here.        int r = 0;        struct Env *dstEnv = NULL;        if ((r=envid2env(envid, &dstEnv, 0)) < 0) {                return r;        }        if (!dstEnv->env_ipc_recving) {                return -E_IPC_NOT_RECV;        }        dstEnv->env_ipc_recving = 0;        dstEnv->env_ipc_from = curenv->env_id;        dstEnv->env_ipc_value = value;        dstEnv->env_status = ENV_RUNNABLE;        if ((uint32_t)srcva < UTOP && (uint32_t)(dstEnv->env_ipc_dstva) < UTOP) {                if ((r = sys_page_map(0, srcva, envid, dstEnv->env_ipc_dstva, perm)) < 0) {                        return r;                }                dstEnv->env_ipc_perm = perm;        } else {                dstEnv->env_ipc_perm = 0;        }        return 0;	//panic("sys_ipc_try_send not implemented");}
开发者ID:cutecheng,项目名称:zcjos,代码行数:67,


示例26: copy_shared_pages

// Copy the mappings for shared pages into the child address space.static intcopy_shared_pages(envid_t child){	// LAB 7: Your code here.	int r;	uint32_t i, j, pn;	// Copy shared address space to child	for (i = PDX(UTEXT); i < PDX(UXSTACKTOP); i++) {		if (vpd[i] & PTE_P) { // If page table present			for (j = 0; j < NPTENTRIES; j++) {					pn = PGNUM(PGADDR(i, j, 0));				if (pn == PGNUM(UXSTACKTOP - PGSIZE)) {					break; // Don't map when reach uxstack				}				if ((vpt[pn] & PTE_P) && 				    (vpt[pn] & PTE_SHARE)) {					if ((r = sys_page_map(0, 							      (void *) (pn * PGSIZE), 							      child, 							      (void *) (pn * PGSIZE), 							      vpt[pn] & PTE_SYSCALL)) < 0) {			return r;		}				}						}		}	}	return 0;}
开发者ID:bosswissam,项目名称:djos,代码行数:34,


示例27: pgfault

//// Custom page fault handler - if faulting page is copy-on-write,// map in our own private writable copy.//static voidpgfault(struct UTrapframe *utf){	void *addr = (void *) utf->utf_fault_va;	uint32_t err = utf->utf_err;	int r;	// Check that the faulting access was (1) a write, and (2) to a	// copy-on-write page.  If not, panic.	// Hint:	//   Use the read-only page table mappings at uvpt	//   (see <inc/memlayout.h>).    if (((err & FEC_WR) == 0) || ((uvpd[PDX(addr)] & PTE_P)==0) ||                     ((uvpt[PGNUM(addr)] & PTE_COW)==0) )            panic("Page fault in lib/fork.c!/n");	// LAB 4: Your code here.	// Allocate a new page, map it at a temporary location (PFTEMP),	// copy the data from the old page to the new page, then move the new	// page to the old page's address.	// Hint:	//   You should make three system calls.    if ((r = sys_page_alloc(0, (void*)PFTEMP, PTE_U|PTE_P|PTE_W))  <0)                panic("alloc page error in lib/fork.c/n");    addr = ROUNDDOWN(addr, PGSIZE);    memcpy(PFTEMP, addr, PGSIZE);    if ((r = sys_page_map(0, PFTEMP, 0, addr, PTE_U|PTE_P|PTE_W)) <0)                panic("page map error in lib/fork.c/n");    if ((r = sys_page_unmap(0, PFTEMP)) <0)                panic("page unmap error in lib/fork.c/n");// LAB 4: Your code here.}
开发者ID:DoraXingyu,项目名称:JosLab_2015,代码行数:39,


示例28: flush_block

// Flush the contents of the block containing VA out to disk if// necessary, then clear the PTE_D bit using sys_page_map.// If the block is not in the block cache or is not dirty, does// nothing.// Hint: Use va_is_mapped, va_is_dirty, and ide_write.// Hint: Use the PTE_SYSCALL constant when calling sys_page_map.// Hint: Don't forget to round addr down.voidflush_block(void *addr)	{		uint64_t blockno = ((uint64_t)addr - DISKMAP) / BLKSIZE;		int r;				if (addr < (void*)DISKMAP || addr >= (void*)(DISKMAP + DISKSIZE))			panic("flush_block of bad va %08x", addr);			// LAB 5: Your code here.		//panic("flush_block not implemented");		if(va_is_mapped(addr) == false || va_is_dirty(addr) == false)		{			return;		}		addr = ROUNDDOWN(addr, PGSIZE);#ifdef VMM_GUEST		if(0 != host_write((uint32_t) (blockno * BLKSECTS), (void*)addr, BLKSECTS))		{			panic("ide read failed in Page Fault Handling");				}#else		if(0 != ide_write((uint32_t) (blockno * BLKSECTS), (void*)addr, BLKSECTS))		{			panic("ide write failed in Flush Block");			}#endif			if ((r = sys_page_map(0, addr, 0, addr, PTE_SYSCALL)) < 0)		{			panic("in flush_block, sys_page_map: %e", r);		}	}
开发者ID:jainumesh,项目名称:JOS_64,代码行数:39,


示例29: copy_shared_pages

// Copy the mappings for shared pages into the child address space.static intcopy_shared_pages(envid_t child){	// LAB 5: Your code here.	int i,j,ret;	uintptr_t addr;	envid_t curr_envid = sys_getenvid();		for(i=0;i<PDX(UTOP);i++)	{		if(uvpd[i] & PTE_P && i != PDX(UVPT))		{			addr = i << PDXSHIFT;			for(j=0;j<NPTENTRIES;j++)			{				addr = (i<<PDXSHIFT)+(j<<PGSHIFT);								if((uvpt[addr>>PGSHIFT] & PTE_P) && (uvpt[addr>>PGSHIFT] & PTE_SHARE))				{					ret = sys_page_map(curr_envid, (void *)addr, child,(void *)addr,PTE_AVAIL|PTE_P|PTE_U|PTE_W);					if(ret) panic("sys_page_map: %e", ret);					//cprintf("addr %x is shared/n",addr);				}							}		}	}	
开发者ID:jguo2013,项目名称:smallOS,代码行数:28,



注:本文中的sys_page_map函数示例整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。


C++ sys_page_unmap函数代码示例
C++ sys_page_alloc函数代码示例
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。