PC,类似于Bochs,采用Java语言编写。O’reilly的《Beautiful Architecture》一书中对其有详细介绍。

不仅可以用JPC来调试操作系统,还可以研究它的代码,学习如何将一个复杂的计算机硬件系统分解成一个个小模块,组装起来。

JPC的虚拟CPU指令执行原理类似于QEMU,QEMU里内置小型编译器,将目标代码编译编译为本地代码再执行,JPC也是的,内置JPC compiler,

将x86 machine code编译为动态的java字节码,在本地运行。

JPC最吸引我的地方就是提供了很好的操作系统调试功能,能够实时查看CPU寄存器及内存内容,比Bochs调试方便,如下图:

pic

有个地方需要注意下,为了提高解码效率,在decode二进制代码的时候,只有碰到跳转指令(jmp, jc等)才算decode完,即按代码块来decode,

而不是一行指令decode一次,这个也与QEMU类似。

所以在单步调试如下代码的时候,若此时CS:IP执行的是地址0x9E3E5处指令,JPC单步执行后下调指令地址就是0x9E3F8,而不是0x9E3E6

1
2
3


0009E3E5  50                push ax 0009E3E6  53                push bx 0009E3E7  31DB              xor bx,bx 0009E3E9  B40E              mov ah,0xe 0009E3EB  AC                lodsb 0009E3EC  3C00              cmp al,0x0 0009E3EE  EBF7              jmp short 0xe3F8

所以想实现真正意义上的“单步”执行,如下修改即可:

pic

还有,使用一段时间后,发现JPC还有些不足之处:

1
2
3
4
5
6
7
8
9


FPU不支持 


保护模式的陷阱门不支持 


虚拟网卡功能不完善