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

📄 do_vcopy.c

📁 Minix3.11的源码。[MINIX 3是一个为高可靠性应用而设计的自由且简洁的类UNIX系统。]
💻 C
字号:
/* The kernel call implemented in this file: *   m_type:	SYS_VIRVCOPY, SYS_PHYSVCOPY  * * The parameters for this kernel call are: *    m1_i3:	VCP_VEC_SIZE		size of copy request vector  *    m1_p1:	VCP_VEC_ADDR		address of vector at caller  *    m1_i2:	VCP_NR_OK		number of successfull copies	 */#include "../system.h"#include <minix/type.h>#if (USE_VIRVCOPY || USE_PHYSVCOPY)/* Buffer to hold copy request vector from user. */PRIVATE struct vir_cp_req vir_cp_req[VCOPY_VEC_SIZE];/*===========================================================================* *				do_vcopy					     * *===========================================================================*/PUBLIC int do_vcopy(m_ptr)register message *m_ptr;	/* pointer to request message */{/* Handle sys_virvcopy() and sys_physvcopy() that pass a vector with copy * requests. Although a single handler function is used, there are two * different kernel calls so that permissions can be checked. */  int nr_req;  int caller_pid;  vir_bytes caller_vir;  phys_bytes caller_phys;  phys_bytes kernel_phys;  phys_bytes bytes;  int i,s;  struct vir_cp_req *req;  /* Check if request vector size is ok. */  nr_req = (unsigned) m_ptr->VCP_VEC_SIZE;  if (nr_req > VCOPY_VEC_SIZE) return(EINVAL);  bytes = nr_req * sizeof(struct vir_cp_req);  /* Calculate physical addresses and copy (port,value)-pairs from user. */  caller_pid = (int) m_ptr->m_source;   caller_vir = (vir_bytes) m_ptr->VCP_VEC_ADDR;  caller_phys = umap_local(proc_addr(caller_pid), D, caller_vir, bytes);  if (0 == caller_phys) return(EFAULT);  kernel_phys = vir2phys(vir_cp_req);  phys_copy(caller_phys, kernel_phys, (phys_bytes) bytes);  /* Assume vector with requests is correct. Try to copy everything. */  m_ptr->VCP_NR_OK = 0;  for (i=0; i<nr_req; i++) {      req = &vir_cp_req[i];      /* Check if physical addressing is used without SYS_PHYSVCOPY. */      if (((req->src.segment | req->dst.segment) & PHYS_SEG) &&              m_ptr->m_type != SYS_PHYSVCOPY) return(EPERM);      if ((s=virtual_copy(&req->src, &req->dst, req->count)) != OK)           return(s);      m_ptr->VCP_NR_OK ++;  }  return(OK);}#endif /* (USE_VIRVCOPY || USE_PHYSVCOPY) */

⌨️ 快捷键说明

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