如何理解qemu“-d int”标志输出?

如何理解qemu“-d int”标志输出?

我可以在哪里找到文档或解释如何通过标志“-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

建立在@彼得·梅德尔的回答并查看qemu的代码, 在

     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 = 内核模式
IPPC是指令指针和程序计数器,即当前指令的地址
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)。

相关内容