lab3 page tables
1.Speed up system calls (easy)
要求:有些操作系统(例如 Linux)通过在用户空间和内核之间的只读区域共享数据来加速某些系统调用。这样可以消除在执行这些系统调用时进行内核交叉的需要(以优化用户模式到内核模式的陷阱机制,对于某些系统调用不再需要切换模式)。第一个任务是为 xv6中的 getpid ()系统调用实现这种优化,进程id不会被轻易改变,但是需要经常获取,为优化其操作,我们应该将这个id放到这片区域中。
测试:创建每个进程时,在 USYSCALL (memlayout.h 中定义的 VA)上映射一个只读页面。在这个页面的开始,存储一个 struct usyscall (也在 memlayout.h 中定义) ,并初始化它以存储当前进程的 PID。对于这个实验,ugetpid ()已经在用户空间端提供,并将自动使用 USYSCALL 映射。如果在运行 pgtbltest 时 ugetpid 测试用例通过,该功能成功实现。
一些提示:
- 在kernel/proc.c的proc_pagetable() 来实现映射
- 在allocproc()中分配和初始化页面
- 要记得在freeproc()中释放页面
- 该内存页的权限应该是只读的
- 要注意到mappages()是一个很有用的函数
实现:
首先根据第一条提示来实现虚拟内存页的映射关系,在proc_pagetable()中可以看到它已经对蹦床页面(trampoline page)和trapframe实现了映射,则仿照其映射方式,添加一个只读的映射关系:

我们还需要在proc.h中添加对于usyscall结构体的声明,而另外添加的uvmunmap(在vm.c中可看到相关的实现和解释)是在添加失败的时候需要将pagetable中的映射关系也进行删除
然后到allocproc中进行分配和初始化页面的操作,初始化就是把pid传给usyscall结构体

最后就是在freeproc中仿照trapframe让p->usyscall指向0,并在proc_freepagetable中对物理内存进行释放


测试结果如下:

2 Print a page table (easy)
目的:为了帮助可视化 RISC-V 页表,也许还有助于将来的调试,第二个任务是编写一个函数来打印页表的内容。
定义一个名为 vmprint ()的函数。它有一个pagetable_t参数,并按照下面描述的格式打印该页面。在Exec.c中返回argc之前插入if(p->pid == 1) vmprint (p-> pagetable) ,来打印第一个进程的页表。

第一行显示 vmprint 的参数。之后,每个 PTE 都有一行,包括引用树中更深层的页表页面的 PTE。每条 PTE 线都缩进了一些”.."表示它在树中的深度。每个 PTE 行在其页表页中显示 PTE 索引、 PTE 位和从 PTE 中提取的物理地址。不需要打印无效的 PTE。在上面的示例中,顶级页表页面具有条目0和255的映射。条目0的下一个级别只映射了索引0,而该索引0的底层则映射了条目0、1和2。
您的代码可能会发出与上面所示的不同的物理地址。条目的数量和虚拟地址应该是相同的。
一些提示:
- vmprint()函数应该放在kernel/vm.c中
- 记得使用kernel/riscv.h末尾定义的宏
- freewalk函数是有用的
- 在 kernel/defs.h 中定义 vmprint 的原型,以便从 Exec.c 调用它
- 在 printf 调用中使用% p 可以打印出完整的64位十六进制 PTE 和地址,如示例所示。
实现:参考freewalk函数,其实就是dfs,代码如下

3 Detecting which pages have been accessed (hard)
目的:添加一个新特性,来检查页表页是否被访问过,并返回相关的信息。
实现pgaccess ()系统调用 ,这是一个报告已访问哪些页面的系统调用。系统调用接受三个参数。首先,它使用第一个用户页面的起始虚拟地址进行检查。其次,它需要检查的页数。最后,它将用户地址存储到缓冲区中,以便将结果存储到位掩码中(一种数据结构,每页使用一位,其中第一页对应于最低有效位)。如果 pgaccess 测试用例在运行 pgtbltest 时通过,则实验成功。
提示:
- 在 kernel/sysproc.c 中来实现 sys_pgaccess ()
- 需要使用 argaddr ()和 argint ()来解析参数
- 对于输出位掩码,在内核中存储一个临时缓冲区并在用正确的位填充之后将其复制到用户(通过 copy out ())更容易
- 对可扫描的页数应该有一个上限
- Kernel/vm.c 中的 walk ()用于查找正确的PTE(即完成地址的映射)
- 在 kernel/riscv.h 中定义 PTE _ A,即访问位,查看RISC-V手册来确定其值
- 确保在检查 PTE _ A 是否设置后清除它。否则,无法确定自从上次调用 pgaccess ()以来是否访问了页面
- vmprint ()在调试页表时可以派上用场
- 记得关注pgtbltest.c,它来测试我们的函数
实现:
int
sys_pgaccess(void)
{
// lab pgtbl: your code here.
//接收地址
uint64 addr;
if(argaddr(0, &addr) < 0)
return -1;
//接收页数参数
int len;
if(argint(1, &len) < 0)
return -1;
//接收掩码
int bitmask;
if(argint(2, &bitmask) < 0)
return -1;
if(len > 32 ||len < 0)
return -1;
int res=0;
struct proc *p = myproc();
for(int i = 0; i < len; i++){
int va = addr+i * PGSIZE;
int abit = vm_pgacess(p->pagetable, va);
res = res | abit << i;
}
if(copyout(p->pagetable, bitmask, (char*)&res, sizeof(res)) < 0){
return -1;
}
return 0;
}
pgacess实现
int vm_pgacess(pagetable_t pagetable, uint64 va)
{
pte_t *pte;
if(va >= MAXVA)
return 0;
pte = walk(pagetable, va, 0);
if(pte == 0)
return 0;
if((*pte & PTE_A) != 0){
*pte = *pte & (~PTE_A);
return 1;
}
return 0;
}

