Challenge"/>
MIT6.828 Lab2: Challenge
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 exitint (*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]);elsecprintf("%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
更多推荐
MIT6.828 Lab2: Challenge
发布评论