mit 6.s081 lab3 page tables

2024-03-11 06:32
文章标签 page lab3 mit s081 tables

本文主要是介绍mit 6.s081 lab3 page tables,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

chapter 3
Print a page table

这个exercise的内容为打印page table,需要实现一个打印函数vmprint,参数为pagetable_t,传入根页表地址,打印对应的pagetable。在这个exercise中只需要打印init进程的pagetable,所以需要在exec函数(exec.c)中添加对进程的pid的判断,如果pid为1,打印该进程的pagetable
打印的例子:

page table 0x0000000087f6e000
..0: pte 0x0000000021fda801 pa 0x0000000087f6a000
.. ..0: pte 0x0000000021fda401 pa 0x0000000087f69000
.. .. ..0: pte 0x0000000021fdac1f pa 0x0000000087f6b000
.. .. ..1: pte 0x0000000021fda00f pa 0x0000000087f68000
.. .. ..2: pte 0x0000000021fd9c1f pa 0x0000000087f67000
..255: pte 0x0000000021fdb401 pa 0x0000000087f6d000
.. ..511: pte 0x0000000021fdb001 pa 0x0000000087f6c000
.. .. ..510: pte 0x0000000021fdd807 pa 0x0000000087f76000
.. .. ..511: pte 0x0000000020001c0b pa 0x0000000080007000

…的数量与页表的level相同,然后是pte在pagetable的index,pte的内容和pa的内容

  • 对于pagetable中pte只打印有效的pte(PTE_V位为1),打印三级页表的内容
  • pte到pa的转换使用PTE2PA进行转换,pte和pa的差别实际上就是pa中的offset的位数(12 bits)和pte中flag的位数(10 bits)不同,以及每个页表的offset部分都为0
void vmprint_walk(pagetable_t pagetable, int depth) {for (int i = 0; i < 512; i++) {if (((pte_t)pagetable[i] & PTE_V) == 0)continue;for (int j = 0; j < depth; j++) {if (j == depth - 1)printf("..");elseprintf(".. ");}printf("%d: pte %p pa %p\n", i, (pte_t)pagetable[i], PTE2PA((pte_t)pagetable[i]));if (depth < 3)vmprint_walk((pagetable_t)PTE2PA((pte_t)pagetable[i]), depth + 1);}
}void vmprint(pagetable_t pagetable) {printf("page table %p\n", pagetable);vmprint_walk(pagetable, 1);
}
A kernel page table per process

在这个exercise中所需要完成的任务为每个process添加一个独立的kernel page table。
在目前的实现中,在kernel space所使用的pagetable都是在vm.c中声明的kernel_pagetable,在这个exercise中需要为每个process添加一个kernel_pagetable的拷贝,并且在进入到kernel space后使用process中的kernel pagetable。
因此在proc结构体中添加一个变量pagetable_t kpagetable,记录kernel pagetable。每个process的kpageble映射除了kernel stack外与global kernel pagetable一致,具体映射查看kvminit函数。除了kvminit中建立的映射外,还需要在kpagetable需要对对应的process的kernel stack进行映射。在procinit函数中,会为每个process分配一个kernel stack,每个kernel stack的大小为4096 bytes,并且在global kernel pagetable中建立对应的映射。因此在创建process时(allocproc函数),需要为kpagetable分配内存,建立kvminit中的映射关系,并且为kstack增加映射(不需要重新分配kernel stack的内存)。
在进行进程调度时,需要将原来的kvminithart(将satp设为global page table)替换为将satp设置为process中的kpagetable
当process运行结束释放proc时需要删除对应的kpagetable,但不删除kpagetable最终指向的物理内存(叶子节点)

1.在struct proc中添加kpagetable
proc.h

struct proc {
....
pagetable_t kpagetable; // Kernel page table 
....
}

2.创建一个kernel pagetable
vm.c

// 创建一个kernel pagetable
pagetable_t kvmcreate() {pagetable_t kpagetable = (pagetable_t) kalloc();

这篇关于mit 6.s081 lab3 page tables的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/796944

相关文章

vue中路由管理(vue-router,page)使用总结

现在的项目都以模块化的方式去开发,所以在这样的开发模式下,如何更好的去管理路由是开发中所需要考虑的重点,幸运的是当前的开发中已经有了成熟的中间件去管理,我们只需要用就可以了 下面是我在学习vue-router的时候在原来基础上修改出来的demo,也是为了有助于对vue-router的理解 首先理解下vue官网的一个示例demo https://jsfiddle.net/yyx990803/x

【0323】Postgres内核之 hash table sequentially search(seq_scan_tables、num_seq_scans)

0. seq scan tracking 我们在这里跟踪活跃的 hash_seq_search() 扫描。 需要这种机制是因为如果扫描正在进行时发生桶分裂(bucket split),它可能会访问两次相同的条目,甚至完全错过某些条目(如果它正在访问同一个分裂的桶中的条目)。因此,如果正在向表中插入数据,我们希望抑制桶分裂。 在当前的使用中,这种情况非常罕见,因此只需将分裂推迟到下一次插入即可。

编程语言之争:Rust 社区活跃开发者 Ed Page 谈 Rust 与 C++ 的未来

作者 | Annie Xu 采访 | CSDN&Boolan 首席顾问 卢威 责编 | 何苗 出品丨GOSIM 开源创新汇 你最 pick 哪种编程语言?C++、Rust,还是 Python? Ed Page 从事编程行业十几年,见证了不同编程语言的兴衰史。从 C++标准版本 C++98 的诞生,到 Jave、D、Go 等编程语言的崛起与发展,并跃跃欲试想挑战 C++ 的江湖

Page directive: illegal to have multiple occurrences of contentType with different values (x,X)之解

Question: Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html; charset=utf-8, new: text/html;charset=UTF-8) Analysis: 出现这个的原因是这两个jsp的contentT

Kafka【五】Buffer Cache (缓冲区缓存)、Page Cache (页缓存)和零拷贝技术

【1】Buffer Cache (缓冲区缓存) 在Linux操作系统中,Buffer Cache(缓冲区缓存)是内核用来优化对块设备(如磁盘)读写操作的一种机制(故而有一种说法叫做块缓存)。尽管在较新的Linux内核版本中,Buffer Cache和Page Cache已经被整合在一起,但在理解历史背景和功能时,了解Buffer Cache仍然很有帮助。 Buffer Cache 的历史和定义

代码开源许可证傻傻分不清 Apache MIT GPL的区别

https://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html

HarmonyOS开发详解(四)——鸿蒙Page Ability功能及UI界面开发详解

HarmonyOS里面的界面通过Page Ability和Java UI一起来实现;讲述Page Ability就离不开Ability。在HarmonyOS里面把各种具备的能力进行抽象,叫做Ability;Ability是程序重要的组成部分;鸿蒙的各种功能、能力都是通过Ability展现,可以说开发鸿蒙应用就离不开Ability。本文将详细讲解Page Ability相关的应用和案

微信小程序开发(四)注册页面 page.js

注册小程序时我们在app.json配置文件里通过pages注册过各个页面 "pages" :[ "pages/index/index" , "pages/logs/logs" ], 每一个页面对应自己的一系列相关文件如index,包括 index.wxml(view层)、index.js(逻辑层contral)、index.wxss(样式文件)

MIT 6.5940 EfficientML.ai Fall 2023: Lab 1 Pruning

EfficientML.ai Lec 3 - Pruning and Sparsity (Part I) MIT 6.5940, Fall 2023, Zoom 本文是EfficientML.ai Fall 2023课程作业1练习答案,在本次练习里将会对经典的分类神经网络进行剪枝处理,减少模型大小和延迟。The goals of this assignment are as fo

MIT的10门免费线上课,YYDS!

大家好,我是小书童! 今天给大家推荐10门 MIT 线上课程,无需付费,千万不要错过,抓紧学习起来。 1、计算机科学和Python编程简介 通过这个课程,将会学习到 计算的概念Python编程语言一些简单的算法测试和调试算法复杂性的非正式介绍数据结构 课程链接: https://www.edx.org/learn/computer-science/massachusetts-institut