首页 > 其他分享 >lab3 page tables

lab3 page tables

时间:2023-07-16 11:00:33浏览次数:37  
标签:tables return 映射 pagetable int PTE lab3 page 页面

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;
}

标签:tables,return,映射,pagetable,int,PTE,lab3,page,页面
From: https://www.cnblogs.com/dreamer-q/p/17517880.html

相关文章

  • Spartacus Product List Page ProductSearchPage Observable 对象的设计明细
    源代码如下:readonlymodel$:Observable<ProductSearchPage>=using(()=>this.searchByRouting$.subscribe(),()=>this.searchResults$).pipe(shareReplay({bufferSize:1,refCount:true}));上面这段代码是基于Angular框架和RxJS库的,RxJS是一个用于处理......
  • 什么是 SAP Spartacus 的 CMS Page Connector
    SAPSpartacus是一个开源的JavaScriptweb应用程序,它与SAPCommerceCloud的后端进行交互。这是一个基于Angular和RxJS的库,具有良好的扩展性,允许开发人员以模块化的方式创建和管理SAPCommerceCloud的用户界面。而CMSPageConnector是Spartacus提供的一种连接器,......
  • asp.net core identity tables
      SELECT*FROMdbo.AspNetUsers--hasdataSELECT*FROMdbo.AspNetUserLoginsSELECT*FROMdbo.AspNetUserRoles--hasdataSELECT*FROMdbo.AspNetUserTokensSELECT*FROMdbo.AspNetUserClaimsSELECT*FROMdbo.AspNetRoles--hasdataSELECT*FROMdbo.......
  • ubuntu20使用iptables-persistent libfakeroot libxtables-dev netfilter-persistent
    实施防火墙是保护服务器安全的重要一步。其中很大一部分是决定将对您的网络实施流量限制的单个规则和策略。像iptables这样的防火墙还允许您对应用规则的结构框架有发言权。在本指南中,您将学习如何构建防火墙,作为更复杂规则集的基础。该防火墙将主要关注提供合理的默认值和建立......
  • 转载:PageOffice既保存Word文件中指定区域的数据又保存整篇文件
    一、首先在word文件中给需要在后台获取数据的区域设置以PO_开头的书签。二、通过pageoffice在线打开文件并编辑保存。有两种打开文件的模式1、普通编辑模式(docNormalEdit)普通编辑模式就是简单的打开文件,分别设置SaveDataPage保存数据的方法和SaveFilePage保存文件的方法即可......
  • arptables
    arptables管理ARP包过滤规则表补充说明arptables命令用来设置、维护和检查Linux内核中的arp包过滤规则表。语法arptables(选项)选项-A:向规则链中追加规则;-D:从指定的链中删除规则;-l:向规则链中插入一条新的规则;-R:替换指定规则;-P:设置规则链的默认策略;-F:刷新指定规则链,......
  • Page001
    test_your_ncpw@pwn:~/Desktop$ncnode4.buuoj.cn29381catf*flag{80bfa2c9-25ff-4f51-9376-61ee8f577d02}rip如果是recvuntil("pleaseinput")会时间超时;因为此题出的比较草率,没有考虑关闭缓冲区,"pleaseinput"加入缓冲区之后并没有满,因此继续留在缓冲区即程序并没有输出......
  • 持久化iptables规则
    一、对iptables作必要的修改;二、将iptables规则保存到文件中:iptables-save>/etc/firewall.conf三、新建一个脚本/etc/network/if-up.d/import-iptables:#!/bin/shiptables-restore</etc/firewall.conf加上可执行权限:chmod+x/etc/network/if-up.d/import-iptabl......
  • 记一次扯dan的错误feign.FeignException$NotFound: status 404 reading UserFeign#fin
    feign.FeignException$NotFound:status404readingUserFeign#findByPage()atfeign.FeignException.clientErrorStatus(FeignException.java:165)~[feign-core-10.4.0.jar:na]atfeign.FeignException.errorStatus(FeignException.java:141)~[feign-core-10.4.0.jar:na......
  • 转载:用pageOffice控件实现 office word文档 编辑Word加水印的功能
    OA办公中,业务需要多人编辑word文档,需要加文字水印的功能。怎么实现word文档的编辑加文字水印呢?2实现方法通过pageOffice实现简单的在线打开编辑word时,通过设置doc.getWaterMark().setText("PageOffice开发平台");属性,给Word文档添加文字水印。就可以实现编辑word中增加水......