qq_57191189 2021-05-26 11:27
浏览 10

内存分配和地址空间有个习题,预算300能做的我把文件发一下

展示 xv6 用于将内核映射到每个进程的虚拟地址空间的页表(绘制页表图并 解释页表项)。专注页表中的一个条目,该条目负责翻译内核第一页。请记住, xv6 将内核映射到虚拟内存 2G 以上的虚拟地址范围。 请注意 xv6 完成引导后, 它会使用普通的 4KB、32 位及二级页表。我们还必须调出第一个内核页面的物 理地址,以及该页面所映射的虚拟地址。为了使该示例更实际,请不要忘记 xv6 为它的页表目录和内核内存分配器中的页表分配内存。 2.深入分析 exec 系统调用的实现过程,并作出详细的代码研究与分析报告。 3.改变内存布局 xv6 地址空间的布局如图 4.11 所示。我们希望重新排列 xv6 地址空间,使其 看起来更像 Linux 的地址布局,如图 4.13 所示。 页目录 页表 页表 4K 页内偏移 页表项(PTE) 段描述符 页目录项(PDX) 分页 + 陈鹏 chenpeng@blcu.edu.cn 0x80000000 KERNBASE 栈 堆 用户文本 与数据 0 图 4.13 内存布局的修改 我们可以在 memlayout.h 中看到内核内存的一般映射。用户存储器从 0 开始, 升至 KERNBASE。请注意,我们根本不会更改内核内存布局,而只会更改用户 内存布局 现在,程序内存映射取决于我们如何将程序加载到内存中并设置页表(以便 它们指向正确的物理页)。所有这些都在 exec.c 中作为 exec 系统调用的一部分实 现,其中使用 vm.c 中实现虚拟内存作为支持。要更改内存布局,我们必须更改 exec 代码以加载程序并以我们想要的新方式分配栈。 将栈向上移提供了允许其增长的空间,但这会使某些事情变得复杂。例如, 现在 xv6 使用一个值(sz)跟踪虚拟地址空间的末尾。现在我们必须保留更多信 息,例如用户内存底部的末尾(即堆的顶部,在 unix 中称为 brk)以及栈的底部。 一旦我们在 exec.c 中找到了 xv6 分配和初始化用户栈的位置,然后我们将必 须弄清楚如何进行更改以在 xv6 用户地址空间的最高部分使用一页,而不是在代 码和堆之间使用页面。 一些棘手的部分:再次强调:我们必须非常小心的一件事是 xv6 当前如何跟 踪进程地址空间的大小(当前使用 proc 结构中的 sz 字段)。在代码中有很多地方 可以使用它(例如,检查传递给内核的参数是否有效;复制地址空间)。我们建 议保留此字段以跟踪代码和堆的大小,但建议执行其他一些记帐以跟踪栈,并更 改所有相关代码(即用于处理 sz 的代码)以现在可以使用新记帐。

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 matlab(相关搜索:紧聚焦)
    • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
    • ¥15 路易威登官网 里边的参数逆向
    • ¥15 Arduino无法同时连接多个hx711模块,如何解决?
    • ¥50 需求一个up主付费课程
    • ¥20 模型在y分布之外的数据上预测能力不好如何解决
    • ¥15 processing提取音乐节奏
    • ¥15 gg加速器加速游戏时,提示不是x86架构
    • ¥15 python按要求编写程序
    • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入