Dear Peter Maydell, I am very appreciated for you great help. There is still a question exist:
Note that there are other slow paths for memory access which don't > use the TLB and instead do go via physical addresses at the time > they need to do the load/store. I want to know how to use these slow paths. Will they will "guest virtual -> guest physical -> host virtual" again and again when we execute load or store instructions. If so, I prefer to use them instead. It will help me to log the memory access. Any way, I want to thank you again. Best Regards, Jerry 2012/3/15 Peter Maydell <peter.mayd...@linaro.org> > 2012/3/15 周春华 <uuli...@gmail.com>: > > Do you means that the QEMU TLB maps the guest virtual address to host > > virtual address, > > Yes. > > > and the begging and end virtual addresses of the memory > > allocated for RAM device emulating are the RAM physical begging and end > > address from guest view? > > I don't know what you mean by this. RAM in qemu need not be > contiguous in guest physical address space, and it need not > be contiguous in host physical address space either. > > > If so, it seems hard to monitor the guest physical memory. > > Yes, that's what I said. > > > However, [exec.c:qemu_get_ram_ptr] seems to get a host virtual address > from > > a guest physical address. It confuses me. > > Obviously QEMU knows how to map between guest physical addresses > and host virtual addresses, or it wouldn't work. This function > is one very small part of a complicated subsystem which caches > the "guest virtual -> guest physical -> host virtual" lookups so > we don't need to do them again and again when we execute load or > store instructions. > > If you want to follow the code in more detail, when QEMU gets > a "TLB miss" (ie it doesn't know where the RAM for a guest virtual > address is) it calls target-arm/helper.c:cpu_arm_handle_mmu_fault(). > This calls get_phys_addr() to do a page table walk and convert the > guest virtual address to a guest physical address. Assuming that > succeeded, it calls exec.c:tlb_set_page(), passing the guest > virtual and guest physical addresses, to add a TLB entry. This > function calls memory_region_get_ram_ptr() which in turn calls > qemu_get_ram_ptr(), getting the host virtual address. We can then > cache the host virtual address for this guest virtual address in the > TLB entry. Later on when we actually execute a guest load or store > instruction we will pull the TLB entry out of the data structure and > use the host virtual address cached in it. tcg_out_qemu_ld/st > are the functions which generate the native code which gets the > TLB entry and loads via the cached host virtual address. > > Note that there are other slow paths for memory access which don't > use the TLB and instead do go via physical addresses at the time > they need to do the load/store. > > -- PMM > -- I love linux!!!
_______________________________________________ linaro-dev mailing list linaro-dev@lists.linaro.org http://lists.linaro.org/mailman/listinfo/linaro-dev