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的更多相关文章

  1. PatentTips - Substitute virtualized-memory page tables

    BACKGROUND Many computer systems utilize virtualized memory for security, stability and/or other pur ...

  2. PatentTips - Maintaining shadow page tables in a sequestered memory region

    BACKGROUND Malicious code, known as malware, which includes viruses, worms, adware, etc., may attack ...

  3. 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 ...

  4. linux thtree level page tables

    To translate a virtual address into a physical one, the CPU must take the contents of each level fie ...

  5. 页表 Page tables

    逻辑地址与物理地址的转化 页表是由页表项(PTE)组成的数组.512个PTE构成一个页表页(Page-table page). PTE中包含了物理页码(PPN physical page number ...

  6. Operating System Memory Management、Page Fault Exception、Cache Replacement Strategy Learning、LRU Algorithm

    目录 . 引言 . 页表 . 结构化内存管理 . 物理内存的管理 . SLAB分配器 . 处理器高速缓存和TLB控制 . 内存管理的概念 . 内存覆盖与内存交换 . 内存连续分配管理方式 . 内存非连 ...

  7. Virtual Memory PAGE TABLE STRUCTURE

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION The basic mechanism f ...

  8. Understanding page frames and pages

    Memory in Linux is organized in the form of pages (typically 4 KB in size). Contiguous linear addres ...

  9. fork(2) - Linux man page

    fork(2): create child process - Linux man page https://linux.die.net/man/2/fork fork(2) - Linux man ...

  10. 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 ...

随机推荐

  1. Promise规范与原理解析

    摘要 Promise对象用于清晰的处理异步任务的完成,返回最终的结果值,本次分享主要介绍Promise的基本属性以及Promise内部的基础实现,能够帮我们更明确使用场景.更快速定位问题. Promi ...

  2. Pycharm 2022 取消双击 shift 搜索框

    Pycharm取消双击shift搜索框 基于PyCharm 2022.3.2 (Professional Edition),旧版本修改方式自行搜索 双击shift弹出搜索框,输入内容double mo ...

  3. [ARC168E] Subsegments with Large Sums

    题目链接 看到严格选 \(k\) 个,不难想到 WQS二分.定义 \(f(x)\) 为分成 \(x\) 段,最多有多少个超过 \(S\) 的.然后你会发现他不是凸的.因为他有很多平段,比如把两个很小的 ...

  4. [ICPC2014 WF] Pachinko

    [ICPC2014 WF] Pachinko 题面翻译 题目描述 有一个宽度为 \(w\) 高度为 \(h\) 的方格纸, $ w \times h$ 的格子中,有一些是空的,有一些是洞,有一些是障碍 ...

  5. BigQuant*中金财富“启明星”创新量化交易大赛开启,月月都拿奖

    来量化比赛,赢万元大奖!! 比赛时间 2022年8月1日-2023年3月31日 比赛地址 启明星创新量化交易大赛 比赛简介 BigQuant与中金财富联合举办的创新量化交易大塞正式启动了! 本次大赛旨 ...

  6. 切换容器引擎为containerd

    确保模块载入: # 永久生效 cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf overlay br_netfilter E ...

  7. Scrapy如何在启动时向爬虫传递参数

    高级方法: 一般方法: 运行爬虫时使用-a传递参数 scrapy crawl 爬虫名 -a key=values 然后在爬虫类的__init__魔法方法中获取kwargs class Bang123S ...

  8. 算法2:Hanoi塔

    汉诺(Hanoi)塔 一.背景介绍 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了 ...

  9. 万界星空科技MES系统中的生产调度流程

      MES系统生产调度的目标是达到作业有序.协调.可控和高效的运行效果,作业计划的快速生成以及面向生产扰动事件的快速响应处理是生产调度系统的核心和关键. 为了顺利生成作业计划,需要为调度系统提供完整的 ...

  10. 好玩、有趣的 Linux 命令学习神器 kmdr!

    大家好,我是你们的民工哥. 所有学习Linux系统的初学者都知道,入门时除了简单的系统知识需要了解之外,其次,最重要的就是学习与理解Linux命令的用法与其应用场景. 所以,大家也会遇到这样的情况,不 ...