MIT6.828 Lab2: Challenge

这篇博客介绍了MIT6.828实验的挑战部分,涉及大页机制的实现、内存映射命令的编写,如showmapping、setpri和dump。还探讨了用户态4G虚拟地址的可用设计方案,以及内核连续物理页的分配策略,讨论了各自的优缺点和实现思路。
摘要由CSDN通过智能技术生成

Challenge 1:大页机制的实现
  需要了解PTE_PS位的作用以及修改内存分布的代码,没有仔细去研究实现,等以后深入到linux内核中的大页机制时再补充。

Challenge 2:
  showmapping、dump等命令的实现。
  回答:
  在实现之前为了提供更好的命令交互,修改了一下command结构体和help命令,修改代码如下:

//monitor.c
struct Command {
    const char *name;
    const char *desc;
    const char *usage;
    // return -1 to force monitor to exit
    int (*func)(int argc, char** argv, struct Trapframe* tf);
};

int
mon_help(int argc, char **argv, struct Trapframe *tf)
{
    int i;

    if (argc == 2) {
        for (i = 0; i < NCOMMANDS; i++)
            if (strcmp(argv[1], commands[i].name) == 0)
                break;
            if (i >= NCOMMANDS)
                cprintf("Command \"%s\" hasn't been implemented!\n", argv[1]);
            else
                cprintf("%s\nUsage: %s\n", commands[i].desc, commands[i].usage);
    }
    else {
        for (i = 0; i < NCOMMANDS; i++)
        cprintf("%s - %s\n", commands[i].name, commands[i].desc);
    }
    return 0;
}

  针对参数错误,添加错误检查的宏:

//kern/monitor.c
#define TESTERR(a)  {
   if(a)  goto ERR;}

  showmapping的实现思路:
  1.命令格式为showmapping [begin] [end]
  2.将begin和end转换为页对齐
  3.使用page_lookup函数查找虚拟地址对应的物理页
  4.输出物理页相关信息包括权限位情况
  实现代码如下:

//kern/pmap.h
static inline char*
pagepri2str(pte_t pte, char *buf)
{
    int i;
    static const char *str[] = { "_________SR_", "AVLGPDACTUWP" };

    for (i = 0; i < 12; i++)
        buf[i] = str[pte >> (11 - i) & 0x1][i];
    buf[i] = '\0';

    return buf;
}

//kern/monitor.c
int
mon_showmapping(int argc, char **argv, struct Trapframe *tf)
{
    uint32_t begin, end;
    char *endptrb, *endptre;

    if (argc == 2) {  //showmapping [begin, begin+PGSIZE]
        begin = ROUNDDOWN((uint32_t) strtol(argv[1], &endptrb, 0), PGSIZE);
        end = begin + PGSIZE;
        TESTERR(*endptrb != '\0');
    }
    else if (argc == 3) {   //showmapping [begin, end]
        begin = ROUNDDOWN((uint32_t) strtol(argv[1], &endptrb, 0), PGSIZE);
        end = ROUNDUP((uint
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值