今日は qemu-system-arm で Rasbian Linux を立ち上げて、それを gdb で追う方針で。
Hide [12:12 PM]
tlb_flush (cpu=0x555556877070) at /home/syster_clown/src/qemu-4.0.0/accel/tcg/cputlb.c:348
#1 0x0000555555a42604 in dacr_write (env=0x55555687f330, ri=0x55555689b260, value=81)
at /home/syster_clown/src/qemu-4.0.0/target/arm/helper.c:527
ってのがあったので、見てると memset で16kbyte clear するだけ。え〜なにそれ。
for (int work = cf; work ; work &= work - 1) ...
ってのがあったんですが、
0001001100001 work
0001001100000 work-1
0001001100000 &
0001001011111 -1
0001001000000 &
という3わけで、下から 1 のbit があるところを0にしていくループだそうです。
for (int work = 1; work < 0x10 ; work <<= - 1)
if ( cf & work ) {
...
でも良いんじゃないか説。
どうも、/dev/kvm を開けて、Linux kernel と連携するらしい。なので、
/dev/kvm の mmap に qemu の host 側のPTE を置くみたいな方式
らしい。今回はここまでだけど、Linux kernel の virt/kvm も読む必要があるみたい。
でも、そこは qemu/kvm がやってくれるので、cpu emulation では PTE 書いて tlb_flush すれば良いだけみたい。
VMの研究が流行ったのは2000年代でググるとBitVisorとかが引っかかって懐かしいです。
No comments:
Post a Comment