CSC3150-说明书-A3介绍这项任务使用xv6,一个简单的、类似Unix的教学操作系统,作为平台指导您实现mmap和munmp系统调用。
这两个用来共享进程之间的内存,并将文件映射到进程地址空间。一般来说,这项任务的重点是内存映射文件。支持内存映射的机制文件可以处理文件,就好像它们是程序内存的一部分一样。这是通过以下方式实现的将文件映射到虚拟内存空间的一段(提醒:每个进程都有自己的进程虚拟地址空间)。文件和内存空间之间的这种映射是使用“mmap()”系统调用,并且使用“munmap()”的系统调用删除映射。我们提供一个虚拟机映像,在该映像中配置和设置了所有内容。图像可用在黑板上。屈服截止日期:2024年4月9日23:59严禁抄袭。请注意,TA可能会要求您解释您的程序,以确保代码确实是由您自己编写的。
还请注意我们会检查你的程序是否与同学的代码过于相似互联网上可用的使用剽窃检测器的解决方案。逾期提交:在15分钟内逾期提交不会对您的分数。在那之后,你每多提交一天,你的分数就会减少10%. (例如,肖宇在2024年4月11日提交了课业3的完美尝试。她会得到100*(1-0.2)=课业3得80分。您应该向黑板提交一个zip文件。zip文件结构如下。格式化指南项目结构如下图所示。您也可以使用ls命令检查您的结构良好。结构不匹配会导致扣分。
对于这项任务,您不需要为额外的学分部分指定特定的文件夹。源文件夹应包含四个文件:proc.c、proc.h、sysfile.c和trap.cmain@ubuntu:~/桌面/工作分配_3_120010001$lsReport.pdf来源/1.2.(一个目录和一个pdf。)3.4.main@ubuntu:~/桌面/Assignment_3_120010001/source$lsproc.c proc.h系统文件.c陷阱.c(三个.c文件和一个.h文件)1.2.3.4.请将文件结构根文件夹中的所有文件压缩为一个zip文件,并使用命名例如,您的学生ID为下面和上面显示的代码,工作分配_3_120010001.zip。报告应以pdf格式一起提交使用源代码。格式不匹配会导致扣分。以下是示例步骤用于压缩代码。main@ubuntu桌面zip-q-r分配_3_120010001.zip分配_3_12001/0001main@ubuntu:~/桌面$ls工作分配_3_120010001工作分配_3_
1 20010001.zip1.2.3.4.5.主机和虚拟机之间的交互提示以下是一些在主机和虚拟机之间进行交互的有用提示。如果你熟悉它和“格式指南”,你可以忽略这一部分。在终端中,不应包含“<”和“>”。
在这里,它们只是为了呈现一个自定义字符串变量1.将分配文件夹复制到您的虚拟机。您可以在中复制文件夹VSCode或使用下面的scp命令。在主机中:cd<your_host_path_to_project_zip>scp-P 2200/[email protected]:~1.2.如果路径中有空格,请使用双引号包括您的路径,例如cd“your主机路径”。2.解压缩虚拟机中的分配文件夹。在虚拟机中:解压缩~/cs3150-project3.zip~/chmod-R+x~/cs3150项目31.2.然后,您可以浏览课业文件夹。完成项目后,应按照格式说明包装文件。我们为您准备一个脚本来生成提交zip。此可选脚本仅适用于方便包装文件。您可以用自己的方式包装文件,只需确保遵循格式。3.假设您已经将Report.pdf复制到虚拟机(如将分配zip从主机复制到虚拟机的方式)。在虚拟机中:cd~/cs3150项目3bash gen_submission.sh1.2.gen_submission.sh脚本将询问您的学生id和Report.pdf的路径。然后你可以在~/cs3150下找到你的提交文件夹项目3/提交/分配_3_<your_student_id>.zip4.您可以使用以下命令将提交zip复制到您的主机上。
在主机中:scp-P [email protected]:~/cs3150-项目3/提交/分配_3_<your_student_id>.zip<your_host_machine_folder_path>1.然后,您将在_host_machine_folder_path中获得提交zip。别忘了将您的zip文件提交到BlackBoard。说明书指南我们将您的实现限制在proc.c、proc.h、sysfile.c、trap.c四个文件中,其中有缺少一些以“TODO”注释开头的代码部分。入口代 写CSC3150Unix的教学操作系统(您可以从那里开始学习)是csc3150下mmaptest.c的主要功能-project3/用户目录。带(*)的部分为引言部分。这些部分介绍了将帮助您了解这个系统是关于什么的,以及该系统如何与这些组件。在实现TODO部分时,您可能需要使用某些函数。您只能修改这四个文件中的TODO部分!我们会给你打分项目仅基于TODO部分的实现。任何其他修改都将被视为无效。1.对于介绍部分,请弄清楚功能是如何工作的以及如何使用它们。2.在开始你的课业之前,确保你对内容有一个基本的想法。我们相信这些就足够应付这项任务了。
3.(可选)对于对xv6系统感兴趣并想了解更多信息的学生,欢迎您阅读“xv6书籍”以获取更多详细信息。一https://pdos.csail.mit.edu/6.828/2022/xv6/book-riscv-rev3.pdf没有(*)的节是TODO节。在这些部分中,该组件的逻辑/详细列出了应该工作的功能。您应该在给定的位置实现功能。1.但是,此处不会显示示例代码。你需要弄清楚实现基于介绍部分中提供的逻辑和API。参数获取*<xv6 book>第4.3章孔隙泥(int,int*);int argstr(int,char*,int);void argaddr(int,uint64*);int argfd(int n,int*pfd,结构文件**pf);1.2.3.4.内核函数argint、argaddr和argfd检索第n个系统调用参数作为整数、指针或文件描述符。他们都调用argraw来检索适当保存的用户寄存器(kernel/syscall.c:34)。Proc*//在proc.h中定义结构进程{结构自旋锁;1.2.3.//使用这些时必须保持p->锁:枚举进程状态;//进程状态void*chan;//如果非零,则在chan上睡觉int已终止;//如果非零,则已被杀死int xstate;//要返回到家长等待的退出状态int pid;//进程ID//使用此选项时必须保持wait_lock:struct proc*parent;//父进程//这些对进程是私有的,因此不需要持有p->锁。uint64 kstack;//内核堆栈的虚拟地址uint64 sz;//进程内存大小(字节)pagetable_t pagetable;//用户页面表struct trapframe*trapframe;//蹦床数据页。S结构上下文;//swtch()在此处运行进程结构文件*ofile[NOFILE];//打开文件结构索引节点*cwd;//当前目录字符名称[16];//进程名称(调试)struct VMA VMA[VMASIZE];//虚拟mem区域};//在proc.c中定义//返回当前结构体proc*,如果没有则返回零。struct-proc*myproc(void)#定义PTE_W(1L<<2)#定义PTE_X(1L<<3)#定义PTE_U(1L<<4)
//用户可以访问//一个超出可能的最高虚拟地址。
//MAXVA实际上比允许的最大值小一位//Sv39,以避免必须对扩展虚拟地址进行签名//具有高位集的。
#定义MAXVA(1L<<(9+9+12-1))保护和标志*//在fcntl.h中定义#定义PROT_NONE 0x0#定义PROT_READ 0x1#定义PROT_WRITE 0x2#定义PROT_EXEC 0x4#定义MAP_SHARED 0x01#定义MAP_PRIVATE 0x02(TODO)陷阱//trap.cvoid usertrap(void){...///TODO:管理页面错误否则,如果(r_scause()==1
3 ||r_scause)==15){...}...}//主管陷阱原因静态内联uint64r_scause()
{1.2.3.4.5.6.7.8.9101112131415uint6
4 x;asm-volatile(“csrr%0,scause”:“=r”(x));返回x;}//主管陷阱值静态内联uint64r_stval(){uint6
4 x;asm-volatile(“csrr%0,stval”:“=r”(x));返回x;}16171819202122232425262728Usertrap处理来自用户空间的中断、异常或系统调用。它调用r_scause()以获取异常代码。在本课业中,您将被要求处理PageFault异常。暗示r_stval()提供陷阱值。(即引起异常的地址)xv6系统不支持交换机制。如果物理存储器被填充,你应该终止这个过程。(您将学习使用kalloc()和setkilled()函数)如果物理内存中有空闲空间,请将文件的一页映射到相应的vma。(mapfile()和mappages())//文件.c//读取一页文件以寻址mem//地图文件和readi中的off参数表示偏移//从应该开始读取操作的文件开始。无效映射文件(结构文件*f,字符*mem,int偏移量){//printf(“关闭%d\n”,偏移量);ilock(f->ip);readi(f->ip,0,(uint64)mem,offset,PGSIZE);iunlock(f->ip);}//vm.c//为从va开始的虚拟地址创建PTE,这些地址引用//以pa.va和size开头的物理地址可能不会//页面对齐。成功时返回0,如果walk()不能,则返回-1//分配所需的页面表页面。int映射页(pagetable_t pagetable,uint64-va,uint64 size,uint64-pa,int烫发){uint64 a,最后一个;pte_t*pte;如果(大小==0)panic(“mappages:size”);a=PGROUNDDOWN(va);last=PGROUNDDOWN(va+size-1);对于if((pte=walk(分页表,a,1))==0)return-1;如果(*pte和pte_V)panic(“mappages:remap”);*pte=PA2PTE(pa)|perm|pte_V;if(a==last)打破a+=PGSIZE;pa+=PGSIZE;}返回0;}结构“文件”“索引节点”将提供给您以供参考。当内存映射结束时,将调用filewrite()进行写回。即呼叫munmap或调用进程出口。类似于fileclose()。当访问文件的次数增加时,将调用filedup()。(mmap(),fork())//在fs.c中定义//从索引节点读取数据。//呼叫者必须持有ip->lock。//如果user_dst==1,则dst是用户虚拟地址;//否则,dst是内核地址。int readi(结构体inode*ip,int user_dst,uint6
4 dst,uint off,uint n);//将数据写入inode。//呼叫者必须持有ip->lock。//如果user_src==1,则src是用户虚拟地址;//否则,src是一个内核地址。//返回成功写入的字节数。//如果返回值小于所请求的n,//出现了某种错误。int writei(结构inode*ip,int user_src,uint6
4 src,uint off,uint n);//锁定给定的索引节点。//如有必要,从磁盘中读取索引节点。void ilock(结构索引节点*ip);//解锁给定的索引节点。void iunlock(结构inode*ip);处理页面错误时需要使用的函数,请注意readi()的工作方式并计算出应该发送给readi()的参数。如果您不知道readi()在做什么,请考虑read()或memcpy(),它们处理指针和地址。与writei()类似ilock()和iunlock()是inode的锁,用于确保内存的一致性。暗示您可以查看sys_open()来了解inode、文件和锁是如何工作的。(
TODO)VMA结构1//我们已经为您定义了VMA阵列的大小#定义VMASIZE 16//TODO:完成VMA的结构结构VMA{};2.3.4.5.6.解释VMA(虚拟内存区域)结构用于管理和跟踪以下内存区域映射到进程的地址空间。每个VMA代表一个连续的虚拟区域具有相同权限并由相同类型的对象支持的内存。这个操作系统需要跟踪这些映射,包括它们的起始位置、大小它们是,它们具有什么权限,以及它们与什么文件或设备相关联。这是vma结构的用途。实施跟踪mmap为每个流程映射的内容。定义与VMA(虚拟内存区域)相对应的结构,记录地址,mmap创建的虚拟内存范围的长度、权限、文件等。由于xv6内核中没有内存分配器,因此可以声明一个固定大小的VMA数组,并根据需要从该数组中进行分配。尺寸为16就足够了。我已经为您定义了VMASIZE)暗示看看什么参数将被发送到mmap()中。VMA应包含指向要映射的文件的结构文件的指针;如果您想在VMA中使用更多的变量来进一步实现,请随意使用它们。正确答案不止一个。(TODO)mmap()//在user.h中定义void*mmap(void*addr,size_t length,int prot,int flags,int fd,off_t抵消//TODO:在sysfile.c中执行的内核mmapuint64sys_mmap(无效){1.2.3.4.5.6.7.8.参数解释:在mmaptest.c中,我们调用'char*p=mmap(0,PGSIZE*2,PROT_READ,MAP_PRIVATE,fd,0);'。此调用要求内核映射文件“fd”的内容进入地址空间。第一个“0”参数指示内核应该选择虚拟地址(在本课业中,您可以假设“addr”将始终为零)。这个第二个参数“length”指示要映射的字节数。第三个论点“PROT_READ”表示映射的内存应为只读,即修改为不允许。第四个参数“MAP_PRIVATE”表示,如果进程修改映射内存,修改不应写回文件,也不应与共享映射同一文件的其他进程(当然,由于PROT_READ,更新是在这种情况下禁止)。第五个参数是要映射的文件的文件描述。最后一个参数“offset”是文件中的起始偏移量。返回值表示是否mmap成功与否。sys_xxx()函数是xxx()系统调用的内核实现。在xv6操作中在系统中,系统调用以sys_为前缀,以将其与其他函数区分开来,并用于指示它们是系统调用。内核函数argint、argaddr和argfd从陷阱帧中以整数、指针或文件的形式检索第n个系统调用参数描述符。请参阅参数获取部分。mmap的实现:在进程的地址空间中找到一个未使用的区域,以便映射文件,并将VMA添加到进程的映射区域表中。VMA应包含指向要映射的文件的结构文件的指针;mmap应该增加文件的引用计数,以便在关闭文件时结构不会消失(提示:请参阅filedup)。在mmap()实现后运行mmaptest:第一个mmap应该成功,但第一个对mmap-ed内存的访问将导致页面错误并终止mmaptest。 在mmap()实现之前 mmap()实现后出现页面错误(工作正常)页面错误示例进度图(TODO)PageFault句柄<xv6 book>第4.5、4.6章添加导致mmap ed区域出现页面故障的代码,以分配物理内存页面。通过故障地址查找相应的有效vma。在该页面上读取相关文件的4096字节,并将其映射到用户地址空间。使用readi读取文件,它采用一个偏移量参数来读取文件(但您将必须锁定/解锁传递给readi的inode)。在页面上正确设置权限。运行mmaptest;它应该到达第一个munmap。参见章节陷阱(TODO)munmap()实施munmap: 找到地址范围的VMA并取消映射指定的页面(提示:使用uvmunmap)。 如果munmap删除了前一个mmap的所有页面,它应该会减少引用计数对应结构文件的。 如果未映射的页面已被修改,并且文件已映射为MAP_SHARED,请写入页面返回到文件。从filewrite中寻找灵感。 理想情况下,您的实现只会写回程序实际上已修改。RISC-V PTE中的脏比特(D)指示页面是否已经被书面的但是,mmaptest不会检查是否未回写非脏页;因此,您可以在不看D位的情况下写回页面。//TODO:完成munmap()uint64sys_munmap(无效){}//在vm.c中定义void uvmunmap(pagetable_t pagetable,uint64-va,uint64-npages,int do_free);1.2.3.4.5.6.7.8.(TODO)页面对齐方式这是一个提醒,提醒您注意内核中的所有虚拟地址实现应该与页面对齐!保持这条规则的真实性非常重要实施也就是说,用PGROUNDUP或PGROUNDOWN将地址包装在不同的情况。你必须弄清楚该用哪一个。(额外优惠)叉柄在您的Assignment 1中,您应该已经知道fork()创建了一个子流程相同的信息。因此,您应该处理调用fork()时mmap()的工作方式。
确保子对象与父对象具有相同的映射区域。别忘了增加VMA的结构文件的引用计数。在子级的页面错误处理程序中,可以分配一个新的物理页面,而不是与父级共享页面。后者将是更酷,但这将需要更多的实现工作。分级规则课程第90部分+额外学分您可以在'~/cs3150下使用以下命令来测试代码的正确性-project3'目录。制作qemummaptest1.2.“make-qemu”打开xv6系统,您将看到您的终端以“$”开头。你可以执行“ls”命令以查看包括“mmaptest”在内的文件mmaptest命令执行可执行文件mmaptest来测试您的程序。您应具有以下输出$mmaptestmmap_test启动测试mmap f测试mmap f:OK测试mmap私有测试mmap私有:好测试mmap只读只读测试mmap:确定测试mmap读/写测试mmap读/写:OK测试mmap脏测试mmap脏:好测试未映射取消映射1.2.3.4.5.6.7.8.910111213测试未映射取消映射:确定测试mmap两个文件测试mmap两个文件:好测试mmap偏移测试mmap偏移:正常测试mmap半页测试mmap半页:好mmap_test:全部正常fork_test启动fork_test确定mmaptest:所有测试都成功1415161718192021222324mmap f 13pmmap私人5pmmap只读5pmmap读/写5pmmap脏5pmmap两个文件5p未映射取消映射12pmmap偏移5pmmap半页15p编译成功20pfork_test(额外学分)报告第10部分您应严格遵循提供的报告乳胶模板,我们强调重要部件和各自的分级细节。基于其他模板的报告将不会分级。LaTex编辑器为了方便起见,您可以使用在线LaTex编辑器Overleaf。1.创建一个新的空白项目。2.点击下面的高亮底部,上传我们提供的模板。3.单击“重新编译”,您将看到PDF格式的报告。
标签:文件,VMA,操作系统,映射,int,mmap,教学,CSC3150Unix,页面 From: https://www.cnblogs.com/meryo/p/18114104