对于页表硬件,O/S可以使用许多巧妙的技术之一是用户空间堆栈内存的懒惰分布。XV6应用程序使用系统来调用内核请求堆栈内存。在给定的内核中,分配物理内存并映射它在该过程的虚拟地址空间上。内核可能需要很长时间才能进行大规模请求分配和映射内存。例如,GB包含262144 4096字节,这是大量配置。加法,某些过程分配了一些过程内存比实际使用(例如,要实现稀疏指标),或分配更多内存以更好地使用。为了使任务在这些情况下更快地完成任务,复杂的内核将暂时分配用户内存。它不是分配物理内存,而只记住分配了哪个用户地址,并且该地址在用户页面表中标记为无效。当该过程尝试首次使用任何给定的惰性分配记忆页面时,CPU将产生页面错误。内核可以通过分配物理内存,清除和映射来处理此错误。在本实验中,您需要将此懒惰的分布特性添加到XV6中。
在实验室之前,您需要阅读Chap4.6和相关文件:
切换到LAB5分支:
要求:
修改后,启动XV6并在中间输入。您应该看到这样的东西:
“:...”消息来自用户的处理程序;它捕获了一个不知道如何处理的异常。请确保您了解为什么出现错误时。指示错误页面为0x4008的虚拟地址
代码:
启动XV6和输入后,将获得以下输出:
要求:
暗示:
如果一切顺利,您的懒惰分配代码应该使工作。
代码:
同时,由于懒惰分配,不使用部分分配的地址空间,因此页面表中不会有映射。调用呼叫后,需要对其进行修改:
测试:
输入,您可以得到:
在XV6用户程序中,某些可能导致惰性内存分布压力的特定情况。修改内核代码,以便所有惯性测试和用户测试都可以通过。
暗示:
如果生成以下输出,则意味着它已通过:
代码:
首先修改函数,当参数为负时,立即释放空间:
然后,在修改中的功能,添加判断条件:1。如果虚拟内存地址高于SBRK分配的任何虚拟地址,则终止过程2.如果是保护页面上的错误,则应终止该过程:
修改过程中调用的功能。当将用户内存从父进程复制到子进程时,如果未分配父进程中的某些内存,则不应在复制过程中报告错误:
修改中的功能,用于该功能(他们称为功能),用于从用户空间虚拟地址读取数据,并从用户空间的虚拟地址写入数据。如果未分配虚拟地址,则会发生错误;对于函数,该函数也将被调用;对于中间功能,也将调用该功能,因此您应该修改它(请注意,请注意判断中的哪些情况可能是懒惰的分配(或),并分配一个新的物理页面。此时,此时,目前,应直接返回新的物理页面的本周地址)(请注意,该过程应用程序的地址范围为$ [0,p-> sz)$):
测试:
总体测试:
原始:https://juejin.cn/post/7100016969264398366
