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

📄 debug.c

📁 一个类linux的dos下开发的操作系统.
💻 C
字号:
/*****************************************************************************
DEBUG ROUTINES

EXPORTS:
void dump_stack_frame(unsigned curr_ebp, unsigned max_ebp);
void dump(unsigned char *data, unsigned count);
void dump_regs(regs_t *regs);
void dump_task(task_t *task);
void dump_page_tables(unsigned long *page_dir);
*****************************************************************************/
#include <krnl.h> /* task_t, regs_t, unsigned long, kprintf() */

/* IMPORTS
from MAIN.C */
void kprintf(const char *fmt, ...);
/*****************************************************************************
*****************************************************************************/
void dump_stack_frame(unsigned curr_ebp, unsigned max_ebp)
{
	unsigned *esp;

	kprintf("return addresses from stack frames:\n");
	while(curr_ebp < max_ebp)
	{
		esp = (unsigned *)curr_ebp;	/* mov esp,ebp */
		curr_ebp = *esp++;		/* pop ebp */
		kprintf("%08X  ", *esp);	/* return EIP at [esp + 0] */
		esp++;
	}
	kprintf("\n");
}
/*****************************************************************************
*****************************************************************************/
#define BPERL		16	/* byte/line for dump */

void dump(unsigned char *data, unsigned count)
{
	unsigned char byte1, byte2;

	while(count != 0)
	{
		for(byte1 = 0; byte1 < BPERL; byte1++)
		{
			if(count == 0)
				break;
			kprintf("%02X ", data[byte1]);
			count--;
		}
		kprintf("\t");
		for(byte2 = 0; byte2 < byte1; byte2++)
		{
			if(data[byte2] < ' ')
				kprintf(".");
			else
				kprintf("%c", data[byte2]);
		}
		kprintf("\n");
		data += BPERL;
	}
}
/*****************************************************************************
*****************************************************************************/
void dump_regs(regs_t *regs)
{
	kprintf("EDI=%08X    ESI=%08X    EBP=%08X    ESP=%08X    EBX=%08X\n",
		regs->edi, regs->esi, regs->ebp, regs->esp, regs->ebx);
	kprintf("EDX=%08X    ECX=%08X    EAX=%08X     DS=%08X     ES=%08X\n",
		regs->edx, regs->ecx, regs->eax, regs->ds, regs->es);
	kprintf(" FS=%08X     GS=%08X intnum=%08X  error=%08X    EIP=%08X\n",
		regs->fs, regs->gs, regs->which_int, regs->err_code,
		regs->eip);
	kprintf(" CS=%08X EFLAGS=%08X   uESP=%08X    uSS=%08X\n",
		regs->cs, regs->eflags, regs->user_esp, regs->user_ss);
}
/*****************************************************************************
*****************************************************************************/
void dump_task(task_t *task)
{
	dump_regs((regs_t *)task->krnl_esp);
	kprintf("CR3=%08X        init kernel ESP=%08X             "
		"kernel ESP=%08X\n", task->page_dir,
		task->init_krnl_esp, task->krnl_esp);
}
/*****************************************************************************
*****************************************************************************/
void dump_page_tables(unsigned long *page_dir)
{
	unsigned long temp, *page_tab;
	unsigned long pde, pte;

	kprintf("page directory at 0x%8lX", page_dir);
/* show all pages */
	for(pde = 0; pde < 1024; pde++)
/* show only user pages */
//	for(pde = ADR2PDE(USER_BOT); pde < ADR2PDE(USER_TOP); pde++)
	{
		if(page_dir[pde] == 0)
			continue;
		temp = page_dir[pde];
/* show page directory entries in bright white */
		kprintf("\n""\x1B[1m""page dir[%4u]=0x%8lX""\x1B[0m",
			pde, temp);
		page_tab = (unsigned long *)(temp & -4096);
/* */
		if(pde < 256 || pde >= 768)
		{
			for(pte = 0; pte < 2; pte++)
			{
				if(page_tab[pte] == 0)
					continue;
				temp = page_tab[pte];
				kprintf("\n    page tab[%4u]=0x%8lX",
					pte, temp);
			}
			pte = 1023;
		}
		else
			pte = 0;
		for(; pte < 1024; pte++)
		{
			if(page_tab[pte] == 0)
				continue;
			temp = page_tab[pte];
			kprintf("\n    page tab[%4u]=0x%8lX", pte, temp);
		}
	}
	kprintf("\n\n");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -