我可以在哪里找到文档或解释如何通过标志“-d ..”读取和理解 qemu 日志的输出。
例子
qemu-system-x86_64 -cdrom $(ISO_FILE) -serial stdio -m 1024 -d int
" 0: v=03 e=0000 i=1 cpl=0 IP=0008:ffff80000020904e pc=ffff80000020904e SP=0000:ffff800000206ff0 env->regs[R_EAX]=ffff800000209440
RAX=ffff800000209440 RBX=0000000000000800 RCX=0000000080002001 RDX=ffff800000209460
RSI=ffff800000208eeb RDI=ffff8000002096d0 RBP=ffff800000207000 RSP=ffff800000206ff0
R8 =0000000000000000 R9 =0000000000000000 R10=0000000000000000 R11=0000000000000000
R12=0000000000000000 R13=0000000000000000 R14=0000000000000000 R15=0000000000000000
RIP=ffff80000020904e RFL=00000006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0000 0000000000000000 00000000 00000000
CS =0008 0000000000000000 00000000 00209800 DPL=0 CS64 [---]
SS =0000 0000000000000000 00000000 00000000
DS =0000 0000000000000000 00000000 00000000
FS =0000 0000000000000000 00000000 00000000
GS =0000 0000000000000000 00000000 00000000
LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
TR =0000 0000000000000000 0000ffff 00008b00 DPL=0 TSS64-busy
GDT= 0000000000201000 0000000f
IDT= ffff800000209460 00000fff
CR0=80000013 CR2=0000000000000000 CR3=0000000000202000 CR4=00000620
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=00000001ffff0000 CCD=00000000ffff8000 CCO=SARQ
EFER=0000000000000500
check_exception old: 0xffffffff new 0xe
1: v=0e e=0000 i=0 cpl=0 IP=0008:ffff80000020904e pc=ffff80000020904e SP=0000:ffff800000206ff0 CR2=0000000000201008
RAX=ffff800000209440 RBX=0000000000000800 RCX=0000000080002001 RDX=ffff800000209460
RSI=ffff800000208eeb RDI=ffff8000002096d0 RBP=ffff800000207000 RSP=ffff800000206ff0
R8 =0000000000000000 R9 =0000000000000000 R10=0000000000000000 R11=0000000000000000
R12=0000000000000000 R13=0000000000000000 R14=0000000000000000 R15=0000000000000000
RIP=ffff80000020904e RFL=00000006 [-----P-] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =0000 0000000000000000 00000000 00000000
CS =0008 0000000000000000 00000000 00209800 DPL=0 CS64 [---]
SS =0000 0000000000000000 00000000 00000000
DS =0000 0000000000000000 00000000 00000000
FS =0000 0000000000000000 00000000 00000000
GS =0000 0000000000000000 00000000 00000000
LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
TR =0000 0000000000000000 0000ffff 00008b00 DPL=0 TSS64-busy
GDT= 0000000000201000 0000000f
IDT= ffff800000209460 00000fff
CR0=80000013 CR2=0000000000201008 CR3=0000000000202000 CR4=00000620
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
CCS=00000001ffff0000 CCD=00000000ffff8000 CCO=SARQ
EFER=0000000000000500"
答案1
没有文档,因为“-d”选项标志主要用于调试 QEMU 本身(尽管它们可用于深入了解来宾二进制文件正在做什么)。它们记录看起来有用和容易记录的内容,解释它们需要对来宾架构的细节和 QEMU 本身的内部实现有一定的了解。
在这种情况下,您拥有的主要是访客寄存器转储,可能是在异常发生之前或之后。您需要浏览 QEMU 源代码以获取更多信息。如果您了解 x86 架构,大多数字段的含义应该很清楚。
答案2
0: v=03 e=0000 i=1 cpl=0 IP=0008:ffff80000020904e pc=ffff80000020904e SP=0000:ffff800000206ff0 env->regs[R_EAX]=ffff800000209440
0:
是到目前为止的中断计数
v
是中断vector
e
是关联的e
i
如果异常来自硬件或指令,则错误代码设置为 1 INT
,请参阅OSDev 门类型
cpl
是当前特权级,0 = 内核模式
IP
,PC
是指令指针和程序计数器,即当前指令的地址
SP
是堆栈指针
在你的例子中,
1: v=0e e=0000 i=0 cpl=0 IP=0008:ffff80000020904e pc=ffff80000020904e SP=0000:ffff800000206ff0 CR2=0000000000201008
对应于一个页面错误异常发生在 0xffff80000020904e。 CR2 保存有错误的地址。错误代码表明该页面不存在 ( e&1
)、不可写 ( e&2
) 且用户不可访问 ( e&4
)。