📄 monitor.c
字号:
// Simple command-line kernel monitor useful for// controlling the kernel and exploring the system interactively.#include <inc/stdio.h>#include <inc/string.h>#include <inc/memlayout.h>#include <inc/assert.h>#include <inc/x86.h>#include <kern/console.h>#include <kern/monitor.h>#include <kern/trap.h>#include <kern/kdebug.h>#define CMDBUF_SIZE 80 // enough for one VGA text linestruct Command { const char *name; const char *desc; // return -1 to force monitor to exit int (*func)(int argc, char** argv, struct Trapframe* tf);};static struct Command commands[] = { { "help", "Display this list of commands", mon_help }, { "kerninfo", "Display information about the kernel", mon_kerninfo }, { "backtrace", "Display a listing of function call frames",mon_backtrace}};#define NCOMMANDS (sizeof(commands)/sizeof(commands[0]))unsigned read_eip();/***** Implementations of basic kernel monitor commands *****/intmon_help(int argc, char **argv, struct Trapframe *tf){ int i; for (i = 0; i < NCOMMANDS; i++) cprintf("%s - %s\n", commands[i].name, commands[i].desc); return 0;}intmon_kerninfo(int argc, char **argv, struct Trapframe *tf){ extern char _start[], etext[], edata[], end[]; cprintf("Special kernel symbols:\n"); cprintf(" _start %08x (virt) %08x (phys)\n", _start, _start - KERNBASE); cprintf(" etext %08x (virt) %08x (phys)\n", etext, etext - KERNBASE); cprintf(" edata %08x (virt) %08x (phys)\n", edata, edata - KERNBASE); cprintf(" end %08x (virt) %08x (phys)\n", end, end - KERNBASE); cprintf("Kernel executable memory footprint: %dKB\n", (end-_start+1023)/1024); return 0;}intmon_backtrace(int argc, char **argv, struct Trapframe *tf){// Your code here. // Your code here. uint32_t ebp=read_ebp(); uint32_t eip=read_eip(); //uint32_t esp=read_esp(); struct Eipdebuginfo info; int i=0; char *name; uint32_t param1,param2,param3,param4,param5; cprintf("Stack backtrace:\n"); while(ebp!=0) { __asm __volatile("movl 8(%1), %0" : "=r" (param1):"g"(ebp)); __asm __volatile("movl 12(%1), %0" : "=r" (param2):"g"(ebp)); __asm __volatile("movl 16(%1), %0" : "=r"(param3):"g"(ebp)); __asm __volatile("movl 20(%1), %0" : "=r"(param4):"g"(ebp)); __asm __volatile("movl 24(%1), %0" : "=r"(param5):"g"(ebp)); debuginfo_eip(eip, &info); cprintf("%s:%d ",info.eip_file,info.eip_line); for(i=0;i<info.eip_fn_namelen;i++) cprintf("%c",*(info.eip_fn_name+i)); //cprintf("+%x %d\n",eip-info.eip_fn_addr,info.eip_fn_narg); cprintf("+%x \n",eip-info.eip_fn_addr); cprintf("ebp %08x eip %08x args %08x %08x %08x %08x %08x\n",ebp,eip,param1,param2,param3,param4,param5); uint32_t tempebp; __asm __volatile("movl (%1), %0" : "=r" (tempebp):"r"(ebp)); __asm __volatile("movl 4(%1), %0" : "=r" (eip):"r"(ebp)); ebp=tempebp; } return 0;}/***** Kernel monitor command interpreter *****/#define WHITESPACE "\t\r\n "#define MAXARGS 16static intruncmd(char *buf, struct Trapframe *tf){ int argc; char *argv[MAXARGS]; int i; // Parse the command buffer into whitespace-separated arguments argc = 0; argv[argc] = 0; while (1) { // gobble whitespace while (*buf && strchr(WHITESPACE, *buf)) *buf++ = 0; if (*buf == 0) break; // save and scan past next arg if (argc == MAXARGS-1) { cprintf("Too many arguments (max %d)\n", MAXARGS); return 0; } argv[argc++] = buf; while (*buf && !strchr(WHITESPACE, *buf)) buf++; } argv[argc] = 0; // Lookup and invoke the command if (argc == 0) return 0; for (i = 0; i < NCOMMANDS; i++) { if (strcmp(argv[0], commands[i].name) == 0) return commands[i].func(argc, argv, tf); } cprintf("Unknown command '%s'\n", argv[0]); return 0;}voidmonitor(struct Trapframe *tf){ char *buf; cprintf("Welcome to the JOS kernel monitor!\n"); cprintf("Type 'help' for a list of commands.\n"); if (tf != NULL) print_trapframe(tf); while (1) { buf = readline("K> "); if (buf != NULL) if (runcmd(buf, tf) < 0) break; }}// return EIP of caller.// does not work if inlined.// putting at the end of the file seems to prevent inlining.unsignedread_eip(){ uint32_t callerpc; __asm __volatile("movl 4(%%ebp), %0" : "=r" (callerpc)); return callerpc;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -