7.10在异常程序中打印信息
//D:\code\x86\code\start\start\source\kernel\cpu\irq.c
static void dump_core_regs (exception_frame_t * frame) {
// 打印CPU寄存器相关内容
log_printf("IRQ: %d, error code: %d.", frame->num, frame->error_code);
log_printf("CS: %d\nDS: %d\nES: %d\nSS: %d\nFS:%d\nGS:%d",
frame->cs, frame->ds, frame->es, frame->ds, frame->fs, frame->gs
);
log_printf("EAX:0x%x\n"
"EBX:0x%x\n"
"ECX:0x%x\n"
"EDX:0x%x\n"
"EDI:0x%x\n"
"ESI:0x%x\n"
"EBP:0x%x\n"
"ESP:0x%x\n",
frame->eax, frame->ebx, frame->ecx, frame->edx,
frame->edi, frame->esi, frame->ebp, frame->esp);
log_printf("EIP:0x%x\nEFLAGS:0x%x\n", frame->eip, frame->eflags);
}
static void do_default_handler (exception_frame_t * frame, const char * message) {
log_printf("--------------------------------");
log_printf("IRQ/Exception happend: %s.", message);
dump_core_regs(frame);
// todo: 留等以后补充打印任务栈的内容
log_printf("--------------------------------");
for (;;) {
hlt();
}
}
这样就可以把异常信息打印在串行接口
start qemu-system-i386 -m 128M -s -S -serial stdio -drive file=disk1.vhd,index=0,media=disk,format=raw -drive file=disk2.vhd,index=1,media=disk,format=raw -d pcall,page,mmu,cpu_reset,guest_errors,page,trace:ps2_keyboard_set_translation
-serial stdio
:将串行接口中的信息输出到控制台
start qemu-system-i386 -m 128M -s -S -serial stdio -drive file=disk1.vhd,index=0,media=disk,format=raw -drive file=disk2.vhd,index=1,media=disk,format=raw -d int,pcall,page,mmu,cpu_reset,guest_errors,page,trace:ps2_keyboard_set_translation
在-d后面加个int就可以通过qemu来打印中断信息
但是因为我们之前打开了定时器,这个方法不止打印异常,还打印中断