当前位置: 首页 > 网络应用技术

MIT6.S081 LAB5:懒惰分配

时间:2023-03-08 15:35:40 网络应用技术

  对于页表硬件,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