⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 monitor.c~

📁 jos lab3代码
💻 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 + -