lab3 page tables的更多相关文章
- PatentTips - Substitute virtualized-memory page tables
BACKGROUND Many computer systems utilize virtualized memory for security, stability and/or other pur ...
- PatentTips - Maintaining shadow page tables in a sequestered memory region
BACKGROUND Malicious code, known as malware, which includes viruses, worms, adware, etc., may attack ...
- Extended paging tables to map guest physical memory addresses from virtual memory page tables to host physical memory addresses in a virtual machine system
A processor including a virtualization system of the processor with a memory virtualization support ...
- linux thtree level page tables
To translate a virtual address into a physical one, the CPU must take the contents of each level fie ...
- 页表 Page tables
逻辑地址与物理地址的转化 页表是由页表项(PTE)组成的数组.512个PTE构成一个页表页(Page-table page). PTE中包含了物理页码(PPN physical page number ...
- Operating System Memory Management、Page Fault Exception、Cache Replacement Strategy Learning、LRU Algorithm
目录 . 引言 . 页表 . 结构化内存管理 . 物理内存的管理 . SLAB分配器 . 处理器高速缓存和TLB控制 . 内存管理的概念 . 内存覆盖与内存交换 . 内存连续分配管理方式 . 内存非连 ...
- Virtual Memory PAGE TABLE STRUCTURE
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION The basic mechanism f ...
- Understanding page frames and pages
Memory in Linux is organized in the form of pages (typically 4 KB in size). Contiguous linear addres ...
- fork(2) - Linux man page
fork(2): create child process - Linux man page https://linux.die.net/man/2/fork fork(2) - Linux man ...
- System and method to prioritize large memory page allocation in virtualized systems
The prioritization of large memory page mapping is a function of the access bits in the L1 page tabl ...
随机推荐
- The 2021 ICPC Asia Regionals Online Contest (II) L Euler Function
思路来源:Zed222 如果一个区间里的数都有这个质数,那么我们就直接利用性质\(\phi(n * p) = \phi(n) * p\),如果没有这个区间中有没有这个质数的,那么就退化到了单点修改,当 ...
- Python 潮流周刊#27:应该如何处理程序的错误?
你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.本周刊开源,欢迎投稿.另有电报频道作为副刊,补充发布更加丰富的资讯. 产品推荐 Walles.AI 是一款适用于所 ...
- 大立科技DM63红外相机SDK开发Ⅱ-获取仪器红外图像
目录 1.开发准备 2.导入头文件 3.数据初始化 4.获取红外图像 5.关闭红外图像 6.完整代码 1.开发准备 为了方便发开,需要下载Visual Studio,本开发基于Visual Studi ...
- C语言输入一行字符,分别统计出其中英文字母、空格、数字与其它字符得个数。
#include<stdio.h> void main() { char c; int letter = 0, space = 0, digit = 0, other = 0; print ...
- 一套开源、强大且美观的WPF UI控件库 - HandyControl
前言 今天给大家推荐一套开源.强大且美观的WPF UI控件库:HandyControl. WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windows 应用.它提供了灵 ...
- 关于微信小程序中如何实现数据可视化-echarts动态渲染
移动端设备中,难免会涉及到数据的可视化展示.数据统计等等,本篇主要讲解原生微信小程序中嵌入echarts并进行动态渲染,实现数据可视化功能. 基础使用 首先在GitHub上下载echarts包 地址: ...
- keil 4 安装教程
一.下载 keil 官网 二.安装教程 1.开始安装 双击安装包,开始安装,直接下一步. 2.勾选同意,下一步 3.选择软件安装路径,下一步 4.填写信息 可以随意填写,下一步. 5.等待安装 6.安 ...
- linux 上安装kapacitor
转载请注明出处: 1.通过安装包安装 1.使用以下命令下载安装包: wget https://dl.influxdata.com/kapacitor/releases/kapacitor_1.6.3- ...
- MyBatis高频面试题
1.MyBatis中使用#和$书写占位符有什么区别? 2.Hibernate 与 Mybatis区别(MyBatis与Hibernate有什么不同). 3.持久层设计要考虑的问题有哪些? 4.你用过的 ...
- BFS(三)单词接龙 ⅱ
对应 126. 单词接龙 II 问题描述 按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> ...